快遞查詢接口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();
- }
- }
