如何利用快递鸟提供的接口来查询京东快递的物流轨迹。
首先我们准备好需要用到的资源,
测试商户ID:
test1617571
测试API key:
554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用)
API测试地址:
http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json
接口参数,也叫业务参数,请求的业务接口不同,参数的字段,内容也不同,是跟着业务变化的,这里我们实现的是即时查询接口,请求指令类型:1002,快递鸟官网要求必须传递快递公司编码和物流单号 ,京东快递的编码是JD
如要查看其他快递公司的编码,点击此链接:
http://www.kdniao.com/documents
我们用真实单号(JDVC02975597147)来完成轨迹接口调用,
请求 JSON
{‘OrderCode’:’’,‘ShipperCode’:JD’,LogisticCode’:’ JDVC02975597147’}
请求的完整报文(URL编码以后):RequestData=%0d%0a++++++++++++%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27JD%27%2c%27LogisticCode%27%3a%27JDVC02975597147%27%2c%27CustomerName%27%3a%27%e5%95%86%e5%ae%b6%e7%bc%96%e7%a0%81%27%7d%0d%0a++&EBusinessID=1264783&RequestType=1002&DataSign=NTBlZDNiMDdlNDYxNDBjYjc1ZjFkNDA2YTgwNzM3OTc%3d&DataType=2
未编码的请求报文:
RequestData= {‘OrderCode’:’’,‘ShipperCode’:‘JD’,‘LogisticCode’:‘JDVC02975597147’,‘CustomerName’:‘商家编码’} & EBusinessID=1264783&RequestType=1002&DataSign=NTBlZDNiMDdlNDYxNDBjYjc1ZjFkNDA2YTgwNzM3OTc=&DataType=2
返回报文信息
{
"LogisticCode": "JDVC02975597147",
"ShipperCode": "JD",
"Traces": [{
"AcceptStation": "揽收任务已分配给刘杰添,配送员电话13902201195",
"AcceptTime": "2020-02-28 15:06:32"
}, {
"AcceptStation": "货物已交付京东物流",
"AcceptTime": "2020-02-28 19:01:17"
}, {
"AcceptStation": "配送员李连胜已经揽收完成",
"AcceptTime": "2020-02-28 19:01:17"
}, {
"AcceptStation": "货物已到达【广州黄埔分拣中心】",
"AcceptTime": "2020-02-28 23:14:54"
}, {
"AcceptStation": "货物已完成分拣,离开【广州黄埔分拣中心】",
"AcceptTime": "2020-02-28 23:31:53"
}, {
"AcceptStation": "货物已完成分拣,离开【佛山狮山分拣中心】",
"AcceptTime": "2020-02-29 02:53:29"
}, {
"AcceptStation": "配送员开始配送,请您准备收货,配送员,赵罗灿,手机号,18818484932",
"AcceptTime": "2020-02-29 11:40:35"
}, {
"AcceptStation": "货物已分配,等待配送",
"AcceptTime": "2020-02-29 12:08:59"
}, {
"AcceptStation": "货物已由【岗坪镇加油站正对面京东家电店内】代收,感谢您选择京东物流!",
"AcceptTime": "2020-02-29 17:49:51"
}],
"State": "3",
"EBusinessID": "1264783",
"Success": true
}
//电商ID
string eEBusinessID = "test1617571";
//电商加密私钥,快递鸟提供,注意保管,不要泄漏
string appKey= "554343b2-7252-439b-b4eb-1af42c8f2175";
//请求url
string reqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json";
//请求指令
string reqType="1002";
//2-json
string dataType = "2";
//字符编码采用UTF-8
string charset = "UTF-8";
//JSON字符串string
string jsonStr =
"{\"OrderCode\":\"\",\"ShipperCode\":\"JTSD\",\"LogisticCode\":\"JT0000052600488\"}" ;
//把(jsonStr+APIKey)进行MD5加密
string md5Str=MD5(jsonStr + apiKey, charset);
//把md5Str 进行Base64编码
string base64Str=base64(md5Str,charset);
//进行URL编码 (utf-8)
string datasign = HttpUtility.UrlEncode(base64Str, charset);
//请求报文参数
string postStr = "RequestType=reqType&EBusinessID= eEBusinessID&RequestData=jsonStr
&DataSign= datasign&DataType=dataType";
//通讯协议使用Http协议Post请求方式 返回轨迹数据
string post = SendPost(reqURL, postStr);
//获取到的post数据就是快递鸟返回的完整报文,接下来自己写一个解析json的方法就能获取到里面的字段信息。
10.3,C#调用方法
///<summary>
/// 字符串MD5加密
///</summary>
///<param name="str">要加密的字符串</param>
///<param name="charset">编码方式</param>
///<returns>密文</returns>
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 a in somme)
{
if (a < 16)
ret += "0" + a.ToString("X");
else
ret += a.ToString("X");
}
return ret.ToLower();
}
catch
{
throw;
}
}
/// <summary>
/// base64编码
/// </summary>
/// <param name="str">内容</param>
/// <param name="charset">编码方式</param>
/// <returns></returns>
private string base64(String str, String charset)
{
return Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));}
/// <summary>
/// Post方式提交数据,返回网页的源代码
/// </summary>
/// <param name="url">发送请求的 URL</param>
/// <param name="postData">请求报文参数</param>
/// <returns>远程资源的响应结果</returns>
private string SendPost(string url, string postData)
{
string result = "";
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.ToString();
}
return result;
}