导航

快递物流查询接口介绍

Posted on 2017-02-27 08:50  _eve  阅读(2270)  评论(0编辑  收藏  举报

快递查询接口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. }