使用PHP获取USPS订单跟踪状态

时间:2014-01-30 17:34:29

标签: php api curl tracking usps

尝试使用USPS Tracking 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;

我做错了什么?

3 个答案:

答案 0 :(得分:11)

虽然我确信原作者现在已经解决了他们的问题,但是来到这个例子并发现它不起作用我想我会解决这些问题:

要解决的第一件事是,如果跟踪号码是上面示例中的所有数字,PHP会将跟踪号码转换为科学记数法(我使用的测试跟踪号码是22个字符的全数字字符串)。因此,我将数字用单引号括起来将其视为字符串而不是数字。这个问题只是在下一个问题得到解决后才被发现。

对于$ xml,ID需要用双引号括起来。所以代码应该是:

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

进行这两项修改解决了海报的原始问题。希望这可以帮助那些在这里偶然发现的人。

答案 1 :(得分:0)

为了让Mike B。答案更好,代码可能是这样的:

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

答案 2 :(得分:0)

要从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;
?>