快递物流轨迹信息查询调用快递鸟API

举报
爱程序的小猿 发表于 2019/10/14 14:44:47 2019/10/14
【摘要】 概要:关于调用快递鸟API,我有几句话想说,有几行代码想写业务需求:就是做做商城,卖卖东西。然后需要做个物流跟踪的功能  需要获取的信息大概就是这个样子现在看这个快递怎么这么慢 如何实现?直接调用快递鸟API。首先登陆快递鸟官网进行会员注册http://www.kdniao.com/reg,然后登录官网后台认证自己的用户信息,记住自己的用户ID和API key,代码里调用接口时会使用到。我这...

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

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

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

2019101414380062cea4f6-16d8-471f-bbdd-fddc5f4d8069.png

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

 

如何实现?

直接调用快递鸟API。

首先登陆快递鸟官网进行会员注册http://www.kdniao.com/reg

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

2019101414400476383457-3d23-4efe-aacf-8a99fb57639f.png

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

 201910141440291cd6c771-bda6-486c-86fc-f71833447266.png

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

 @RestController

@RequestMapping("/admin/logistics")
@Validated
@Api(description = "物流追踪接口")
public class AdminKdniaoTrackQueryAPI {


   //用户ID
   private String EBusinessID="用户ID";
   //电商加密私钥,快递鸟提供,注意保管,不要泄漏
   private String AppKey="API key";
   //请求url
   private String ReqURL="http://api.kdniao.com/api/dist";


   @RequiresPermissions("admin:logistics:getOrderTracesByJson")
   //@RequiresPermissionsDesc(menu = {"物流管理", "物流追踪"}, button = "查询")
   @ApiOperation(value = "根据物流单号和快递公司编码查询物流信息", notes = "根据物流单号和快递公司编码查询物流信息", httpMethod = "GET")
   @ApiImplicitParams({
           @ApiImplicitParam(name = "shipChannel", value = "快递公司编码",dataType = "String"),
           @ApiImplicitParam(name = "shipSn", value = "物流单号", dataType = "String" )
   })
   @ResponseBody
   @GetMapping("/getOrderTracesByJson")
   public String getOrderTracesByJson(String shipChannel, String shipSn) throws Exception{
       String requestData= "{'OrderCode':'','ShipperCode':'" + shipChannel + "','LogisticCode':'" + shipSn + "'}";

       Map<String, String> params = new HashMap<>();
       params.put("RequestData", urlEncoder(requestData, "UTF-8"));
       params.put("EBusinessID", EBusinessID);
       params.put("RequestType", "1002");
       String dataSign=encrypt(requestData, AppKey, "UTF-8");
       params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
       params.put("DataType", "2");

       String result=sendPost(ReqURL, params);

       //根据公司业务处理返回的信息......
       return result;
   }

   /**
    * MD5加密
    * @param str 内容
    * @param charset 编码方式
    * @throws Exception
    */

   private String MD5(String str, String charset) throws Exception {
       MessageDigest md = MessageDigest.getInstance("MD5");
       md.update(str.getBytes(charset));
       byte[] result = md.digest();
       StringBuffer sb = new StringBuffer(32);
       for (int i = 0; i < result.length; i++) {
           int val = result[i] & 0xff;
           if (val <= 0xf) {
               sb.append("0");
           }
           sb.append(Integer.toHexString(val));
       }
       return sb.toString().toLowerCase();
   }

   /**
    * base64编码
    * @param str 内容
    * @param charset 编码方式
    * @throws UnsupportedEncodingException
    */
   private String base64(String str, String charset) throws UnsupportedEncodingException {
       String encoded = base64Encode(str.getBytes(charset));
       return encoded;
   }


   private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
       String result = URLEncoder.encode(str, charset);
       return result;
   }

   /**
    * 电商Sign签名生成
    * @param content 内容
    * @param keyValue Appkey
    * @param charset 编码方式
    * @throws UnsupportedEncodingException ,Exception
    * @return DataSign签名
    */

   private String encrypt (String content, String keyValue, String charset) throws  Exception
   {
       if (keyValue != null)
       {
           return base64(MD5(content + keyValue, charset), charset);
       }
       return base64(MD5(content, charset), charset);
   }

   /**
    * 向指定 URL 发送POST方法的请求
    * @param url 发送请求的 URL
    * @param params 请求的参数集合
    * @return 远程资源的响应结果
    */

   private String sendPost(String url, Map<String, String> params) {
       OutputStreamWriter out = null;
       BufferedReader in = null;
       StringBuilder result = new StringBuilder();
       try {
           URL realUrl = new URL(url);
           HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
           // 发送POST请求必须设置如下两行
           conn.setDoOutput(true);
           conn.setDoInput(true);
           // POST方法
           conn.setRequestMethod("POST");
           // 设置通用的请求属性
           conn.setRequestProperty("accept", "*/*");
           conn.setRequestProperty("connection", "Keep-Alive");
           conn.setRequestProperty("user-agent",
                   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
           conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
           conn.connect();
           // 获取URLConnection对象对应的输出流
           out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
           // 发送请求参数
           if (params != null) {
               StringBuilder param = new StringBuilder();
               for (Map.Entry<String, String> entry : params.entrySet()) {
                   if(param.length()>0){
                       param.append("&");
                   }
                   param.append(entry.getKey());
                   param.append("=");
                   param.append(entry.getValue());
                   //System.out.println(entry.getKey()+":"+entry.getValue());
               }
               //System.out.println("param:"+param.toString());
               out.write(param.toString());
           }
           // flush输出流的缓冲
           out.flush();
           // 定义BufferedReader输入流来读取URL的响应
           in = new BufferedReader(
                   new InputStreamReader(conn.getInputStream(), "UTF-8"));
           String line;
           while ((line = in.readLine()) != null) {
               result.append(line);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       //使用finally块来关闭输出流、输入流
       finally{
           try{
               if(out!=null){
                   out.close();
               }
               if(in!=null){
                   in.close();
               }
           }
           catch(IOException ex){
               ex.printStackTrace();
           }
       }
       return result.toString();
   }


   private static char[] base64EncodeChars = new char[] {
           'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
           'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
           'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
           'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
           'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
           'w', 'x', 'y', 'z', '0', '1', '2', '3',
           '4', '5', '6', '7', '8', '9', '+', '/' };

   public static String base64Encode(byte[] data) {
       StringBuffer sb = new StringBuffer();
       int len = data.length;
       int i = 0;
       int b1, b2, b3;
       while (i < len) {
           b1 = data[i++] & 0xff;
           if (i == len)
           {
               sb.append(base64EncodeChars[b1 >>> 2]);
               sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
               sb.append("==");
               break;
           }
           b2 = data[i++] & 0xff;
           if (i == len)
           {
               sb.append(base64EncodeChars[b1 >>> 2]);
               sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
               sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
               sb.append("=");
               break;
           }
           b3 = data[i++] & 0xff;
           sb.append(base64EncodeChars[b1 >>> 2]);
           sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
           sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
           sb.append(base64EncodeChars[b3 & 0x3f]);
       }
       return sb.toString();
   }
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。