Я пытаюсь интегрировать функциональность печати этикеток UPS в пользовательское приложение crm/shopping cart. Я формирую XML-документ, используя объект php stdClass. Я передаю методу массив, содержащий переменные пакета (ов) ex.Разбор XML с REGEX
$pkgs = Array ([1] => Array ([length] => 6 [width] => 8 [height] => 11 [weight] => 5) [2] => Array ([length] => 5 [width] => 14 [height] => 10 [weight] => 9))
Мой XML метод строительства выглядит следующим образом
public function assemble_xml($pkgs){
$xmlRequest = new stdClass();
$xmlRequest->header="<?xml version='1.0'?>
<AccessRequest xml:lang='en-US'>
<AccessLicenseNumber>HIDDEN</AccessLicenseNumber>
<UserId>HIDDEN</UserId>
<Password>HIDDEN</Password>
</AccessRequest>
<?xml version='1.0'?>
<ShipmentConfirmRequest xml:lang='en-US'>
<Request>
<TransactionReference>
<CustomerContext>Customer Comment</CustomerContext>
<XpciVersion/>
</TransactionReference>
<RequestAction>ShipConfirm</RequestAction>
<RequestOption>validate</RequestOption>
</Request>
<LabelSpecification>
<LabelPrintMethod>
<Code>GIF</Code>
<Description>gif file</Description>
</LabelPrintMethod>
<HTTPUserAgent>Mozilla/4.5</HTTPUserAgent>
<LabelImageFormat>
<Code>GIF</Code>
<Description>gif</Description>
</LabelImageFormat>
</LabelSpecification>
<Shipment>
<RateInformation>
<NegotiatedRatesIndicator/>
</RateInformation>
<Description/>
<Shipper>
<Name>HIDDEN</Name>
<PhoneNumber>HIDDEN</PhoneNumber>
<ShipperNumber>HIDDEN</ShipperNumber>
<TaxIdentificationNumber>HIDDEN</TaxIdentificationNumber>
<Address>
<AddressLine1>HIDDEN</AddressLine1>
<City>HIDDEN</City>
<StateProvinceCode>HIDDEN</StateProvinceCode>
<PostalCode>HIDDEN</PostalCode>
<PostcodeExtendedLow></PostcodeExtendedLow>
<CountryCode>HIDDEN</CountryCode>
</Address>
</Shipper>";
$xmlRequest->shipto="<ShipTo>
<CompanyName>HIDDEN</CompanyName>
<AttentionName>HIDDEN</AttentionName>
<PhoneNumber></PhoneNumber>
<Address>
<AddressLine1>HIDDEN</AddressLine1>
<City>HIDDEN</City>
<StateProvinceCode>HIDDEN</StateProvinceCode>
<PostalCode>HIDDEN</PostalCode>
<CountryCode>HIDDEN</CountryCode>
</Address>
</ShipTo>";
$xmlRequest->shipper="<ShipFrom>
<CompanyName>HIDDEN</CompanyName>
<AttentionName></AttentionName>
<PhoneNumber>HIDDEN</PhoneNumber>
<TaxIdentificationNumber>HIDDEN</TaxIdentificationNumber>
<Address>
<AddressLine1>HIDDEN</AddressLine1>
<City>HIDDEN</City>
<StateProvinceCode>HIDDEN</StateProvinceCode>
<PostalCode>HIDDEN</PostalCode>
<CountryCode>HIDDEN</CountryCode>
</Address>
</ShipFrom>";
$xmlRequest->payment="<PaymentInformation>
<Prepaid>
<BillShipper>
<AccountNumber>HIDDEN</AccountNumber>
</BillShipper>
</Prepaid>
</PaymentInformation>";
$xmlRequest->service="<Service>
<Code>03</Code>
<Description>Ground</Description>
</Service>";
for($i = 1; $i <= count($pkgs); $i++) {
$xmlRequest->$i ="<Package>
<PackagingType>
<Code>02</Code>
<Description>Customer Supplied</Description>
</PackagingType>
<Description>Package</Description>
<ReferenceNumber>
<Code></Code>
<Value></Value>
</ReferenceNumber>
<Dimensions>
<UnitOfMeasurement>
<Code>IN</Code>
</UnitOfMeasurement>
<Length>22</Length>
<Width>20</Width>
<Height>18</Height>
</Dimensions>
<PackageWeight>
<Weight>14.1</Weight>
</PackageWeight>
<AdditionalHandling>0</AdditionalHandling>
</Package>";
}
$xmlRequest->footer="</Shipment>
</ShipmentConfirmRequest>";
return $xmlRequest;
Прохладный, который работает. Теперь я передаю это через несколько других функций, чтобы получить мой дайджест.
public function ups_send($assemble_xml){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://wwwcie.ups.com/ups.app/xml/ShipConfirm");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $assemble_xml);
curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
$xmlResponse = curl_exec ($ch);
return $xmlResponse;
public function get_confirm_response($xmlResponse){
preg_match_all("/\<ShipmentConfirmResponse\>(.*?)\<\/ShipmentConfirmResponse\>/s",
$xmlResponse, $bookblocks);
foreach($bookblocks[1] as $block)
{
preg_match_all("/\<ShipmentDigest\>(.*?)\<\/ShipmentDigest\>/",
$block, $author); // SHIPPING DIGEST
$digest = $author[1][0];
$this->decode_label($digest);
}
}
public function decode_label($digest){
$xmlRequest1="<?xml version='1.0' encoding='ISO-8859-1'?>
<AccessRequest>
<AccessLicenseNumber>HIDDEN</AccessLicenseNumber>
<UserId>HIDDEN</UserId>
<Password>HIDDEN</Password>
</AccessRequest>
<?xml version=”1.0? encoding=”ISO-8859-1??>
<ShipmentAcceptRequest>
<Request>
<TransactionReference>
<CustomerContext>Customer Comment</CustomerContext>
</TransactionReference>
<RequestAction>ShipAccept</RequestAction>
<RequestOption>1</RequestOption>
</Request>
<ShipmentDigest>$digest</ShipmentDigest>
</ShipmentAcceptRequest>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://wwwcie.ups.com/ups.app/xml/ShipAccept");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
$xmlResponse = curl_exec ($ch); // SHIP ACCEPT RESPONSE
$xml = $xmlResponse;
preg_match_all("/\<ShipmentAcceptResponse\>(.*?)\<\/ShipmentAcceptResponse\>/s",
$xml, $bookblocks);
foreach($bookblocks[1] as $block)
{
preg_match_all("/\<GraphicImage\>(.*?)\<\/GraphicImage\>/",
$block, $author); // GET LABEL
for($l=0; $l<=count($author[0])-1; $l++){
echo '<img src="data:image/gif;base64,'. $author[1][$l]. '"/>';
}
}
}
Это все работает с 1 или 2 этикетки, этикетки успешно декодируется на этикетке 1 2 и 2 из 2. НО, когда я пытаюсь сделать 3 или более меток я получаю успешный XML-ответ от ИБП, но Я не создаю ярлыков. Я несколько дней стучал головой о мой стол, и мог действительно использовать опыт SO, чтобы дать мне толчок в правильном направлении о том, что я делаю неправильно. Почему работает 1 или 2 ярлыка, но 3 или более нет? ЧТО ДАЕТ!
Если его регулярное выражение ошибочно, то почему оно работает, если запрошено только 2 метки?
Существует приписка вам может быть интересно.
Вот Pastebin ответа XML от ИБП, содержащие надписи.
вы пробовали разместить это в сообществе разработчиков ИБП, так как это может быть немного специфично для здесь? –
Нет, нет, я сделаю это. Основная причина, по которой я не делал этого, - это то, что я получаю успешный ответ от ИБП. Я просто не могу правильно разобрать его, если запрошу более трех ярлыков. Если я запрашиваю только 1 или 2 ярлыка, это работает как шарм. Я полагал, что это была какая-то проблема с программированием. Спасибо, что нашли время ответить, я действительно ценю это! – MDS
[Обязательная ссылка] (http://stackoverflow.com/a/1732454/2846923) для всех вопросов XML/[X] HTML-regex. –