快递查询API接口对接方法

各类接口

快递查询API有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据。目前常用的有快递鸟、快递100、快递网等。

快递鸟即时API可以查询3000次,3000以上接订阅接口,统一接口模式接入,常用快递均支持查询,还有订阅API、在线下单API、电子面单API,接口均不收取费用,没有要求用户添加外链,支持418家国内外快递物流查询。

快递100每天可以免费查询2000次,超过2000次收费,每次0.06~0.1元不等,如果查询的量大的话可以降低费用,免费的接口有几家常用快递不支持接口模式,只支持htmlAPI,要求用户添加外链,支持300多家国内外快递物流查询。

快递网每天可以免费查询500次,超过500次收费,每次0.05元,只有即时查询和订阅推送接口,要求用户添加外链,支持395家国内外快递物流查询。

对接示例

以快递鸟及时查询API接入示例,不同公司的快递查询API接入类似,都需要注册,申请账号获取KEY和IDhttp://www.kdniao.com/ServiceApply.aspx,如果是订阅API需要技术联调。

根据快递单号和快递公司编码查询物流轨迹信息。接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。如: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接入示例

  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStreamReader;
  4 import java.io.OutputStreamWriter;
  5 import java.io.UnsupportedEncodingException;
  6 import java.net.HttpURLConnection;
  7 import java.net.URL;
  8 import java.net.URLEncoder;
  9 import java.security.MessageDigest;
 10 import java.util.HashMap;
 11 import java.util.Map;
 12
 13 /**
 14  *
 15  * 快递鸟物流轨迹即时查询接口
 16  *
 17  * @技术QQ群: 456320272
 18  * @see: http://www.kdniao.com/YundanChaxunAPI.aspx
 19  * @copyright: 深圳市快金数据技术服务有限公司
 20  *
 21  * DEMO中的电商ID与私钥仅限测试使用,正式环境请单独注册账号
 22  * 单日超过500单查询量,建议接入我方物流轨迹订阅推送接口
 23  *
 24  * ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx
 25  */
 26
 27 public class KdniaoTrackQueryAPI {
 28
 29     //DEMO
 30     public static void main(String[] args) {
 31         KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();
 32         try {
 33             String result = api.getOrderTracesByJson("ANE", "210001633605");
 34             System.out.print(result);
 35
 36         } catch (Exception e) {
 37             e.printStackTrace();
 38         }
 39     }
 40
 41     //电商ID
 42     private String EBusinessID="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
 43     //电商加密私钥,快递鸟提供,注意保管,不要泄漏
 44     private String AppKey="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
 45     //请求url
 46     private String ReqURL="http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx";
 47
 48     /**
 49      * Json方式 查询订单物流轨迹
 50      * @throws Exception
 51      */
 52     public String getOrderTracesByJson(String expCode, String expNo) throws Exception{
 53         String requestData= "{‘OrderCode‘:‘‘,‘ShipperCode‘:‘" + expCode + "‘,‘LogisticCode‘:‘" + expNo + "‘}";
 54
 55         Map<String, String> params = new HashMap<String, String>();
 56         params.put("RequestData", urlEncoder(requestData, "UTF-8"));
 57         params.put("EBusinessID", EBusinessID);
 58         params.put("RequestType", "1002");
 59         String dataSign=encrypt(requestData, AppKey, "UTF-8");
 60         params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
 61         params.put("DataType", "2");
 62
 63         String result=sendPost(ReqURL, params);
 64
 65         //根据公司业务处理返回的信息......
 66
 67         return result;
 68     }
 69
 70     /**
 71      * XML方式 查询订单物流轨迹
 72      * @throws Exception
 73      */
 74     public String getOrderTracesByXml() throws Exception{
 75         String requestData= "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"+
 76                             "<Content>"+
 77                             "<OrderCode></OrderCode>"+
 78                             "<ShipperCode>SF</ShipperCode>"+
 79                             "<LogisticCode>589707398027</LogisticCode>"+
 80                             "</Content>";
 81
 82         Map<String, String> params = new HashMap<String, String>();
 83         params.put("RequestData", urlEncoder(requestData, "UTF-8"));
 84         params.put("EBusinessID", EBusinessID);
 85         params.put("RequestType", "1002");
 86         String dataSign=encrypt(requestData, AppKey, "UTF-8");
 87         params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
 88         params.put("DataType", "1");
 89
 90         String result=sendPost(ReqURL, params);
 91
 92         //根据公司业务处理返回的信息......
 93
 94         return result;
 95     }
 96
 97     /**
 98      * MD5加密
 99      * @param str 内容
100      * @param charset 编码方式
101      * @throws Exception
102      */
103     @SuppressWarnings("unused")
104     private String MD5(String str, String charset) throws Exception {
105         MessageDigest md = MessageDigest.getInstance("MD5");
106         md.update(str.getBytes(charset));
107         byte[] result = md.digest();
108         StringBuffer sb = new StringBuffer(32);
109         for (int i = 0; i < result.length; i++) {
110             int val = result[i] & 0xff;
111             if (val <= 0xf) {
112                 sb.append("0");
113             }
114             sb.append(Integer.toHexString(val));
115         }
116         return sb.toString().toLowerCase();
117     }
118
119     /**
120      * base64编码
121      * @param str 内容
122      * @param charset 编码方式
123      * @throws UnsupportedEncodingException
124      */
125     private String base64(String str, String charset) throws UnsupportedEncodingException{
126         String encoded = base64Encode(str.getBytes(charset));
127         return encoded;
128     }
129
130     @SuppressWarnings("unused")
131     private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
132         String result = URLEncoder.encode(str, charset);
133         return result;
134     }
135
136     /**
137      * 电商Sign签名生成
138      * @param content 内容
139      * @param keyValue Appkey
140      * @param charset 编码方式
141      * @throws UnsupportedEncodingException ,Exception
142      * @return DataSign签名
143      */
144     @SuppressWarnings("unused")
145     private String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception
146     {
147         if (keyValue != null)
148         {
149             return base64(MD5(content + keyValue, charset), charset);
150         }
151         return base64(MD5(content, charset), charset);
152     }
153
154      /**
155      * 向指定 URL 发送POST方法的请求
156      * @param url 发送请求的 URL
157      * @param params 请求的参数集合
158      * @return 远程资源的响应结果
159      */
160     @SuppressWarnings("unused")
161     private String sendPost(String url, Map<String, String> params) {
162         OutputStreamWriter out = null;
163         BufferedReader in = null;
164         StringBuilder result = new StringBuilder();
165         try {
166             URL realUrl = new URL(url);
167             HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
168             // 发送POST请求必须设置如下两行
169             conn.setDoOutput(true);
170             conn.setDoInput(true);
171             // POST方法
172             conn.setRequestMethod("POST");
173             // 设置通用的请求属性
174             conn.setRequestProperty("accept", "*/*");
175             conn.setRequestProperty("connection", "Keep-Alive");
176             conn.setRequestProperty("user-agent",
177                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
178             conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
179             conn.connect();
180             // 获取URLConnection对象对应的输出流
181             out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
182             // 发送请求参数
183             if (params != null) {
184                   StringBuilder param = new StringBuilder();
185                   for (Map.Entry<String, String> entry : params.entrySet()) {
186                       if(param.length()>0){
187                           param.append("&");
188                       }
189                       param.append(entry.getKey());
190                       param.append("=");
191                       param.append(entry.getValue());
192                       //System.out.println(entry.getKey()+":"+entry.getValue());
193                   }
194                   //System.out.println("param:"+param.toString());
195                   out.write(param.toString());
196             }
197             // flush输出流的缓冲
198             out.flush();
199             // 定义BufferedReader输入流来读取URL的响应
200             in = new BufferedReader(
201                     new InputStreamReader(conn.getInputStream(), "UTF-8"));
202             String line;
203             while ((line = in.readLine()) != null) {
204                 result.append(line);
205             }
206         } catch (Exception e) {
207             e.printStackTrace();
208         }
209         //使用finally块来关闭输出流、输入流
210         finally{
211             try{
212                 if(out!=null){
213                     out.close();
214                 }
215                 if(in!=null){
216                     in.close();
217                 }
218             }
219             catch(IOException ex){
220                 ex.printStackTrace();
221             }
222         }
223         return result.toString();
224     }
225
226
227     private static char[] base64EncodeChars = new char[] {
228         ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘,
229         ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘,
230         ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘,
231         ‘Y‘, ‘Z‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘,
232         ‘g‘, ‘h‘, ‘i‘, ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘,
233         ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘,
234         ‘w‘, ‘x‘, ‘y‘, ‘z‘, ‘0‘, ‘1‘, ‘2‘, ‘3‘,
235         ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘+‘, ‘/‘ };
236
237     public static String base64Encode(byte[] data) {
238         StringBuffer sb = new StringBuffer();
239         int len = data.length;
240         int i = 0;
241         int b1, b2, b3;
242         while (i < len) {
243             b1 = data[i++] & 0xff;
244             if (i == len)
245             {
246                 sb.append(base64EncodeChars[b1 >>> 2]);
247                 sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
248                 sb.append("==");
249                 break;
250             }
251             b2 = data[i++] & 0xff;
252             if (i == len)
253             {
254                 sb.append(base64EncodeChars[b1 >>> 2]);
255                 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
256                 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
257                 sb.append("=");
258                 break;
259             }
260             b3 = data[i++] & 0xff;
261             sb.append(base64EncodeChars[b1 >>> 2]);
262             sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
263             sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
264             sb.append(base64EncodeChars[b3 & 0x3f]);
265         }
266         return sb.toString();
267     }
268 }
时间: 2024-10-27 09:13:15

