2014-01-30 54 views
4

嘗試使用USPS跟蹤API檢索USPS訂單的狀態時會引發錯誤。使用PHP獲取USPS訂單跟蹤狀態

但是,運行我建基於美國郵政手動代碼的時候,我收到以下錯誤: 「80040B19XML語法錯誤:請檢查XML請求,看它是否能夠parsed.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; 

我在做什麼錯?

+0

您是否嘗試回顯$ xml的值以查看它是否是您認爲的值? – Orangepill

回答

9

雖然我敢肯定,原作者現在解決了他們的問題,已經來到了這個例子,發現它沒有工作,我想我會解決這些問題:

首先解決的是PHP轉換如果跟蹤號碼是所有數字(如上例)(我使用的測試跟蹤號碼是22個字符的所有數字字符串),則將跟蹤號碼轉換爲科學記數法。所以我把這些數字用單引號括起來,把它當作字符串而不是數字。這個問題只在下一個問題得到解決後才被發現。

對於$ xml,ID需要用雙引號括起來。所以代碼應該是:

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

使這兩個更改解決了海報原始問題。希望這有助於任何人也在這裏絆倒。

+0

這是非常有用的,謝謝你的貢獻 – breuklyner

+0

真棒,@Mike B.,你是那種需要... ...願意回答一年後,以確保它在記錄。這枚獎牌在哪裏?大拇指 – Cyprus106

0

只是爲了讓麥克B.的回答更妙的是,代碼可能是這樣的:

$xml = rawurlencode("<TrackRequest USERID='MYID'><TrackID ID='$trackingNumber'></TrackID></TrackRequest>"); 
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; 
?>