快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序。目前比较常用的接口有快递鸟、快递100、快递网等。

应用场景

电商网站用户打开“我的订单”时调用此API显示物流信息详情;或者是电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题。

快递查询接口分类

物流轨迹查询接口有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据。

快递鸟即时接口可以查询3000次,3000以上接订阅接口,统一接口模式接入,常用快递均支持查询,还有订阅接口、在线下单接口、电子面单接口,接口均不收取费用,        没有要求用户添加外链,支持418家国内外快递物流查询。

快递100每天可以免费查询2000次,超过2000次收费,每次0.06~0.1元不等,如果查询的量大的话可以降低费用,免费的接口有几家常用快递不支持接口模式,只支持   htmlAPI,要求用户添加外链,支持300多家国内外快递物流查询。

快递网每天可以免费查询500次,超过500次收费,每次0.05元,只有即时查询和订阅推送接口,要求用户添加外链,支持395家国内外快递物流查询。

对接说明

不同公司的快递查询接口接入类似,都需要注册http://www.kdniao.com/ServiceApply.aspx ,申请账号获取KEY和ID,如果是订阅接口需要技术联调。以快递鸟及时查询接口接入为例。

根据快递单号和快递公司编码查询物流轨迹信息。接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。如:EMS物流单号应选择快递公司编码(EMS)查看快递公司编码返回的物流跟踪信息按照发生的时间升序排列。

接口支持的消息接收方式为HTTP POST

请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"

API地址:http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx

请求系统级参数

参数名称 类型 说明 必须要求
RequestData String 请求内容需进行URL(utf-8)编码。请求内容JSON或XML格式,须和DataType一致。 R
EBusinessID String 商户ID,请在我的服务页面查看。 R
RequestType String 请求指令类型:1002 R
DataSign String 数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后进行URL(utf-8)编码。详细过程请查看Demo。 R
DataType String 请求、返回数据类型:1-xml,2-json;默认为xml格式 O

请求内容字段定义

参数 类型 说明 必须要求
OrderCode String 订单编号 O
ShipperCode String 快递公司编码 R
LogisticCode String 物流单号 R

返回参数定义

参数名称 类型 说明 必须要求
EBusinessID String 用户ID R
OrderCode String 订单编号 O
ShipperCode String 快递公司编码 R
LogisticCode String 物流运单号 R
Success Bool 成功与否 R
Reason String 失败原因 O
State String 物流状态:2-在途中,3-签收,4-问题件 R
Traces
Trace AcceptTime String 时间 R
AcceptStation String 描述 R
Remark String 备注 O

