今天我們來聊如何利用快遞鳥提供的接口來查詢【申通快遞】的物流軌跡。
首先我們準備好需要用到的資源,
測試商戶ID:
test1617571
測試API key:
554343b2-7252-439b-b4eb-1af42c8f2175(此Key僅限測試環境使用)
API測試地址:
http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json
我以C#開發為例來講解,
如果還沒有註冊快遞鳥,或者還不知道如何獲取API Key,可以訪問這個騰訊視頻教程:
https://v.qq.com/x/page/z3068yfw0fl.html(註冊登陸獲取快遞鳥API Key)接下來,我們講解一下請求參數
接口參數,也叫業務參數,請求的業務接口不同,參數的字段,內容也不同,是跟著業務變化的,這裡我們實現的是即時查詢接口,請求指令類型:1002,快遞鳥官網要求必須傳遞快遞公司編碼和物流單號 ,圓通快遞的編碼是YTO
如要查看其他快遞公司的編碼,點擊此鏈接:
http://www.kdniao.com/documents
正如我前面的軌跡截圖,申通快遞的編碼是STO,物流單號是777007389359024
業務參數報文組合如下:
{'OrderCode':'','ShipperCode':'STO','LogisticCode':'777007389359024'}
請求的完整報文(URL編碼以後):
RequestData=%0d%0a++++++++++++%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27STO%27%2c%27LogisticCode%27%3a%27777007389359024%27%7d%0d%0a++++++++&EBusinessID=1617571&RequestType=1002&DataSign=N2I4ZGEzYjkwMzhkZWY0YmM5ZGYxOGNkYjU5MmI2ZTU%3d&DataType=2
RequestData=
{'OrderCode':'','ShipperCode':'STO','LogisticCode':'777007389359024'}
&EBusinessID=1617571&RequestType=1002&DataSign=N2I4ZGEzYjkwMzhkZWY0YmM5ZGYxOGNkYjU5MmI2ZTU=&DataType=2
返回的報文信息:
<code>{"LogisticCode"
:"777007389359024"
,"ShipperCode"
:"STO"
,"Traces"
: [ {"AcceptStation"
:"您的寶貝即將由申通快遞(江蘇省市場部三十七部)全程護航,攬件員(宏峰路)。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,希望能得到您的理解,詳情可諮詢當地網點"
,"AcceptTime"
:"2020-01-08 19:45:01"
}, {"AcceptStation"
:"快件已由【江蘇射陽公司】掃描發往【江蘇鹽城中轉部】,掃描員【孫霞】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-09 15:28:36"
}, {"AcceptStation"
:"快件已由【江蘇射陽公司】掃描發往【江蘇鹽城中轉部】,掃描員【射陽】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-09 17:59:53"
}, {"AcceptStation"
:"已到達-江蘇鹽城中轉部"
,"AcceptTime"
:"2020-01-09 19:57:22"
}, {"AcceptStation"
:"快件已由【江蘇鹽城中轉部】掃描發往【江蘇江陰航空部】,掃描員【陳建群】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-09 20:16:29"
}, {"AcceptStation"
:"已到達-江蘇江陰航空部"
,"AcceptTime"
:"2020-01-10 02:28:24"
}, {"AcceptStation"
:"快件已由【江蘇江陰航空部】掃描發往【廣東深圳轉運中心】,掃描員【張華臣】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-10 02:30:14"
}, {"AcceptStation"
:"已到達-廣東深圳轉運中心"
,"AcceptTime"
:"2020-01-11 00:48:28"
}, {"AcceptStation"
:"快件已由【廣東深圳轉運中心】掃描發往【廣東羅湖龍華橫林分部】,掃描員【深圳進港自動化中心】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-11 00:48:31"
}, {"AcceptStation"
:"快件已由【廣東深圳轉運中心】掃描發往【廣東羅湖龍華橫林分部】,掃描員【深圳進港自動化中心】。由於疫情防控和交通管制的影響,您的快件時效可能會受到影響,請您耐心等待,感謝理解"
,"AcceptTime"
:"2020-01-11 00:49:01"
}, {"AcceptStation"
:"已到達-廣東羅湖龍華橫林分部"
,"AcceptTime"
:"2020-01-11 08:06:34"
}, {"AcceptStation"
:"已到達-廣東羅湖龍華橫林分部"
,"AcceptTime"
:"2020-01-11 10:33:36"
}, {"AcceptStation"
:"疫情無情,人有情,申通小哥一直在堅守。您的快件即將由(廣東羅湖龍華橫林分部)的派件員(王忠明)送達,為確保廣大客戶寄遞安全,減少人員直接接觸,我們建議您在取件時做好安全防護"
,"AcceptTime"
:"2020-01-11 11:18:36"
}, {"AcceptStation"
:"快遞已被【豐巢智能櫃】深圳市龍華區鑫茂花園A區2棟1單元地下車庫負1層門口豐巢快遞櫃代收,請及時取件。有問題請聯繫13925214311"
,"AcceptTime"
:"2020-01-11 12:55:57"
}, {"AcceptStation"
:"已簽收,收件人憑客戶短信取件簽收"
,"AcceptTime"
:"2020-01-11 22:18:09"
} ],"State"
:"3"
,"EBusinessID"
:"1617571"
,"Success"
:true
}/<code>
<code>Cpublic
string
getOrderTracesByJson
(string
url,string
eBusinessID,string
appKey,string
requestData) { Dictionary<string
,string
> param =new
Dictionary<string
,string
>(); param.Add("RequestData"
, HttpUtility.UrlEncode(requestData, Encoding.UTF8)); param.Add("EBusinessID"
, eBusinessID); param.Add("RequestType"
,"1002"
);string
dataSign = encrypt(requestData, appKey,"UTF-8"
); param.Add("DataSign"
, HttpUtility.UrlEncode(dataSign, Encoding.UTF8)); param.Add("DataType"
,"2"
);string
result = sendPost(url, param);return
result; }private
string
sendPost
(string
url, Dictionary<string
,string
> param) {string
result =""
; StringBuilder postData =new
StringBuilder();if
(param !=null
&& param.Count >0
) {foreach
(var
pin
param) {if
(postData.Length >0
) { postData.Append("&"
); } postData.Append(p.Key); postData.Append("="
); postData.Append(p.Value); } }byte
[] byteData = Encoding.GetEncoding("UTF-8"
).GetBytes(postData.ToString());try
{ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType ="application/x-www-form-urlencoded"
; request.Referer = url; request.Accept ="*/*"
; request.Timeout =30
*1000
; request.UserAgent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
; request.Method ="POST"
; request.ContentLength = byteData.Length; Stream stream = request.GetRequestStream(); stream.Write(byteData,0
, byteData.Length); stream.Flush(); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream backStream = response.GetResponseStream(); StreamReader sr =new
StreamReader(backStream, Encoding.GetEncoding("UTF-8"
)); result = sr.ReadToEnd(); sr.Close(); backStream.Close(); response.Close(); request.Abort(); }catch
(Exception ex) { result = ex.Message; }return
result; }private
string
encrypt
(String content, String keyValue, String charset
) {if
(keyValue !=null
) {return
base64(MD5(content + keyValue, charset), charset); }return
base64(MD5(content, charset), charset); }private
string
MD5
(string
str,string
charset) {byte
[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);try
{ System.Security.Cryptography.MD5CryptoServiceProvider check; check =new
System.Security.Cryptography.MD5CryptoServiceProvider();byte
[] somme = check.ComputeHash(buffer);string
ret =""
;foreach
(byte
ain
somme) {if
(a16
) ret +="0"
+ a.ToString("X"
);else
ret += a.ToString("X"
); }return
ret.ToLower(); }catch
{throw
; } }private
string
base64
(String str, String charset
) {return
Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str)); }/<code>