Obtaining USPS orders tracking status with PHP

api, curl, php, tracking, usps

Solution

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.

Problem

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?

Original source