快递查询API接口对接方法的相关文章

快速实现常用快递单号查询api接口对接方法

网上的物流快递查询接口有很多,但是大部分都比较麻烦.所以这里介绍一个比较简单的查询方法,不需要对接友情链接,免费获取api接口技术文档以及demo 主要是利用 快递鸟的免费查询api接口: 快递鸟是全球最大的第三方快递物流接口服务商, 目前已经集成了418家快递单号查询接口,31家电子面单接口.高实时.高稳定.高并发,支持快递单号自动识别. 快递鸟第三方快递查询接口很好用,关键免费,使用的用户很多(有十几个千人技术QQ群),大的ERP基本都用的是快递鸟的接口,非淘系的电商平台也都是用快递鸟提供的

电商平台适用基础快递查询api接口对接demo解决方案

电商企业从接收订单-配货-打印快递单到后期的快递员收件-快递配送-轨迹查询-签收短信通知等,都需要快递接口的接入.整理目前可以实现如上服务的有 1.各家快递公司:提供快递查询.电子面单打印等2.快递100:提供在线寄件.快递查询等3.菜鸟:提供快递查询.电子面单打印等4.快递鸟:提供预约寄件.快递查询.电子面单打印.代收货款.短信服务等 各家快递公司提供的是一级接口,快递100.菜鸟和快递鸟是集成接口,对于使用快递比较多的企业来说,集成接口相对更好维护一些.所以一般电商都会选择集成的接口.快递鸟

