• 快递物流查询接口介绍


    快递查询接口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. }  
  • 相关阅读:
    Ellipsis 的升级版 line-clamp
    Angular7里面实现 debounce search
    闭包、迭代器
    Day10 函数的进阶
    函数
    文件的操作
    Day 07基础数据补充、set、深浅拷贝
    小数据池,编码和解码
    字典
    列表、元祖的操作
  • 原文地址:https://www.cnblogs.com/pureEve/p/6471939.html
Copyright © 2020-2023  润新知