Java调用示例

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import
  5. java.io.OutputStreamWriter;
  6. import
  7. java.io.UnsupportedEncodingExcept
  8. ion;
  9. import
  10. java.net.HttpURLConnection;
  11. import java.net.URL;
  12. import java.net.URLEncoder;
  13. import
  14. java.security.MessageDigest;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. /**
  18. *
  19. * 快递鸟物流轨迹即时查询接口
  20. *
  21. * @技术QQ群: 456320272
  22. * @see:
  23. http://www.kdniao.com/YundanChaxu
  24. nAPI.aspx
  25. * @copyright: 深圳市快金数据技术
  26. 服务有限公司
  27. *
  28. * DEMO中的电商ID与私钥仅限测试使
  29. 用,正式环境请单独注册账号
  30. * 单日超过500单查询量,建议接入
  31. 我方物流轨迹订阅推送接口
  32. *
  33. * ID和Key请到官网申请:
  34. http://www.kdniao.com/ServiceAppl
  35. y.aspx
  36. */
  37. public class KdniaoTrackQueryAPI
  38. {
  39. //DEMO
  40. public static void main
  41. (String[] args) {
  42. KdniaoTrackQueryAPI api = new
  43. KdniaoTrackQueryAPI();
  44. try {
  45. String
  46. result =
  47. api.getOrderTracesByJson("ANE",
  48. "210001633605");
  49. System.out.print(result);
  50. } catch
  51. (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. //电商ID
  56. private String
  57. EBusinessID="请到快递鸟官网申请
  58. http://www.kdniao.com/ServiceAppl
  59. y.aspx";
  60. //电商加密私钥,快递鸟提
  61. 供,注意保管,不要泄漏
  62. private String AppKey="请
  63. 到快递鸟官网申请
  64. http://www.kdniao.com/ServiceAppl
  65. y.aspx";
  66. //请求url
  67. private String
  68. ReqURL="http://api.kdniao.cc/Ebus
  69. iness/EbusinessOrderHandle.aspx";
  70. /**
  71. * Json方式 查询订单物流轨迹
  72. * @throws Exception
  73. */
  74. public String
  75. getOrderTracesByJson(String
  76. expCode, String expNo) throws
  77. Exception{
  78. String
  79. requestData=
  80. "{'OrderCode':'','ShipperCode':'"
  81. + expCode + "','LogisticCode':'"
  82. + expNo + "'}";
  83. Map<String,
  84. String> params = new
  85. HashMap<String, String>();
  86. params.put
  87. ("RequestData", urlEncoder
  88. (requestData, "UTF-8"));
  89. params.put
  90. ("EBusinessID", EBusinessID);
  91. params.put
  92. ("RequestType", "1002");
  93. String
  94. dataSign=encrypt(requestData,
  95. AppKey, "UTF-8");
  96. params.put
  97. ("DataSign", urlEncoder(dataSign,
  98. "UTF-8"));
  99. params.put
  100. ("DataType", "2");
  101. String
  102. result=sendPost(ReqURL, params);
  103. //根据公司业务处
  104. 理返回的信息......
  105. return result;
  106. }
  107. /**
  108. * XML方式 查询订单物流轨迹
  109. * @throws Exception
  110. */
  111. public String
  112. getOrderTracesByXml() throws
  113. Exception{
  114. String
  115. requestData= "<?xml version=
  116. \"1.0\" encoding=\"utf-8\" ?>"+
  117. "<Content>"+
  118. "<OrderCode></OrderCode>"+
  119. "<ShipperCode>SF</ShipperCode>"+
  120. "<LogisticCode>589707398027</Logi
  121. sticCode>"+
  122. "</Content>";
  123. Map<String,
  124. String> params = new
  125. HashMap<String, String>();
  126. params.put
  127. ("RequestData", urlEncoder
  128. (requestData, "UTF-8"));
  129. params.put
  130. ("EBusinessID", EBusinessID);
  131. params.put
  132. ("RequestType", "1002");
  133. String
  134. dataSign=encrypt(requestData,
  135. AppKey, "UTF-8");
  136. params.put
  137. ("DataSign", urlEncoder(dataSign,
  138. "UTF-8"));
  139. params.put
  140. ("DataType", "1");
  141. String
  142. result=sendPost(ReqURL, params);
  143. //根据公司业务处
  144. 理返回的信息......
  145. return result;
  146. }
  147. /**
  148. * MD5加密
  149. * @param str 内容
  150. * @param charset 编码方式
  151. * @throws Exception
  152. */
  153. @SuppressWarnings
  154. ("unused")
  155. private String MD5(String
  156. str, String charset) throws
  157. Exception {
  158. MessageDigest md =
  159. MessageDigest.getInstance("MD5");
  160. md.update
  161. (str.getBytes(charset));
  162. byte[] result =
  163. md.digest();
  164. StringBuffer sb = new
  165. StringBuffer(32);
  166. for (int i = 0; i <
  167. result.length; i++) {
  168. int val = result
  169. [i] & 0xff;
  170. if (val <= 0xf) {
  171. sb.append
  172. ("0");
  173. }
  174. sb.append
  175. (Integer.toHexString(val));
  176. }
  177. return sb.toString
  178. ().toLowerCase();
  179. }
  180. /**
  181. * base64编码
  182. * @param str 内容
  183. * @param charset 编码方式
  184. * @throws
  185. UnsupportedEncodingException
  186. */
  187. private String base64
  188. (String str, String charset)
  189. throws
  190. UnsupportedEncodingException{
  191. String encoded =
  192. base64Encode(str.getBytes
  193. (charset));
  194. return encoded;
  195. }
  196. @SuppressWarnings
  197. ("unused")
  198. private String
  199. urlEncoder(String str, String
  200. charset) throws
  201. UnsupportedEncodingException{
  202. String result =
  203. URLEncoder.encode(str, charset);
  204. return result;
  205. }
  206. /**
  207. * 电商Sign签名生成
  208. * @param content 内容
  209. * @param keyValue Appkey
  210. * @param charset 编码方式
  211. * @throws
  212. UnsupportedEncodingException
  213. ,Exception
  214. * @return DataSign签名
  215. */
  216. @SuppressWarnings
  217. ("unused")
  218. private String encrypt
  219. (String content, String keyValue,
  220. String charset) throws
  221. UnsupportedEncodingException,
  222. Exception
  223. {
  224. if (keyValue !=
  225. null)
  226. {
  227. return
  228. base64(MD5(content + keyValue,
  229. charset), charset);
  230. }
  231. return base64
  232. (MD5(content, charset), charset);
  233. }
  234. /**
  235. * 向指定 URL 发送POST方法的
  236. 请求
  237. * @param url 发送请求的 URL
  238. * @param params 请求的参数集
  239. * @return 远程资源的响应结果
  240. */
  241. @SuppressWarnings
  242. ("unused")
  243. private String sendPost
  244. (String url, Map<String, String>
  245. params) {
  246. OutputStreamWriter out =
  247. null;
  248. BufferedReader in = null;
  249. StringBuilder result =
  250. new StringBuilder();
  251. try {
  252. URL realUrl = new
  253. URL(url);
  254. HttpURLConnection
  255. conn =(HttpURLConnection)
  256. realUrl.openConnection();
  257. // 发送POST请求必须设
  258. 置如下两行
  259. conn.setDoOutput
  260. (true);
  261. conn.setDoInput
  262. (true);
  263. // POST方法
  264. conn.setRequestMethod("POST");
  265. // 设置通用的请求属性
  266. conn.setRequestProperty("accept",
  267. "*/*");
  268. conn.setRequestProperty
  269. ("connection", "Keep-Alive");
  270. conn.setRequestProperty("user-
  271. agent",
  272. "Mozilla/4.0
  273. (compatible; MSIE 6.0; Windows NT
  274. 5.1;SV1)");
  275. conn.setRequestProperty
  276. ("Content-Type", "application/x-
  277. www-form-urlencoded");
  278. conn.connect();
  279. // 获取URLConnection
  280. 对象对应的输出流
  281. out = new
  282. OutputStreamWriter
  283. (conn.getOutputStream(), "UTF-
  284. 8");
  285. // 发送请求参数
  286. if (params != null) {
  287. StringBuilder param = new
  288. StringBuilder();
  289. for
  290. (Map.Entry<String, String> entry
  291. : params.entrySet()) {
  292. if(param.length()>0){
  293. param.append("&");
  294. }
  295. param.append(entry.getKey());
  296. param.append("=");
  297. param.append(entry.getValue());
  298. //System.out.println
  299. (entry.getKey
  300. ()+":"+entry.getValue());
  301. }
  302. //System.out.println
  303. ("param:"+param.toString());
  304. out.write(param.toString());
  305. }
  306. // flush输出流的缓冲
  307. out.flush();
  308. // 定义BufferedReader
  309. 输入流来读取URL的响应
  310. in = new
  311. BufferedReader(
  312. new
  313. InputStreamReader
  314. (conn.getInputStream(), "UTF-
  315. 8"));
  316. String line;
  317. while ((line =
  318. in.readLine()) != null) {
  319. result.append
  320. (line);
  321. }
  322. } catch (Exception e) {
  323. e.printStackTrace();
  324. }
  325. //使用finally块来关闭输出
  326. 流、输入流
  327. finally{
  328. try{
  329. if(out!=null){
  330. out.close();
  331. }
  332. if(in!=null){
  333. in.close();
  334. }
  335. }
  336. catch(IOException
  337. ex){
  338. ex.printStackTrace();
  339. }
  340. }
  341. return result.toString();
  342. }
  343. private static char[]
  344. base64EncodeChars = new char[] {
  345. 'A', 'B', 'C', 'D', 'E',
  346. 'F', 'G', 'H',
  347. 'I', 'J', 'K', 'L', 'M',
  348. 'N', 'O', 'P',
  349. 'Q', 'R', 'S', 'T', 'U',
  350. 'V', 'W', 'X',
  351. 'Y', 'Z', 'a', 'b', 'c',
  352. 'd', 'e', 'f',
  353. 'g', 'h', 'i', 'j', 'k',
  354. 'l', 'm', 'n',
  355. 'o', 'p', 'q', 'r', 's',
  356. 't', 'u', 'v',
  357. 'w', 'x', 'y', 'z', '0',
  358. '1', '2', '3',
  359. '4', '5', '6', '7', '8',
  360. '9', '+', '/' };
  361. public static String
  362. base64Encode(byte[] data) {
  363. StringBuffer sb = new
  364. StringBuffer();
  365. int len = data.length;
  366. int i = 0;
  367. int b1, b2, b3;
  368. while (i < len) {
  369. b1 = data[i++] &
  370. 0xff;
  371. if (i == len)
  372. {
  373. sb.append
  374. (base64EncodeChars[b1 >>> 2]);
  375. sb.append
  376. (base64EncodeChars[(b1 & 0x3) <<
  377. 4]);
  378. sb.append("==");
  379. break;
  380. }
  381. b2 = data[i++] &
  382. 0xff;
  383. if (i == len)
  384. {
  385. sb.append
  386. (base64EncodeChars[b1 >>> 2]);
  387. sb.append
  388. (base64EncodeChars[((b1 & 0x03)
  389. << 4) | ((b2 & 0xf0) >>> 4)]);
  390. sb.append
  391. (base64EncodeChars[(b2 & 0x0f) <<
  392. 2]);
  393. sb.append("=");
  394. break;
  395. }
  396. b3 = data[i++] &
  397. 0xff;
  398. sb.append
  399. (base64EncodeChars[b1 >>> 2]);
  400. sb.append
  401. (base64EncodeChars[((b1 & 0x03)
  402. << 4) | ((b2 & 0xf0) >>> 4)]);
  403. sb.append
  404. (base64EncodeChars[((b2 & 0x0f)
  405. << 2) | ((b3 & 0xc0) >>> 6)]);
  406. sb.append
  407. (base64EncodeChars[b3 & 0x3f]);
  408. }
  409. return sb.toString();
  410. }
  411. }

转载于:https://www.cnblogs.com/dzcWeb/p/9661596.html

快递物流查询接口介绍相关推荐

  1. 快递物流查询接口查询类API接口介绍_快递鸟

    快递物流查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序.目前比较常用的接口有快递鸟.菜鸟.快递100等. 1.应用 ...

  2. 火山PC抓取快递物流查询接口教程第一课

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第一课 一.准备工作 工具:精易编程助手,易语言绝佳伙伴,同样适用于火山 下载地址: http://s ...

  3. 火山PC抓取快递物流查询接口教程第三课

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第三课 一.本课目标 本节以网页公开快递查询网站(http://www.kuaidi.com)进行教学 ...

  4. 火山PC抓取快递物流查询接口教程第二课

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第二课 一.本课目标 本节以网页公开快递查询网站(http://www.kuaidi.com)进行教学 ...

  5. 火山PC抓取快递物流查询接口教程第四课

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第四课 一.需要调用的模块 视窗基本类 MFC界面基本类 MFC界面扩展类库1 火山模块 二.火山项目 ...

  6. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...

    随着网购的发展,快递业也随之壮大.快递查询接口对接的需求量也越来越大,下面是对免费快递接口做的整理,并附上调用流程,分享给大家. 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的 ...

  7. Java快递物流查询接口,怎么接入物流接口API,如何根据单号查询物流跟踪的详细信息的Demo详细说明。

    Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 1. 需求 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 2. demo实 ...

  8. 常用快递物流查询接口对接案例

    目前有多家公司提供集成的快递查询接口,菜鸟.快递鸟等,对接方法大同小异.有免费和收费的接口,以下是快递鸟收费不限量的接口.这个接口是实现原则是先订阅快递单号,有新的物流轨迹更新就推送到订阅方. 对接前 ...

  9. 快递物流查询接口API,使用Jquery的ajax跨域实现根据单号查询物流跟踪的详细信息

    应用场景:物流跟踪信息查询 1. 本接口采用的是聚合数据接口:https://www.juhe.cn/docs/api/id/43 2. 首先,注册账号申请快递单号接口:获取申请的key 3. 接口所 ...

最新文章

  1. Python教学课程分享9-面向对象编程
  2. Scikit中的特征选择,XGboost进行回归预测,模型优化的实战
  3. 收集国内著名互联网公司前端/UED部门的blog,方便学习交流
  4. 算法导论-MIT笔记
  5. 2011年影响3G手机发展四大因素
  6. 词云图 - WorldCloud - Python代码实现
  7. mysql计算订单总金额_mysql统计当天消费总额
  8. 5G基站功耗,到底有多大?
  9. Keras-11 GAN MNIST
  10. 欢迎使用CSDN-markdown编辑器--样例
  11. Android安全 Hook技术,Android下通过hook技术实现透明加解密保障数据安全
  12. 扑克洗牌java_java扑克牌洗牌发牌问题
  13. D3 二维图表的绘制系列(十七)树图
  14. 函数6:lambda 表达式
  15. 华为模拟器eNSP配置DHCP自动分配IP地址
  16. Km Kcat Kcat/Km
  17. 鲲鹏服务器gpu型号,GPU服务器服务
  18. 微信信息如何在服务器加密,微信 消息加解密说明
  19. 什么lol云顶之奕小助手小蜜蜂肝不完了?让万能的python来帮你
  20. 解决AD中PCB芯片引脚之间间距太小

热门文章

  1. bzoj 1572: [Usaco2009 Open]工作安排Job
  2. 清楚xcode缓存(老是忘记所有记下来方便以后查阅)
  3. ASP.NET自带机制不刷新页面
  4. Centos7系统创建Docker本地仓库
  5. textField textView输入限制
  6. ***测试之情报收集
  7. mysql+spring+mybatis实现数据库读写分离[代码配置] .
  8. Flow - JS静态类型检查工具
  9. jquery 二级导航
  10. 出来工作五年的经历总结(五年前,你在干嘛?)