zoukankan      html  css  js  c++  java
  • 快递物流查询接口介绍

    快递查询接口API    

        快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序。目前比较常用的接口有快递鸟、快递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调用示例

    [java] view plain copy
     
      1. import java.io.BufferedReader;  
      2. import java.io.IOException;  
      3. import java.io.InputStreamReader;  
      4. import   
      5.   
      6. java.io.OutputStreamWriter;  
      7. import   
      8.   
      9. java.io.UnsupportedEncodingExcept  
      10.   
      11. ion;  
      12. import   
      13.   
      14. java.net.HttpURLConnection;  
      15. import java.net.URL;  
      16. import java.net.URLEncoder;  
      17. import   
      18.   
      19. java.security.MessageDigest;  
      20. import java.util.HashMap;  
      21. import java.util.Map;   
      22.   
      23. /** 
      24.  * 
      25.  * 快递鸟物流轨迹即时查询接口 
      26.  * 
      27.  * @技术QQ群: 456320272 
      28.  * @see:  
      29.  
      30. http://www.kdniao.com/YundanChaxu 
      31.  
      32. nAPI.aspx 
      33.  * @copyright: 深圳市快金数据技术 
      34.  
      35. 服务有限公司 
      36.  * 
      37.  * DEMO中的电商ID与私钥仅限测试使 
      38.  
      39. 用,正式环境请单独注册账号 
      40.  * 单日超过500单查询量,建议接入 
      41.  
      42. 我方物流轨迹订阅推送接口 
      43.  *  
      44.  * ID和Key请到官网申请: 
      45.  
      46. http://www.kdniao.com/ServiceAppl 
      47.  
      48. y.aspx 
      49.  */  
      50.   
      51. public class KdniaoTrackQueryAPI   
      52.   
      53. {  
      54.       
      55.     //DEMO  
      56.     public static void main  
      57.   
      58. (String[] args) {  
      59.           
      60.   
      61. KdniaoTrackQueryAPI api = new   
      62.   
      63. KdniaoTrackQueryAPI();  
      64.         try {  
      65.             String   
      66.   
      67. result =   
      68.   
      69. api.getOrderTracesByJson("ANE",   
      70.   
      71. "210001633605");  
      72.               
      73.   
      74. System.out.print(result);  
      75.               
      76.         } catch   
      77.   
      78. (Exception e) {  
      79.               
      80.   
      81. e.printStackTrace();  
      82.         }  
      83.     }  
      84.       
      85.     //电商ID  
      86.     private String   
      87.   
      88. EBusinessID="请到快递鸟官网申请  
      89.   
      90. http://www.kdniao.com/ServiceAppl  
      91.   
      92. y.aspx";  
      93.     //电商加密私钥,快递鸟提  
      94.   
      95. 供,注意保管,不要泄漏  
      96.     private String AppKey="请  
      97.   
      98. 到快递鸟官网申请  
      99.   
      100. http://www.kdniao.com/ServiceAppl  
      101.   
      102. y.aspx";  
      103.     //请求url  
      104.     private String   
      105.   
      106. ReqURL="http://api.kdniao.cc/Ebus  
      107.   
      108. iness/EbusinessOrderHandle.aspx";     
      109.    
      110.     /** 
      111.      * Json方式 查询订单物流轨迹 
      112.      * @throws Exception  
      113.      */  
      114.     public String   
      115.   
      116. getOrderTracesByJson(String   
      117.   
      118. expCode, String expNo) throws   
      119.   
      120. Exception{  
      121.         String   
      122.   
      123. requestData=   
      124.   
      125. "{'OrderCode':'','ShipperCode':'"   
      126.   
      127. + expCode + "','LogisticCode':'"   
      128.   
      129. + expNo + "'}";  
      130.           
      131.         Map<String,   
      132.   
      133. String> params = new   
      134.   
      135. HashMap<String, String>();  
      136.         params.put  
      137.   
      138. ("RequestData", urlEncoder  
      139.   
      140. (requestData, "UTF-8"));  
      141.         params.put  
      142.   
      143. ("EBusinessID", EBusinessID);  
      144.         params.put  
      145.   
      146. ("RequestType", "1002");  
      147.         String   
      148.   
      149. dataSign=encrypt(requestData,   
      150.   
      151. AppKey, "UTF-8");  
      152.         params.put  
      153.   
      154. ("DataSign", urlEncoder(dataSign,   
      155.   
      156. "UTF-8"));  
      157.         params.put  
      158.   
      159. ("DataType", "2");  
      160.           
      161.         String   
      162.   
      163. result=sendPost(ReqURL, params);      
      164.           
      165.         //根据公司业务处  
      166.   
      167. 理返回的信息......  
      168.           
      169.         return result;  
      170.     }  
      171.       
      172.     /** 
      173.      * XML方式 查询订单物流轨迹 
      174.      * @throws Exception  
      175.      */  
      176.     public String   
      177.   
      178. getOrderTracesByXml() throws   
      179.   
      180. Exception{  
      181.         String   
      182.   
      183. requestData= "<?xml version=  
      184.   
      185. "1.0" encoding="utf-8" ?>"+  
      186.                       
      187.   
      188.         "<Content>"+  
      189.                       
      190.   
      191.           
      192.   
      193. "<OrderCode></OrderCode>"+  
      194.                       
      195.   
      196.           
      197.   
      198. "<ShipperCode>SF</ShipperCode>"+  
      199.                       
      200.   
      201.           
      202.   
      203. "<LogisticCode>589707398027</Logi  
      204.   
      205. sticCode>"+  
      206.                       
      207.   
      208.         "</Content>";  
      209.           
      210.         Map<String,   
      211.   
      212. String> params = new   
      213.   
      214. HashMap<String, String>();  
      215.         params.put  
      216.   
      217. ("RequestData", urlEncoder  
      218.   
      219. (requestData, "UTF-8"));  
      220.         params.put  
      221.   
      222. ("EBusinessID", EBusinessID);  
      223.         params.put  
      224.   
      225. ("RequestType", "1002");  
      226.         String   
      227.   
      228. dataSign=encrypt(requestData,   
      229.   
      230. AppKey, "UTF-8");  
      231.         params.put  
      232.   
      233. ("DataSign", urlEncoder(dataSign,   
      234.   
      235. "UTF-8"));  
      236.         params.put  
      237.   
      238. ("DataType", "1");  
      239.           
      240.         String   
      241.   
      242. result=sendPost(ReqURL, params);      
      243.           
      244.         //根据公司业务处  
      245.   
      246. 理返回的信息......  
      247.           
      248.         return result;  
      249.     }  
      250.    
      251.     /** 
      252.      * MD5加密 
      253.      * @param str 内容        
      254.      * @param charset 编码方式 
      255.      * @throws Exception  
      256.      */  
      257.     @SuppressWarnings  
      258.   
      259. ("unused")  
      260.     private String MD5(String   
      261.   
      262. str, String charset) throws   
      263.   
      264. Exception {  
      265.         MessageDigest md =   
      266.   
      267. MessageDigest.getInstance("MD5");  
      268.         md.update  
      269.   
      270. (str.getBytes(charset));  
      271.         byte[] result =   
      272.   
      273. md.digest();  
      274.         StringBuffer sb = new   
      275.   
      276. StringBuffer(32);  
      277.         for (int i = 0; i <   
      278.   
      279. result.length; i++) {  
      280.             int val = result  
      281.   
      282. [i] & 0xff;  
      283.             if (val <= 0xf) {  
      284.                 sb.append  
      285.   
      286. ("0");  
      287.             }  
      288.             sb.append  
      289.   
      290. (Integer.toHexString(val));  
      291.         }  
      292.         return sb.toString  
      293.   
      294. ().toLowerCase();  
      295.     }  
      296.       
      297.     /** 
      298.      * base64编码 
      299.      * @param str 内容        
      300.      * @param charset 编码方式 
      301.      * @throws  
      302.  
      303. UnsupportedEncodingException  
      304.      */  
      305.     private String base64  
      306.   
      307. (String str, String charset)   
      308.   
      309. throws   
      310.   
      311. UnsupportedEncodingException{  
      312.         String encoded =   
      313.   
      314. base64Encode(str.getBytes  
      315.   
      316. (charset));  
      317.         return encoded;     
      318.   
      319.    
      320.     }     
      321.       
      322.     @SuppressWarnings  
      323.   
      324. ("unused")  
      325.     private String   
      326.   
      327. urlEncoder(String str, String   
      328.   
      329. charset) throws   
      330.   
      331. UnsupportedEncodingException{  
      332.         String result =   
      333.   
      334. URLEncoder.encode(str, charset);  
      335.         return result;  
      336.     }  
      337.       
      338.     /** 
      339.      * 电商Sign签名生成 
      340.      * @param content 内容    
      341.      * @param keyValue Appkey   
      342.      * @param charset 编码方式 
      343.      * @throws  
      344.  
      345. UnsupportedEncodingException  
      346.  
      347. ,Exception 
      348.      * @return DataSign签名 
      349.      */  
      350.     @SuppressWarnings  
      351.   
      352. ("unused")  
      353.     private String encrypt   
      354.   
      355. (String content, String keyValue,   
      356.   
      357. String charset) throws   
      358.   
      359. UnsupportedEncodingException,   
      360.   
      361. Exception  
      362.     {  
      363.         if (keyValue !=   
      364.   
      365. null)  
      366.         {  
      367.             return   
      368.   
      369. base64(MD5(content + keyValue,   
      370.   
      371. charset), charset);  
      372.         }  
      373.         return base64  
      374.   
      375. (MD5(content, charset), charset);  
      376.     }  
      377.       
      378.      /** 
      379.      * 向指定 URL 发送POST方法的 
      380.  
      381. 请求      
      382.      * @param url 发送请求的 URL   
      383.  
      384.    
      385.      * @param params 请求的参数集 
      386.  
      387. 合      
      388.      * @return 远程资源的响应结果 
      389.      */  
      390.     @SuppressWarnings  
      391.   
      392. ("unused")  
      393.     private String sendPost  
      394.   
      395. (String url, Map<String, String>   
      396.   
      397. params) {  
      398.         OutputStreamWriter out =   
      399.   
      400. null;  
      401.         BufferedReader in = null;   
      402.   
      403.          
      404.         StringBuilder result =   
      405.   
      406. new StringBuilder();   
      407.         try {  
      408.             URL realUrl = new   
      409.   
      410. URL(url);  
      411.             HttpURLConnection   
      412.   
      413. conn =(HttpURLConnection)   
      414.   
      415. realUrl.openConnection();  
      416.             // 发送POST请求必须设  
      417.   
      418. 置如下两行  
      419.             conn.setDoOutput  
      420.   
      421. (true);  
      422.             conn.setDoInput  
      423.   
      424. (true);  
      425.             // POST方法  
      426.               
      427.   
      428. conn.setRequestMethod("POST");  
      429.             // 设置通用的请求属性  
      430.               
      431.   
      432. conn.setRequestProperty("accept",   
      433.   
      434. "*/*");  
      435.               
      436.   
      437. conn.setRequestProperty  
      438.   
      439. ("connection", "Keep-Alive");  
      440.               
      441.   
      442. conn.setRequestProperty("user-  
      443.   
      444. agent",  
      445.                     "Mozilla/4.0   
      446.   
      447. (compatible; MSIE 6.0; Windows NT   
      448.   
      449. 5.1;SV1)");  
      450.               
      451.   
      452. conn.setRequestProperty  
      453.   
      454. ("Content-Type", "application/x-  
      455.   
      456. www-form-urlencoded");  
      457.             conn.connect();  
      458.             // 获取URLConnection  
      459.   
      460. 对象对应的输出流  
      461.             out = new   
      462.   
      463. OutputStreamWriter  
      464.   
      465. (conn.getOutputStream(), "UTF-  
      466.   
      467. 8");  
      468.             // 发送请求参数         
      469.   
      470.        
      471.             if (params != null) {  
      472.                     
      473.   
      474. StringBuilder param = new   
      475.   
      476. StringBuilder();   
      477.                   for   
      478.   
      479. (Map.Entry<String, String> entry   
      480.   
      481. : params.entrySet()) {  
      482.                         
      483.   
      484. if(param.length()>0){  
      485.                           
      486.   
      487.   param.append("&");  
      488.                         
      489.   
      490. }                   
      491.                         
      492.   
      493. param.append(entry.getKey());  
      494.                         
      495.   
      496. param.append("=");  
      497.                         
      498.   
      499. param.append(entry.getValue());       
      500.   
      501.                 
      502.                         
      503.   
      504. //System.out.println  
      505.   
      506. (entry.getKey  
      507.   
      508. ()+":"+entry.getValue());  
      509.                   }  
      510.                     
      511.   
      512. //System.out.println  
      513.   
      514. ("param:"+param.toString());  
      515.                     
      516.   
      517. out.write(param.toString());  
      518.             }  
      519.             // flush输出流的缓冲  
      520.             out.flush();  
      521.             // 定义BufferedReader  
      522.   
      523. 输入流来读取URL的响应  
      524.             in = new   
      525.   
      526. BufferedReader(  
      527.                     new   
      528.   
      529. InputStreamReader  
      530.   
      531. (conn.getInputStream(), "UTF-  
      532.   
      533. 8"));  
      534.             String line;  
      535.             while ((line =   
      536.   
      537. in.readLine()) != null) {  
      538.                 result.append  
      539.   
      540. (line);  
      541.             }  
      542.         } catch (Exception e) {     
      543.   
      544.            
      545.             e.printStackTrace();  
      546.         }  
      547.         //使用finally块来关闭输出  
      548.   
      549. 流、输入流  
      550.         finally{  
      551.             try{  
      552.                 if(out!=null){  
      553.                     out.close();  
      554.                 }  
      555.                 if(in!=null){  
      556.                     in.close();  
      557.                 }  
      558.             }  
      559.             catch(IOException   
      560.   
      561. ex){  
      562.                   
      563.   
      564. ex.printStackTrace();  
      565.             }  
      566.         }  
      567.         return result.toString();  
      568.     }  
      569.       
      570.       
      571.     private static char[]   
      572.   
      573. base64EncodeChars = new char[] {   
      574.         'A', 'B', 'C', 'D', 'E',   
      575.   
      576. 'F', 'G', 'H',   
      577.         'I', 'J', 'K', 'L', 'M',   
      578.   
      579. 'N', 'O', 'P',   
      580.         'Q', 'R', 'S', 'T', 'U',   
      581.   
      582. 'V', 'W', 'X',   
      583.         'Y', 'Z', 'a', 'b', 'c',   
      584.   
      585. 'd', 'e', 'f',   
      586.         'g', 'h', 'i', 'j', 'k',   
      587.   
      588. 'l', 'm', 'n',   
      589.         'o', 'p', 'q', 'r', 's',   
      590.   
      591. 't', 'u', 'v',   
      592.         'w', 'x', 'y', 'z', '0',   
      593.   
      594. '1', '2', '3',   
      595.         '4', '5', '6', '7', '8',   
      596.   
      597. '9', '+', '/' };   
      598.       
      599.     public static String   
      600.   
      601. base64Encode(byte[] data) {   
      602.         StringBuffer sb = new   
      603.   
      604. StringBuffer();   
      605.         int len = data.length;   
      606.         int i = 0;   
      607.         int b1, b2, b3;   
      608.         while (i < len) {   
      609.             b1 = data[i++] &   
      610.   
      611. 0xff;   
      612.             if (i == len)   
      613.             {   
      614.                 sb.append  
      615.   
      616. (base64EncodeChars[b1 >>> 2]);   
      617.                 sb.append  
      618.   
      619. (base64EncodeChars[(b1 & 0x3) <<   
      620.   
      621. 4]);   
      622.                 sb.append("==");   
      623.                 break;   
      624.             }   
      625.             b2 = data[i++] &   
      626.   
      627. 0xff;   
      628.             if (i == len)   
      629.             {   
      630.                 sb.append  
      631.   
      632. (base64EncodeChars[b1 >>> 2]);   
      633.                 sb.append  
      634.   
      635. (base64EncodeChars[((b1 & 0x03)   
      636.   
      637. << 4) | ((b2 & 0xf0) >>> 4)]);   
      638.                 sb.append  
      639.   
      640. (base64EncodeChars[(b2 & 0x0f) <<   
      641.   
      642. 2]);   
      643.                 sb.append("=");   
      644.                 break;   
      645.             }   
      646.             b3 = data[i++] &   
      647.   
      648. 0xff;   
      649.             sb.append  
      650.   
      651. (base64EncodeChars[b1 >>> 2]);   
      652.             sb.append  
      653.   
      654. (base64EncodeChars[((b1 & 0x03)   
      655.   
      656. << 4) | ((b2 & 0xf0) >>> 4)]);   
      657.             sb.append  
      658.   
      659. (base64EncodeChars[((b2 & 0x0f)   
      660.   
      661. << 2) | ((b3 & 0xc0) >>> 6)]);   
      662.             sb.append  
      663.   
      664. (base64EncodeChars[b3 & 0x3f]);   
      665.         }   
      666.         return sb.toString();   
      667.     }  
      668. }  
  • 相关阅读:
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 47 全排列 II(二)
    Java实现 LeetCode 47 全排列 II(二)
  • 原文地址:https://www.cnblogs.com/pureEve/p/6471939.html
Copyright © 2011-2022 走看看