• 极兔快递 | 快递单号查询API


    本期讲解:极兔快递查询快递单号的方法。

    纯干货,强烈建议收藏/转发给技术人员和管理人员学习。

    提供源码,复制到你的项目上,就能快速完成快递鸟的极兔快递查询API接口。

    下面具体讲解实现过程:

    1.完成前期准备工作

    1.1,注册快递鸟账号

    1.2,apiKey(接口权限验证需要)

    1.3,完成实名认证

    2.API接口

    2.1,测试调用地址:http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json

    2.2,正式调用地址:http://api.kdniao.com/api/dist

    2.3,请求方式:POST

    2.4,编码格式(utf-8):application/x-www-form-urlencoded;charset=utf-8

    2.5,返回类型:JSON

    2.6,调试页面:http://kdniao.com/UserCenter/v2/SandBox/TrackQuery.aspx

    3.请求参数(Headers)

    参数名称

    类型

    说明

    必须要求

    RequestData

    String

    请求内容需进行URL(utf-8)编码,请求内容JSON格式,须和DataType一致

    必填

    EBusinessID

    String

    用户ID,查看用户ID和ApiKey

    必填

    RequestType

    String

    请求指令类型:1002

    必填

    DataSign

    String

    签名数据,(Body+ApiKey)进行MD5加密,再进行Base64编码,最后进行URL(utf-8)编码

    必填

    DataType

    String

    求、返回数据类型:2-json ,默认Json

    选填

    4.请求参数(Body)

    参数名称

    类型

    说明

    必须要求

    OrderCode

    String

    订单编号

    选填

    ShipperCode

    String

    快递公司编码,中通:ZTO

    必填

    LogisticCode

    String

    物流运单号

    必填

    5.返回参数(Return)

    参数名称

    类型

    说明

    必须要求

    EBusinessID

    String

    用户ID

    必填

    ShipperCode

    String

    快递公司编码

    必填

    LogisticCode

    String

    物流运单号

    选填

    Success

    String

    成功与否

    必填

    Reason

    String

    失败原因

    选填

    State

    String

    物流状态:2-在途中,3-签收,4-问题件

    必填

    Traces

    String

    时间

    AcceptTime

    String

    必填

    AcceptStation

    String

    描述

    选填

    Remark

    String

    备注

    必填

    6.请求完整报文(示例)

    1. RequestData=%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27JTSD%27%2c%27LogisticCode%27%3a%27jt0000052600488%27%7d&EBusinessID=1264783
    2. &RequestType=1002&DataSign=MTYyMDU4NWQ2NmU1ZDI2MDEzNGE5YmV
    3. lM2YxYzEzMTM%3d&DataType=2

    7.成功返回报文(示例)

    1. {
    2. "LogisticCode": "JT0000052600488",
    3. "ShipperCode": "JTSD",
    4. "Traces": [
    5. {
    6. "AcceptStation": "【芜湖市】【芜湖镜湖网点】的邓拥军 17855364213已取件",
    7. "AcceptTime": "2020-03-16 16:26:13"
    8. },
    9. {
    10. "AcceptStation": "【芜湖市】【芜湖镜湖网点】的邓拥军 17855364213已取件",
    11. "AcceptTime": "2020-03-16 16:41:33"
    12. },
    13. {
    14. "AcceptStation": "【芜湖市】【芜湖镜湖网点】已收件",
    15. "AcceptTime": "2020-03-16 17:39:21"
    16. },
    17. {
    18. "AcceptStation": "【芜湖市】快件离开【芜湖镜湖网点】已发往【芜湖转运中心】",
    19. "AcceptTime": "2020-03-16 17:40:27"
    20. },
    21. {
    22. "AcceptStation": "【芜湖市】快件到达【芜湖转运中心】",
    23. "AcceptTime": "2020-03-16 19:36:32"
    24. },
    25. {
    26. "AcceptStation": "【芜湖市】快件离开【芜湖转运中心】已发往【合肥转运中心】",
    27. "AcceptTime": "2020-03-16 20:47:03"
    28. },
    29. {
    30. "AcceptStation": "【合肥市】快件到达【合肥转运中心】",
    31. "AcceptTime": "2020-03-16 23:40:10"
    32. },
    33. {
    34. "AcceptStation": "【合肥市】快件离开【合肥转运中心】已发往【广州花都转运中心】",
    35. "AcceptTime": "2020-03-17 00:10:48"
    36. },
    37. {
    38. "AcceptStation": "【广州市】快件到达【广州花都转运中心】",
    39. "AcceptTime": "2020-03-17 20:45:00"
    40. },
    41. {
    42. "AcceptStation": "【广州市】快件离开【广州花都转运中心】已发往【深圳宝安转运中心】",
    43. "AcceptTime": "2020-03-18 00:17:55"
    44. },
    45. {
    46. "AcceptStation": "【深圳市】快件到达【深圳宝安转运中心】",
    47. "AcceptTime": "2020-03-18 03:00:17"
    48. },
    49. {
    50. "AcceptStation": "【深圳市】快件离开【深圳宝安转运中心】已发往【深圳福田网点】",
    51. "AcceptTime": "2020-03-18 04:44:39"
    52. },
    53. {
    54. "AcceptStation": "【深圳市】【深圳福田网点】的邹俊林 17679495647正在派件",
    55. "AcceptTime": "2020-03-18 08:10:09"
    56. },
    57. {
    58. "AcceptStation": "【深圳市】【深圳福田网点】的赵凯 15919817730正在派件",
    59. "AcceptTime": "2020-03-18 09:55:19"
    60. },
    61. {
    62. "AcceptStation": "【深圳市】快件已签收,签收人是【代收】,如有疑问请联系:15919817730,期待再次为您服务",
    63. "AcceptTime": "2020-03-18 14:53:54"
    64. }
    65. ],
    66. "State": "3",
    67. "EBusinessID": "1264783",
    68. "Success": true}

    8.失败返回报文(示例)

    1. {
    2. "LogisticCode": "JT0000052600488",
    3. "ShipperCode": "JTSD",
    4. "Traces": [],
    5. "State": "0",
    6. "EBusinessID": "1264783",
    7. "Reason": "业务错误[没有可用套餐]",
    8. "Success": false
    9. }

    9.无轨迹返回报文(示例)

    1. {
    2. "LogisticCode": "JT0000052600488",
    3. "ShipperCode": "JTSD",
    4. "Traces": [],
    5. "State": "0",
    6. "EBusinessID": "1264783",
    7. "Reason": "暂无轨迹信息",
    8. "Success": true
    9. }

    10.分步讲解(C#版本)

    10.1,请求数据包结构

    10.2,C#调用代码示例

    1. //电商ID
    2. string eEBusinessID = "test1617571";
    3. //电商加密私钥,快递鸟提供,注意保管,不要泄漏
    4. string appKey= "554343b2-7252-439b-b4eb-1af42c8f2175";
    5. //请求url
    6. string reqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json";
    7. //请求指令
    8. string reqType="1002";
    9. //2-json
    10. string dataType = "2";
    11. //字符编码采用UTF-8
    12. string charset = "UTF-8";
    13. //JSON字符串string
    14. string jsonStr =
    15. "{\"OrderCode\":\"\",\"ShipperCode\":\"JTSD\",\"LogisticCode\":\"JT0000052600488\"}" ;
    16. //把(jsonStr+APIKey)进行MD5加密
    17. string md5Str=MD5(jsonStr + apiKey, charset);
    18. //把md5Str 进行Base64编码
    19. string base64Str=base64(md5Str,charset);
    20. //进行URL编码 (utf-8)
    21. string datasign = HttpUtility.UrlEncode(base64Str, charset);
    22. //请求报文参数
    23. string postStr = "RequestType=reqType&EBusinessID= eEBusinessID&RequestData=jsonStr
    24. &DataSign= datasign&DataType=dataType";
    25. //通讯协议使用Http协议Post请求方式 返回轨迹数据
    26. string post = SendPost(reqURL, postStr);
    27. //获取到的post数据就是快递鸟返回的完整报文,接下来自己写一个解析json的方法就能获取到里面的字段信息。

    10.3,C#调用方法

    1. ///<summary>
    2. /// 字符串MD5加密
    3. ///</summary>
    4. ///<param name="str">要加密的字符串</param>
    5. ///<param name="charset">编码方式</param>
    6. ///<returns>密文</returns>
    7. private string MD5(string str, string charset)
    8. {
    9. byte[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);
    10. try
    11. {
    12. System.Security.Cryptography.MD5CryptoServiceProvider check;
    13. check = new System.Security.Cryptography.MD5CryptoServiceProvider();
    14. byte[] somme = check.ComputeHash(buffer);
    15. string ret = "";
    16. foreach (byte a in somme)
    17. {
    18. if (a < 16)
    19. ret += "0" + a.ToString("X");
    20. else
    21. ret += a.ToString("X");
    22. }
    23. return ret.ToLower();
    24. }
    25. catch
    26. {
    27. throw;
    28. }
    29. }
    30. /// <summary>
    31. /// base64编码
    32. /// </summary>
    33. /// <param name="str">内容</param>
    34. /// <param name="charset">编码方式</param>
    35. /// <returns></returns>
    36. private string base64(String str, String charset)
    37. {
    38. return Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));}
    39. /// <summary>
    40. /// Post方式提交数据,返回网页的源代码
    41. /// </summary>
    42. /// <param name="url">发送请求的 URL</param>
    43. /// <param name="postData">请求报文参数</param>
    44. /// <returns>远程资源的响应结果</returns>
    45. private string SendPost(string url, string postData)
    46. {
    47. string result = "";
    48. byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(postData.ToString());
    49. try
    50. {
    51. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    52. request.ContentType = "application/x-www-form-urlencoded";
    53. request.Referer = url;
    54. request.Accept = "*/*";
    55. request.Timeout = 30 * 1000;
    56. request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET
    57. CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
    58. request.Method = "POST";
    59. request.ContentLength = byteData.Length;
    60. Stream stream = request.GetRequestStream();
    61. stream.Write(byteData, 0, byteData.Length);
    62. stream.Flush();
    63. stream.Close();
    64. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    65. Stream backStream = response.GetResponseStream();
    66. StreamReader sr = new StreamReader(backStream, Encoding.GetEncoding("UTF-8"));
    67. result = sr.ReadToEnd();
    68. sr.Close();
    69. backStream.Close();
    70. response.Close();
    71. request.Abort();
    72. }
    73. catch (Exception ex)
    74. {
    75. result = ex.ToString();
    76. }
    77. return result;
    78. }

    11.关于签名

    快递鸟和第三方电子商务公司系统进行对接,有一定的安全机制。采用 IP 认证加签名 的方式对接,具体方案如下:

    1. 防止数据被篡改
    2. 在 POST 请求中会传递 5 个必须(R)参数
    3. RequestData==数据内容(URL 编码:UTF-8) EBusinessID==用户 ID
    4. RequestType=请求指令类型
    5. DataSign== 数据内容签名:把(请求内容(未编码)+ApiKey)进行 MD5 加密,然后 Base64
    6. 编码,最后进行 URL(utf-8)编码
    7. DataType==2(返回数据类型为 json) 注:
    8. DataSign 生成后,对方接收到数据后,以同样的算法进行签名(推送接口 RequestType 为
    9. 101/102 不需要进行 URL 编码),生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生
    10. 数据篡改。
    11. 调用接口的身份认证
    12. 注册成为快递鸟用户后,会生成对应的用户 ID 和 APIKey,用户 ID 相当于用户名,
    13. APIKey 相当于密码。

    12.返回码定义

    编码

    说明

    100

    成功

    101

    缺少必要参数

    102

    校验问题

    103

    格式问题

    更多快递接口api技术干货、物流行业知识,关注我们的公众号【快递鸟API】(kuaidiniaoapi)。如果你觉得以上内容对你有用,欢迎点赞、评论、转发。你的认可是我持续分享的动力!

    有不清楚的问题,欢迎大家留言一起探讨。

  • 相关阅读:
    【已解决】spring-boot项目使用maven打包时出现BOOT-INF文件夹的问题
    昔日红极一时,如今重出江湖,这种按键位要怎么设计
    二十八、Java 包(package)
    C++学习第六课--string类型操作笔记
    python实现进度条的方法和实现代码
    ubuntu中安装cheat
    云原生技术 --- k8s工作负载之pod的学习与理解
    hadoop大数据原理与应用------初识Hadoop数据集
    UI Toolkit 计时器
    docker 部署vue
  • 原文地址:https://blog.csdn.net/KuaiDNiao/article/details/127653560