概要:关于调用快递鸟API,我有几句话想说,有几行代码想写

业务需求:就是做做商城,卖卖东西。然后需要做个物流跟踪的功能

  需要获取的信息大概就是这个样子

现在看这个快递怎么这么慢

如何实现?

直接调用快递鸟API。

首先登陆快递鸟官网,浏览器搜索www.baidu.com,然后搜索关键字 快递鸟。(感谢百度对我的学习方面一直以来给予的帮助,谢谢)

然后注册一个官网的账号,认证自己的用户信息,记住自己的用户ID和API key,代码里调用接口时会使用到。我这里主要做个物流跟踪的功能,所以我需要调用的物流跟踪API,所以我需要先订阅这个API的服务。大家如果想调用别的接口就相应的去订阅就可以了。

然后在官网找到这里 点击下载相应语言的demo

直接使用demo里面的代码即可,只需要改变一下EBusinessID和AppKey的值

  1. @RestController
  2. @RequestMapping("/admin/logistics")
  3. @Validated
  4. @Api(description = "物流追踪接口")
  5. public class AdminKdniaoTrackQueryAPI {
  6.  
  7. //用户ID
  8. private String EBusinessID="用户ID";
  9. //电商加密私钥,快递鸟提供,注意保管,不要泄漏
  10. private String AppKey="API key";
  11. //请求url
  12. private String ReqURL="http://api.kdniao.com/api/dist";
  13.  
  14. @RequiresPermissions("admin:logistics:getOrderTracesByJson")
  15. //@RequiresPermissionsDesc(menu = {"物流管理", "物流追踪"}, button = "查询")
  16. @ApiOperation(value = "根据物流单号和快递公司编码查询物流信息", notes = "根据物流单号和快递公司编码查询物流信息", httpMethod = "GET")
  17. @ApiImplicitParams({
  18. @ApiImplicitParam(name = "shipChannel", value = "快递公司编码",dataType = "String"),
  19. @ApiImplicitParam(name = "shipSn", value = "物流单号", dataType = "String" )
  20. })
  21. @ResponseBody
  22. @GetMapping("/getOrderTracesByJson")
  23. public String getOrderTracesByJson(String shipChannel, String shipSn) throws Exception{
  24. String requestData= "{'OrderCode':'','ShipperCode':'" + shipChannel + "','LogisticCode':'" + shipSn + "'}";
  25.  
  26. Map<String, String> params = new HashMap<>();
  27. params.put("RequestData", urlEncoder(requestData, "UTF-8"));
  28. params.put("EBusinessID", EBusinessID);
  29. params.put("RequestType", "");
  30. String dataSign=encrypt(requestData, AppKey, "UTF-8");
  31. params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
  32. params.put("DataType", "");
  33.  
  34. String result=sendPost(ReqURL, params);
  35.  
  36. //根据公司业务处理返回的信息......
  37. return result;
  38. }
  39.  
  40. /**
  41. * MD5加密
  42. * @param str 内容
  43. * @param charset 编码方式
  44. * @throws Exception
  45. */
  46.  
  47. private String MD5(String str, String charset) throws Exception {
  48. MessageDigest md = MessageDigest.getInstance("MD5");
  49. md.update(str.getBytes(charset));
  50. byte[] result = md.digest();
  51. StringBuffer sb = new StringBuffer();
  52. for (int i = ; i < result.length; i++) {
  53. int val = result[i] & 0xff;
  54. if (val <= 0xf) {
  55. sb.append("");
  56. }
  57. sb.append(Integer.toHexString(val));
  58. }
  59. return sb.toString().toLowerCase();
  60. }
  61.  
  62. /**
  63. * base64编码
  64. * @param str 内容
  65. * @param charset 编码方式
  66. * @throws UnsupportedEncodingException
  67. */
  68. private String base64(String str, String charset) throws UnsupportedEncodingException {
  69. String encoded = base64Encode(str.getBytes(charset));
  70. return encoded;
  71. }
  72.  
  73. private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
  74. String result = URLEncoder.encode(str, charset);
  75. return result;
  76. }
  77.  
  78. /**
  79. * 电商Sign签名生成
  80. * @param content 内容
  81. * @param keyValue Appkey
  82. * @param charset 编码方式
  83. * @throws UnsupportedEncodingException ,Exception
  84. * @return DataSign签名
  85. */
  86.  
  87. private String encrypt (String content, String keyValue, String charset) throws Exception
  88. {
  89. if (keyValue != null)
  90. {
  91. return base64(MD5(content + keyValue, charset), charset);
  92. }
  93. return base64(MD5(content, charset), charset);
  94. }
  95.  
  96. /**
  97. * 向指定 URL 发送POST方法的请求
  98. * @param url 发送请求的 URL
  99. * @param params 请求的参数集合
  100. * @return 远程资源的响应结果
  101. */
  102.  
  103. private String sendPost(String url, Map<String, String> params) {
  104. OutputStreamWriter out = null;
  105. BufferedReader in = null;
  106. StringBuilder result = new StringBuilder();
  107. try {
  108. URL realUrl = new URL(url);
  109. HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
  110. // 发送POST请求必须设置如下两行
  111. conn.setDoOutput(true);
  112. conn.setDoInput(true);
  113. // POST方法
  114. conn.setRequestMethod("POST");
  115. // 设置通用的请求属性
  116. conn.setRequestProperty("accept", "*/*");
  117. conn.setRequestProperty("connection", "Keep-Alive");
  118. conn.setRequestProperty("user-agent",
  119. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  120. conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  121. conn.connect();
  122. // 获取URLConnection对象对应的输出流
  123. out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
  124. // 发送请求参数
  125. if (params != null) {
  126. StringBuilder param = new StringBuilder();
  127. for (Map.Entry<String, String> entry : params.entrySet()) {
  128. if(param.length()>){
  129. param.append("&");
  130. }
  131. param.append(entry.getKey());
  132. param.append("=");
  133. param.append(entry.getValue());
  134. //System.out.println(entry.getKey()+":"+entry.getValue());
  135. }
  136. //System.out.println("param:"+param.toString());
  137. out.write(param.toString());
  138. }
  139. // flush输出流的缓冲
  140. out.flush();
  141. // 定义BufferedReader输入流来读取URL的响应
  142. in = new BufferedReader(
  143. new InputStreamReader(conn.getInputStream(), "UTF-8"));
  144. String line;
  145. while ((line = in.readLine()) != null) {
  146. result.append(line);
  147. }
  148. } catch (Exception e) {
  149. e.printStackTrace();
  150. }
  151. //使用finally块来关闭输出流、输入流
  152. finally{
  153. try{
  154. if(out!=null){
  155. out.close();
  156. }
  157. if(in!=null){
  158. in.close();
  159. }
  160. }
  161. catch(IOException ex){
  162. ex.printStackTrace();
  163. }
  164. }
  165. return result.toString();
  166. }
  167.  
  168. private static char[] base64EncodeChars = new char[] {
  169. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  170. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  171. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  172. 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  173. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  174. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  175. 'w', 'x', 'y', 'z', '', '', '', '',
  176. '', '', '', '', '', '', '+', '/' };
  177.  
  178. public static String base64Encode(byte[] data) {
  179. StringBuffer sb = new StringBuffer();
  180. int len = data.length;
  181. int i = ;
  182. int b1, b2, b3;
  183. while (i < len) {
  184. b1 = data[i++] & 0xff;
  185. if (i == len)
  186. {
  187. sb.append(base64EncodeChars[b1 >>> ]);
  188. sb.append(base64EncodeChars[(b1 & 0x3) << ]);
  189. sb.append("==");
  190. break;
  191. }
  192. b2 = data[i++] & 0xff;
  193. if (i == len)
  194. {
  195. sb.append(base64EncodeChars[b1 >>> ]);
  196. sb.append(base64EncodeChars[((b1 & 0x03) << ) | ((b2 & 0xf0) >>> )]);
  197. sb.append(base64EncodeChars[(b2 & 0x0f) << ]);
  198. sb.append("=");
  199. break;
  200. }
  201. b3 = data[i++] & 0xff;
  202. sb.append(base64EncodeChars[b1 >>> ]);
  203. sb.append(base64EncodeChars[((b1 & 0x03) << ) | ((b2 & 0xf0) >>> )]);
  204. sb.append(base64EncodeChars[((b2 & 0x0f) << ) | ((b3 & 0xc0) >>> )]);
  205. sb.append(base64EncodeChars[b3 & 0x3f]);
  206. }
  207. return sb.toString();
  208. }
  209. }