各种快递查询Api接口(快递鸟)

前提 应用场景 可实现需求 申请Key 快递查询Api接口 接口文档及各开发语言Demo 查询Api接口定义 系统级输入参数 应用级输入参数 返回结果参数 请求JSON参数 响应JSON参数 查询Api接口使用 温馨提示 前提 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的是快递的查询Api及与其他各家的不同之处: 常用的提供快递Api接口的有: 快递鸟 快递100 爱查快递 等等 如大家使用过,快递100和爱查快递等等网站提供的快递查询等接口时,你会发现,你所申请的账号

常用快递单号查询api接口对接案例(快递鸟&amp;菜鸟)

目前提供快递查询的接口平台有: 快递鸟 (非淘系用户使用最多) 菜鸟 (淘系用户使用) 不同接口的区别: (1)快递鸟支持400多家物流快递公司,接口稳定免费,提供多种方式接口对接 (2)菜鸟支持100多家物流快递公司接口,主要支持阿里淘系商家用户使用. 快递API的应用场景与用途 最常见的应用场景如下: (1)电商网站:例如B2C.团购.B2B.批发分销站.C2C.本地生活交易等网站. (2)管理系统:订单处理平台.订货平台.发货平台.分销系统.渠道管理系统.客户管理系统.ERP等. 快递AP

快递查询API接口(trackingmore)

快递查询接口 目前提供快递查询的接口平台有: Trackingmore 快递100 快递网 不同接口的区别: (1)Trackingmore支持380家快递公司,其中有55家为国内的快递,其余325家为国际快递.具体的价格为0.6分钱/单号左右,新注册用户可以免费测试12小时. (2)快递100属于在国内做得比较早的平台,可以申请每天最多2000次的API调用,但需要给快递100做一个友链.超过2000次收费,每次0.06~0.1元不等. (3)快递网可以申请每天最多500次的API调用,但同样

php 快递查询api接口笔记

1 <?php 2 include_once("../includes/global.php"); 3 @include_once("../config/logistics_config.php"); 4 5 $api_id = $logistics_config['logistic_app_id']?$logistics_config['logistic_app_id']:""; 6 $api_sceret = $logistics_co

免费快递查询API接口

通过向指定的地址发送请求,即可在一个新的html5页面内显示物流单号的跟综信息,支持所有快递公司,无需后期维护,无需申请,适合手机应用. 免费快递查询API地址: http://m.kuaidi100.com/index_all.html?type=[快递公司编码]&postid=[快递单号]&callbackurl=[点击"返回"跳转的地址] 输入参数 名称 类型 是否必需 描述 type String 是 要查询的快递公司的代码,支持中文和模糊输入,支持本网站的所有

快递鸟物流查询API接口对接案例

下面是以快递鸟提供的开发者接口进行展开,如有错误,请指正并及时修改. 首先,申请一个快递鸟的账号: 然后进入http://www.kdniao.com/reg界面点击免费申请,免费申请的接口每天接口的请求次数都是没有限制的,超过3000次/每天需接入订阅推送接口. 按照申请流程一步步做完后,即可对接. 注册信息必须填写正确,如果有误可能导致接口无法正常使用.   使用 案例分为3个 使用的是Chrome的postman插件进行Api测试调用 使用JAVA环境进行快递查询 使用.net环境进行快递

快递查询API接口调用代码示例

快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序.目前比较常用的接口有快递鸟.快递100.快递网等. 应用场景 (1)电商网站用户打开"我的订单"时调用此API显示物流信息详情.  (2)电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题. 物流轨迹查询接口有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据. 快递鸟即时接口可