快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序。目前比较常用的接口有快递鸟、快递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
- 
*/
- 
- 
- 
("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;
- 
- 
- 
}
- 
- 
- 
- 
("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签名
- 
*/
- 
- 
- 
("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 远程资源的响应结果
- 
*/
- 
- 
- 
("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();
- 
}
- 
}
- 
 
                     
                    
                 
                    
                 
         