这里提供一个快递鸟API的官方技术对接交流群:705144434

 

物流跟踪 调用快递鸟API的更多相关文章

  1. TP5 调用快递鸟api 查询快递信息

    1,去快递鸟,下载sdk https://www.kdniao.com/api-track 下载PHPsdk 2,下载下来的事PHP文件,不是以类的形式显示的,所以为了方便,我把他封装成了类,不需要封 ...

  2. 如何使用Postman快速简单的调用快递物流平台快递鸟API接口

    前沿 快递鸟是一家聚合类的第三方快递物流平台,目前该平台提供的产品主要以API为主.由于API不能直观的看到产品效果,需要进行API对接联调成功后才能真实的看到产品的实际效果.但是如果一上来就写代码进 ...

  3. 物流一站式单号查询之快递鸟API接口(附Demo源码)

    连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ...

  4. 快递鸟API接口调用代码示例(免费不限量)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. JAVA 快递查询接口API调用-快递鸟接口

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  6. PHP实现物流查询(通过快递网API实现)

    物流查询实现 引 言:目前快递公司太多了,不可能一个一个去申请api查询.这个时候,就可以通过合作,找一些中间商合作.我试了两家,一家是快递100,一家是快递网. 他们都需要申请key.但是快递100 ...

  7. 解决在TP5中无法使用快递鸟的即时查询API

    快递鸟的接口对接其实很简单,先去官网注册账号,登陆把基本信息填好,然后在产品管理中订购一下“物流查询”,免费,不过其他产品是收费,免费的有对接口调用频率限制,结合自己的应用流量够用就可以. 使用前复制 ...

  8. 调用第三方物流公司API即时查询物流信息

    主要是利用快递鸟提供的物流服务,通过对接快递鸟的API,调用即时查询接口,获取物流信息. 这里采用java语言,调用快递鸟的接口为例.步骤如下: 1.首先,得去快递鸟的官方网站注册一个账号并进行实名认 ...

  9. 快递鸟顺丰物流api接口对接多种方法整理

    目前很多自营电商平台.ERP系统.仓储系统.快递柜企业,对物流模块数据需求还是比较旺盛的.之前有介绍过简单的接口对接方法,这次给大家整理介绍两种快递数据的获取方法. 接口秘钥可以向顺丰公司申请,或者一 ...

