快递接口/插件是电商网站和系统商用来实现查询快递功能的主要方法,就类似淘宝京东查询物流轨迹一样,嵌入到自己系统里。

现在有好几家公司都提供集成的接口,就是对接或嵌入一次,就能查询多家快递公司信息。比较实惠常用的是快递鸟的接口,以下对接嵌入方法以他为例。

方法区别

接口对接:对接周期1~3天,需要开发,不限查询次数

插件嵌入:对接周期1天,基本不需要开发,每天只能查询3000次,如果查询量比较大,建议还是接口对接,还能对数据做存储和分析

一.接口对接

接口在对接前需要到快递鸟官网注册账号,免费注册的,注册后登录查看自己的接口ID和KEY,用于

对接的EBusinessID和APPKEY两个参数赋值。

接口规则:订单接收的信息(分给了的网点,业务员的信息),会通过推送接口推给客户(订阅并发不超过30次/S)客户需要按要求实现接口;仅支持Json格式;请求指令1008;测试接口地址:http://testapi.kdniao.cc:8081/api/dist;联调通过后请更换为正式地址:http://api.kdniao.cc/api/dist;分发及订阅接口需要客户方实现回调接口,回调RequestType(1008)

系统级和应用级输入参数

系统级输入参数

应用级输入参数

类型

是否必须

描述

RequestData(必填参数,请求内容,JSON格式,须和DataType一致))

CallBack

String

O

用户自定义回调信息

MemberID

String

O

会员标识(备用字段)

WareHouseID

String

O

仓库标识(备用字段)

CustomerName

String

O

电子面单客户账号

(与快递网点申请)

CustomerPwd

String

O

电子面单密码

SendSite

String

O

收件网点标识

ShipperCode

String

R

快递公司编码

LogisticCode

String

R

快递单号

OrderCode

String

O

订单编号

MonthCode

String

O

月结编码

PayType

Int

O

邮费支付方式:

1-现付,2-到付,3-月结,4-第三方支付

ExpType

String

O

快递类型:1-标准快件

Cost

Double

O

寄件费(运费)

OtherCost

Double

O

其他费用

Receiver

Company

String

O

收件人公司

Name

String

O

收件人

Tel

String

O

电话

Mobile

String

O

手机

PostCode

String

O

收件人邮编

ProvinceName

String

O

收件省(如广东省,不要缺少“省”)

CityName

String

O

收件市(如深圳市,不要缺少“市”)

ExpAreaName

String

O

收件区(如福田区,不要缺少“区”或“县”)

Address

String

O

收件人详细地址

Sender

Company

String

O

发件人公司

Name

String

O

发件人

Tel

String

O

发件人电话

Mobile

String

O

发件人手机

PostCode

String

O

发件人邮编

ProvinceName

String

O

发件省(如广东省,不要缺少“省”)

CityName

String

O

发件市(如深圳市,不要缺少“市”)

ExpAreaName

String

O

发件区(如福田区,不要缺少“区”或“县”)

Address

String

O

发件详细地址

StartDate

String

O

上门取货时间段:

"yyyy-MM-dd HH:mm:ss"格式化,本文中所有时间格式相同

EndDate

String

O

Weight

Double

O

物品总重量kg

Quantity

Int

O

件数/包裹数

Volume

Double

O

物品总体积m3

Remark

String

O

备注

IsNotice

Int

O

是否分发到快递公司:1-不分发;0-分发.默认为0

IsSendMessage

Int

O

是否订阅短信

0-不需要;1-需要

AddService

Name

String

0

增值服务名称

Value

String

0

增值服务值

CustomerID

String

0

客户标识(选填)

Commodity

GoodsName

String

O

商品名称

GoodsCode

String

O

商品编码

Goodsquantity

Int

O

件数

GoodsPrice

Double

O

商品价格

GoodsWeight

Double

O

商品重量kg

GoodsDesc

String

O

商品描述

GoodsVol

Double

O

商品体积m3

EBusinessID

String

R

商户ID

RequestType

String

R

请求指令类型:1008

DataSign

String

R

数据内容签名

DataType

String

R

请求、返回数据类型:2-json;

