快遞查詢接口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調用示例
- import java.io.BufferedReader;
 - import java.io.IOException;
 - import java.io.InputStreamReader;
 - import
 - java.io.OutputStreamWriter;
 - import
 - java.io.UnsupportedEncodingExcept
 - ion;
 - import
 - java.net.HttpURLConnection;
 - import java.net.URL;
 - import java.net.URLEncoder;
 - import
 - java.security.MessageDigest;
 - import java.util.HashMap;
 - import java.util.Map;
 - /**
 - *
 - * 快遞鳥物流軌跡即時查詢接口
 - *
 - * @技術QQ群: 456320272
 - * @see:
 - http://www.kdniao.com/YundanChaxu
 - nAPI.aspx
 - * @copyright: 深圳市快金數據技術
 - 服務有限公司
 - *
 - * DEMO中的電商ID與私鑰僅限測試使
 - 用,正式環境請單獨注冊賬號
 - * 單日超過500單查詢量,建議接入
 - 我方物流軌跡訂閱推送接口
 - *
 - * ID和Key請到官網申請:
 - http://www.kdniao.com/ServiceAppl
 - y.aspx
 - */
 - 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="請到快遞鳥官網申請
 - http://www.kdniao.com/ServiceAppl
 - y.aspx";
 - //電商加密私鑰,快遞鳥提
 - 供,注意保管,不要泄漏
 - private String AppKey="請
 - 到快遞鳥官網申請
 - http://www.kdniao.com/ServiceAppl
 - y.aspx";
 - //請求url
 - private String
 - ReqURL="http://api.kdniao.cc/Ebus
 - iness/EbusinessOrderHandle.aspx";
 - /**
 - * Json方式 查詢訂單物流軌跡
 - * @throws Exception
 - */
 - public String
 - getOrderTracesByJson(String
 - expCode, String expNo) throws
 - Exception{
 - String
 - requestData=
 - "{'OrderCode':'','ShipperCode':'"
 - + expCode + "','LogisticCode':'"
 - + expNo + "'}";
 - Map<String,
 - String> params = new
 - HashMap<String, String>();
 - 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;
 - }
 - /**
 - * XML方式 查詢訂單物流軌跡
 - * @throws Exception
 - */
 - public String
 - getOrderTracesByXml() throws
 - Exception{
 - String
 - requestData= "<?xml version=
 - \"1.0\" encoding=\"utf-8\" ?>"+
 - "<Content>"+
 - "<OrderCode></OrderCode>"+
 - "<ShipperCode>SF</ShipperCode>"+
 - "<LogisticCode>589707398027</Logi
 - sticCode>"+
 - "</Content>";
 - Map<String,
 - String> params = new
 - HashMap<String, String>();
 - 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", "1");
 - 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();
 - }
 - }
 
