zoukankan      html  css  js  c++  java
  • 简单快递鸟单号识别查询接口API/插件开发使用

       快递接口/插件是电商网站和系统商用来实现查询快递功能的主要方法,就类似淘宝京东查询物流轨迹一样,嵌入到自己系统里。

        现在有好几家公司都提供集成的接口,就是对接或嵌入一次,就能查询多家快递公司信息。比较实惠常用的是快递鸟的接口,以下对接嵌入方法以他为例。

    方法区别

        接口对接:对接周期1~3天,需要开发,不限查询次数

        插件嵌入:对接周期1天,基本不需要开发,每天只能查询3000次,如果查询量比较大,建议还是接口对接,还能对数据做存储和分析

    一.接口对接

        接口在对接前需要到快递鸟官网注册账号,免费注册的,注册后登录查看自己的接口ID和KEY,用于对接的EBusinessID和APPKEY两个参数赋值。

        接口规则:订单接收的信息(分给了的网点,业务员的信息),会通过推送接口推给客户(订阅并发不超过30次/S)客户需要按要求实现接口;仅支持Json格式;请求指令1008;测试接口地址:http://testapi.kdniao.cc:8081/api/dist;联调通过后请更换为正式地址:http://api.kdniao.cc/api/dist;分发及订阅接口需要客户方实现回调接口,回调RequestType(1008)

    一.即时查询接口(免费)
    1. 接口规则

    (1)、查询接口支持按照运单号查询(单个查询,并发不超过10个/S)。

    (2)、指定的物流运单号选择相应的快递公司编码,格式不对或则编码错误都会返失败的信息。如EMS物流单号应选择快递公司编码(EMS)

    (3)、返回的物流跟踪信息按照发生的时间升序排列。

    (4)、接口指令1002。

    系统应用参数:

    demo对接

    import java.io.BufferedReader;
    import java.io.IOException; 
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import java.security.MessageDigest; 
    
    /**
    *
    * 快递鸟订阅推送2.0接口
    *
    * ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx
    */
    
    public class KdniaoSubscribeAPI {
        
        //DEMO
        public static void main(String[] args) {
            KdniaoSubscribeAPI api = new KdniaoSubscribeAPI();
            try {
                String result = api.orderTracesSubByJson();
                System.out.print(result);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //电商ID
        private String EBusinessID="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
        //电商加密私钥,快递鸟提供,注意保管,不要泄漏
        private String AppKey="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
        //测试请求url
        private String ReqURL = "http://testapi.kdniao.cc:8081/api/dist";
        //正式请求url
        //private String ReqURL = "http://api.kdniao.cc/api/dist";
     
        /**
         * Json方式  物流信息订阅
         * @throws Exception 
         */
        public String orderTracesSubByJson() throws Exception{
            String requestData="{'OrderCode': 'SF201608081055208281'," +
                                    "'ShipperCode':'SF'," +
                                    "'LogisticCode':'3100707578976'," +
                                    "'PayType':1," +
                                    "'ExpType':1," +
                                    "'CustomerName':'',"+
                                    "'CustomerPwd':''," +
                                    "'MonthCode':''," +
                                    "'IsNotice':0," +
                                    "'Cost':1.0," +
                                    "'OtherCost':1.0," +
                                    "'Sender':" +
                                    "{" +
                                    "'Company':'LV','Name':'Taylor','Mobile':'15018442396','ProvinceName':'上海','CityName':'上海','ExpAreaName':'青浦区','Address':'明珠路73号'}," +
                                    "'Receiver':" +
                                    "{" +
                                    "'Company':'GCCUI','Name':'Yann','Mobile':'15018442396','ProvinceName':'北京','CityName':'北京','ExpAreaName':'朝阳区','Address':'三里屯街道雅秀大厦'}," +
                                    "'Commodity':" +
                                    "[{" +
                                    "'GoodsName':'鞋子','Goodsquantity':1,'GoodsWeight':1.0}]," +
                                    "'Weight':1.0," +
                                    "'Quantity':1," +
                                    "'Volume':0.0," +
                                    "'Remark':'小心轻放'}";
            
            Map<String, String> params = new HashMap<String, String>();
            params.put("RequestData", urlEncoder(requestData, "UTF-8"));
            params.put("EBusinessID", EBusinessID);
            params.put("RequestType", "1008");
            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 
         */
        @SuppressWarnings("unused")
        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;    
        }    
        
        @SuppressWarnings("unused")
        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签名
         */
        @SuppressWarnings("unused")
        private String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, 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 远程资源的响应结果
         */
        @SuppressWarnings("unused")
        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(); 
        }
    }

    二.插件嵌入(PC)

    接口说明

    (1)在项目中引入KDNWidget.js/KDNWidget.css库文件(请查看附件)。 
    (2)接口需要指定快递单号的快递公司编码、快递运单号、服务类型、容器的ID以及展示类型,格式不对或则编码错误都会返失败的信息。 
    如:中通物流单号应选择快递公司编码(ZTO)(编码可以在官网下载)
    (3)返回的物流跟踪信息按照发生的时间升序排列。 

    插件调用示例

     <html>
                      <head>
                          要引入的CSS文件:
                          <link rel="stylesheet" href="KDNWidget.css">
                      </head>
                      <body>
                         页面其它标签
    
    
                        要引入的JS文件:
                          <script src="KDNWidget.js"></<script>
                          <script>
                          KDNWidget.run({
                            serviceType: "B",
                            expCode:"453173031799",
                            expNo:"453173031799",
                            showType:"normal"
                            container: "demoID",
                          })
                         </script>  
                        </body>
                        </html>
  • 相关阅读:
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    flowable 获取当前任务流程图片的输入流
    最新 接口api插件 Swagger3 更新配置详解
    springboot 集成 activiti 流程引擎
    java 在线考试系统源码 springboot 在线教育 视频直播功能 支持手机端
    阿里 Nacos 注册中心 配置启动说明
    springboot 集成外部tomcat war包部署方式
    java 监听 redis 过期事件
    springcloudalibaba 组件版本关系
    java WebSocket 即时通讯配置使用说明
  • 原文地址:https://www.cnblogs.com/kdn2019/p/11599096.html
Copyright © 2011-2022 走看看