Error is thrown when trying to retrieve the status of a USPS order using the USPS Tracking API.
However, when running the code I built based on the USPS manual, I am getting the following error:
"80040B19XML Syntax Error: Please check the XML request to see if it can be parsed.USPSCOM::DoAuth"
Link to the manual: https://www.usps.com/business/web-tools-apis/track-and-confirm-v1-3a.htm
Here is my code:
$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;
What am I doing wrong?
While I'm sure the original author resolved their issue by now, having come to this example and finding it didn't work I figured I would address the issues:
First thing to address is that PHP converts the tracking number into scientific notation if the tracking number is all numbers as in the example above (test tracking number I used was an all numeric string of 22 characters). So I encased the numbers in single quotes to treat it as a string instead of a number. This issue was only discovered after the next one was addressed.
for the $xml, the ID needs to be encased in double quotes. So the code should be:
$xml = rawurlencode("
<TrackRequest USERID='MYID'>
<TrackID ID=\"".$trackingNumber."\"></TrackID>
</TrackRequest>");
Making these two changes resolved the posters original issue. Hope this helps anyone who also stumbles here.
Just to make Mike B.'s answer even better, the code might be like this:
$xml = rawurlencode("<TrackRequest USERID='MYID'><TrackID ID='$trackingNumber'></TrackID></TrackRequest>");
For getting details from XML
content, in PHP
rather than using curl
you can use simplexml_load_file
It will be like:
<?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;
?>