demo

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.security.MessageDigest; /**
*
* 快递鸟订阅推送2.0接口
*
* ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx
*/public class KdniaoSubscribeAPI {//DEMOpublic static void main(String[] args) {KdniaoSubscribeAPI api = new KdniaoSubscribeAPI();try {String result = api.orderTracesSubByJson();System.out.print(result);} catch (Exception e) {e.printStackTrace();}}//电商IDprivate String EBusinessID="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";//电商加密私钥,快递鸟提供,注意保管,不要泄漏private String AppKey="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";//测试请求urlprivate String ReqURL = "http://testapi.kdniao.cc:8081/api/dist";//正式请求url//private String ReqURL = "http://api.kdniao.cc/api/dist";/*** Json方式  物流信息订阅* @throws Exception */public String orderTracesSubByJson() throws Exception{String requestData="{'OrderCode': 'SF201608081055208281'," +"'ShipperCode':'SF'," +"'LogisticCode':'3100707578976'," +"'PayType':1," +"'ExpType':1," +"'CustomerName':'',"+"'CustomerPwd':''," +"'MonthCode':''," +"'IsNotice':0," +"'Cost':1.0," +"'OtherCost':1.0," +"'Sender':" +"{" +"'Company':'LV','Name':'Taylor','Mobile':'15018442396','ProvinceName':'上海','CityName':'上海','ExpAreaName':'青浦区','Address':'明珠路73号'}," +"'Receiver':" +"{" +"'Company':'GCCUI','Name':'Yann','Mobile':'15018442396','ProvinceName':'北京','CityName':'北京','ExpAreaName':'朝阳区','Address':'三里屯街道雅秀大厦'}," +"'Commodity':" +"[{" +"'GoodsName':'鞋子','Goodsquantity':1,'GoodsWeight':1.0}]," +"'Weight':1.0," +"'Quantity':1," +"'Volume':0.0," +"'Remark':'小心轻放'}";Map<String, String> params = new HashMap<String, String>();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "1008");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;}/*** 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(); }
}

二.插件嵌入(PC)

接口说明

(1)在项目中引入KDNWidget.js/KDNWidget.css库文件(请查看附件)。 
(2)接口需要指定快递单号的快递公司编码、快递运单号、服务类型、容器的ID以及展示类型,格式不对或则编码错误都会返失败的信息。 
如:中通物流单号应选择快递公司编码(ZTO)(编码可以在官网下载)
(3)返回的物流跟踪信息按照发生的时间升序排列。

请求系统级参数说明:

参数名称 类型 说明 必须要求
serviceType String 服务类型请输入"R" R
expCode String 快递公司编码 R
expNo String 快递公司运单号 R
showType String 呈现方式(normal-直接展示 pop-弹窗显) O
container String 嵌入容器html元素ID(不要加#号) R

备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)

插件调用示例

 <html><head>要引入的CSS文件:<link rel="stylesheet" href="KDNWidget.css"></head><body>页面其它标签要引入的JS文件:<script src="KDNWidget.js"></<script><script>KDNWidget.run({serviceType: "B",expCode:"453173031799",expNo:"453173031799",showType:"normal"container: "demoID",})</script>  </body></html>

转载于:https://blog.51cto.com/couldbe/1976729