随机推荐

  1. asp.net mvc Bundle

    在使用ASP.NET MVC4中使用BundleConfig 将 js css文件 合并压缩使用,但是文件名含有min及特殊字符的将不引用 ,也不提示其他信息.

  2. php 算法知识 冒泡排序

    function bubble_order($arr){ //得到长度 $count_num=count($arr); for($k=1;$k<$count_num;$k++){ //对长度越来 ...

  3. Python 基础之面向对象之八步理解装饰器

    装饰器:在不改变原有代码的情况下,为该原函数扩展新功能特征:返回新函数,替换旧函数语法:@ 语法糖 1.装饰器原型 #例1: def kuozhan(func):    def newfunc():  ...

  4. 面试问题之——给你图片的url,你能知道它所占的字节空间吗?

    从一个需求说起 这标题起得有点标题党,实际情况是我最近在做一个公司内部工具时,遇到了这么一个需求,给定一个静态资源站点上某张图片的url(比如https://a.xxxcdn.com/demo.jpg ...

  5. selenium 获取table数据

    public class Table { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...

  6. Java--对象与类(二)

    final 实例域 可以将实例域定义为final.构建对象时必须初始化这样的域.也就是说在一个构造器执行之后,这个域被设置,并且之后无法对其修改 final 修饰符大多应用于基本(primitive) ...

  7. 【 JdbcUtils 】mysql数据库查询

    JdbcUtils package k.util; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; i ...

  8. Django:cookie和session相关问题

    http://www.cnblogs.com/fnng/p/3750596.html http://www.cnblogs.com/chenchao1990/p/5283725.html

  9. C++11常用特性介绍——auto类型修饰符

    1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...

  10. Curl常用函数介绍

    一.LibCurl基本编程框架 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libc ...