Ошибка при попытке получить статус заказа 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;
Что я делаю не так?
Хотя я уверен, что первоначальный автор решил их проблему к настоящему моменту, придя к этому примеру и обнаружив, что это не сработало, я решил, что буду решать проблемы:
Первое, на что нужно обратить внимание, заключается в том, что PHP преобразует номер отслеживания в научную нотацию, если номер отслеживания – это все числа, как в приведенном выше примере (номер тестового трека, который я использовал, представлял собой всю числовую строку из 22 символов). Поэтому я заключил номера в одинарные кавычки, чтобы рассматривать их как строку, а не число. Эта проблема была обнаружена только после того, как был рассмотрен следующий вопрос.
для $ xml идентификатор должен быть заключен в двойные кавычки. Таким образом, код должен быть:
$xml = rawurlencode(" <TrackRequest USERID='MYID'> <TrackID ID=\"".$trackingNumber."\"></TrackID> </TrackRequest>");
Выполнение этих двух изменений разрешило оригинальную проблему с плакатами. Надеюсь, это поможет любому, кто тоже спотыкается здесь.
Чтобы сделать ответ Майка Б. еще лучше, код может выглядеть так:
$xml = rawurlencode("<TrackRequest USERID='MYID'><TrackID ID='$trackingNumber'></TrackID></TrackRequest>");
Для получения информации из 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; ?>