zoukankan      html  css  js  c++  java
  • 常用快递单号物流查询API接口通用对接指南(JAVA快递鸟对接)

    快递查询接口通用API是给发货电商用来实现查询快递物流轨迹功能的,接口对接前要先到快递鸟网站申请接口秘钥和APIKEY

    快递API的应用场景与用途

    最常见的应用场景如下:

    (1)电商网站:例如B2C、团购、B2B、批发分销站、C2C、本地生活交易等网站。

    (2)管理系统:订单处理平台、订货平台、发货平台、分销系统、渠道管理系统、客户管理系统、ERP等。

    快递API的用途如下:

    (1)让顾客登录网站后,直接在“我的订单”页面内就能看到订单的物流状态。

    (2)自动筛选出“已签收”、“疑难件”等状态的单号,减轻物流跟单人员的压力。

    (3)改变订单的状态和交易流程,例如单号变为“已签收”,就能让订单变为可以确认退换货等。

    (4)评估选择快递公司,根据“已签收”的运单数,可以算出销售人员的业绩,且便于应对的结算。

    (5)邮件、短信提醒用户运单的最新状态,可以安抚用户,也可以利用邮件短信二次营销。

    对接要求:

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

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

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

    (4)、接口指令1002

    (5)、接口提供:快递鸟

    (6)、请求地址:http://www.kdniao.com

    java请求示例:

    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.security.MessageDigest;
    import java.util.HashMap;
    import java.util.Map; 
    /**
     *
     * 单日超过500单查询量,建议接入物流轨迹订阅推送接口
     * 
     */
    public class KdniaoTrackQueryAPI {
         
        //DEMO
        public static void main(String[] args) {
            KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();
            try {
                String result = api.getOrderTracesByJson("ANE", "210001633605");
                System.out.print(result);
                 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
         
        //电商ID
        private String EBusinessID="申请";
        //电商加密私钥,注意保管,不要泄漏
        private String AppKey="申请";
        //请求url
        private String ReqURL="http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx";    
      
        /**
         * Json方式 查询订单物流轨迹
         * @throws Exception 
         */
        public String getOrderTracesByJson(String expCode, String expNo) throws Exception{
            String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
             
            Map 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 
         */
        @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 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 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(); 
        }
    }
    

      

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/kdn2019/p/12005114.html
Copyright © 2011-2022 走看看