Получение статуса отслеживания заказов USPS с помощью PHP

Возникает ошибка при попытке получить статус заказа USPS с помощью API отслеживания USPS.

Однако при запуске кода, который я создал на основе руководства USPS, я получаю следующую ошибку: «Ошибка синтаксиса 80040B19XML: проверьте XML-запрос, чтобы узнать, можно ли его проанализировать. USPSCOM::DoAuth "

Ссылка на руководство: https://www.usps.com/business/web-tools-apis/track-and-confirm-v1-3a.htm

Вот мой код:

$trackingNumber = 123456;
$url = "http://production.shippingapis.com/shippingAPI.dll";
$service = "TrackV2";
$xml = rawurlencode("
<TrackRequest USERID='MYID'>
    <TrackID ID=".$trackingNumber."></TrackID>
    </TrackRequest>");
$request = $url . "?API=" . $service . "&XML=" . $xml;
// send the POST values to USPS
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$request);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// parameters to post

$result = curl_exec($ch);
//var_dump($result);
curl_close($ch);

$response = new SimpleXMLElement($result);
//print_r($result);
$deliveryStatus = $response->TrackResponse->TrackInfo->Status;
echo $deliveryStatus;

Что я делаю неправильно?


person user2509541    schedule 30.01.2014    source источник
comment
Вы пытались повторить значение $xml, чтобы увидеть, действительно ли это то, что вы думаете?   -  person Orangepill    schedule 31.01.2014


Ответы (3)


Хотя я уверен, что первоначальный автор уже решил свою проблему, придя к этому примеру и обнаружив, что он не работает, я решил, что решу проблемы:

Первое, на что нужно обратить внимание, это то, что PHP преобразует номер отслеживания в экспоненциальное представление, если номер отслеживания представляет собой все числа, как в приведенном выше примере (тестовый номер отслеживания, который я использовал, представлял собой полностью числовую строку из 22 символов). Поэтому я заключил числа в одинарные кавычки, чтобы рассматривать их как строку, а не как число. Эта проблема была обнаружена только после того, как была решена следующая.

для $xml идентификатор должен быть заключен в двойные кавычки. Итак, код должен быть:

$xml = rawurlencode("
<TrackRequest USERID='MYID'>
    <TrackID ID=\"".$trackingNumber."\"></TrackID>
    </TrackRequest>");

Внесение этих двух изменений решило исходную проблему плакатов. Надеюсь, это поможет любому, кто также спотыкается здесь.

person Mike B.    schedule 11.11.2014
comment
Потрясающе, @Mike B., ты именно тот парень, который ТАК нужен... готов ответить год спустя, чтобы убедиться, что это будет в протоколе. Где медаль, ТАК?? Палец вверх - person Cyprus106; 08.01.2015

Для получения подробной информации из XML контента в PHP вместо использования curl вы можете использовать simplexml_load_file

Это будет так:

<?php
    $xml=simplexml_load_file('http://production.shippingapis.com/ShippingApi.dll?API=TrackV2&XML=<TrackFieldRequest USERID="MYID"><TrackID ID="'.$trackingNumber.'"></TrackID></TrackFieldRequest>') or die('Error: Cannot create object');
    echo $xml->TrackInfo->TrackSummary->Event."<br>";
    echo $xml->TrackInfo->TrackSummary->EventDate."<br>";
    echo $xml->TrackInfo->TrackSummary->EventTime;
?>
person Pradeep Kumar Prabaharan    schedule 23.06.2017

Просто чтобы сделать ответ Майка Б. еще лучше, код может быть таким:

$xml = rawurlencode("<TrackRequest USERID='MYID'><TrackID ID='$trackingNumber'></TrackID></TrackRequest>");
person alexey_gusev    schedule 28.02.2015