简单快递查询接口API/插件开发使用相关推荐

  1. PHP快递查询接口api和快递单号智能判断PHP代码

    如果电商企业想将业务提升到一个新的水平,则应考虑接入第三方快递查询API接口.快递查询API接口提供了很多好处,并且可以为电商企业.微商带来强大的竞争优势.因为相对于独立一家家对接各个快递公司的服务接 ...

  2. 快递鸟快递实时快递查询接口API案例代码

    一.快递查询接口API描述 快递鸟实时快递查询接口输入运单号自动识别物流公司编码,实时返回最新物流轨迹. (1)接口支持按照运单号查询(单个查询). (2)接口需要指定快递单号,格式不对或则编码错误都 ...

  3. 快递100快递实时快递查询接口API案例代码

    一.实时快递查询接口 1.1 请求地址 https://poll.kuaidi100.com/poll/query.do 1.2 请求类型 post 1.3 输入参数 请求参数(header) 名称 ...

  4. 简单快递鸟单号识别查询接口API/插件开发使用

    快递接口/插件是电商网站和系统商用来实现查询快递功能的主要方法,就类似淘宝京东查询物流轨迹一样,嵌入到自己系统里. 现在有好几家公司都提供集成的接口,就是对接或嵌入一次,就能查询多家快递公司信息.比较 ...

  5. 企业如何挑选和使用快递查询接口?

    电商订单履行的过程中充满了英文首字母缩写词.从WMS到FBA再到ERP,人们常常会感觉到零售商们坐在一碗字母汤里游泳!在这些行话中,有一个缩写词可以将它们连接在一起那就是:API. API可以帮助线上 ...

  6. 全国快递物流查询-快递单号查询接口api

    电商,ERP厂商可能需要物流信息接口,对运单号的物流轨迹进行跟踪,通常有些免费的不好用,及时性要求达不到,收费的也太贵了.最近发现一个免费的API接口,及时性非常高,基本上就是实时返回. 快递查询接口 ...

  7. 快递查询接口 常用快递单号查询API示例分享

    快递查询接口是对外开放的应用程序接口,基于该API开发自己的快递查询应用程序. 接口名称:快递单号查询接口 接口平台:快递鸟 接口申请地址:http://www.kdniao.com/reg (1)查 ...

  8. GoTrace快递查询接口

    GoTrace简介 gotrace网站[http://www.gotrace.cn],专业快递查询跟踪.于2013年10月正式发布上线,是一个集全世界100多个国家的国际挂号.国际快递.国际包裹等跟踪 ...

  9. 快递查询接口的调用与解析案例

    GoTrace简介 gotrace网站[http://www.gotrace.cn],专业快递查询跟踪.于2013年10月正式发布上线,是一个集全世界100多个国家的国际挂号.国际快递.国际包裹等跟踪 ...

最新文章

  1. 用sql语句实现按时间求累计值
  2. 2018/12/08 L1-045 宇宙无敌大招呼 java
  3. 系统变量file.encoding对Java的运行影响有多大?(转)good
  4. 上传一批动画教程(链接已失效)
  5. 截取AVI格式的视频C语言代码
  6. Matlab线性/非线性规划优化算法(3)
  7. JAVA编程规范-命名规范
  8. 苹果mac需牢记的SSH命令
  9. RSS文件的基本格式
  10. c#明华rf读卡器_RF通用开发包 明华RF读卡器 demo for c#(RF reader demo for c#) - 下载 - 搜珍网...
  11. 时间序列R语言操作——非平稳时间序列变平稳
  12. 使用阿里云发送短信验证码教程(简单易学)
  13. 基于R语言的现代贝叶斯统计学(INLA下的贝叶斯回归、多层贝叶斯回归、生存分析、随机游走模型、广义可加模型、极端数据的贝叶斯分析等)
  14. python识别文字坐标_python识别图片上的文字并返回文字在图片中的坐标
  15. 小米34寸带鱼屏显示器的耗电计算
  16. 关于元素定位使用class_name定位报错的部分问题Unable to locate element: {“method“:“css selector“
  17. 为什么电子邮件的账号地址公司是统一的,电子邮件地址该怎么写?
  18. matlab工序,Matlab学习日志——基于遗传算法的车间调度
  19. iOS汉字字符串转拼音
  20. 图书管理系统之DAO设计与实现

热门文章

  1. SpringCloud微服务架构使用心得
  2. 隐藏在手机中的第二个操作系统
  3. Eclipse版本和JDK版本对应关系(转)
  4. 路径规划Dijkstra算法
  5. 什么是应用程序签名,为什么要为应用程序签名
  6. Vite(四)后端集成、比较Snowpack、从 v1 迁移、Awesome Vite.js
  7. Tomcat 优雅关闭之路
  8. mysql微信昵称特殊符号_MySQL保存微信昵称中的特殊符号造成:(Incorrect string value: xxxx'for column ‘name’ at row 1)异常...
  9. JavaScript中if语句
  10. WWW2021:细粒度城市流量预测(附论文链接)