公司开发了一个订单小程序。需要对接物流。查询发货的快递单号。得到物流信息。展示给各地的项目经理。奈何刚接触微信小程序有很多东西都不会。就先用andorid把快递鸟的接口对了一下。非常的容易。首先登录快递鸟的官网注册一个账号。得到一个

EBusinessID=""           ApiKey=""

这两个参数登录以后就可以看到。在下面的代码地方改一下。订单号我随便传了一个我公司的订单。安能快递的订单:

ShipperCode是快递公司的代码。LogisticCode是运单号。快递鸟官网有
快递鸟现在支持的快递也很多。本来是非常方便的。一次对接。哪里都能用。但是查询顺丰快递的时候需要传递发货方或者收货方的末尾4位电话号码。并且是必填项。这就很操蛋了。识别出单号容易。可是识别出电话号码后四位很难呀。本来想的是让发快递的同事手动去填。后来觉得这样太娄了。最后我又单独去顺丰官网对接了顺丰的api接口。把传递电话号码后四位这个问题解决了。后期的时候。我在附上顺丰的对接流程。总之对接了4天才对接完。时间都是浪费在小程序上的。java上基本是分分钟解决的。将以下代码复制过去调用即可。此处只需要注意那个 RequestData 组装的参数非常微妙。改动以后md5就出问题了。后期直接把ShipperCode,LogisticCode的value值写一个固定的字符串。用replace方法去替换快递公司和运单号即可。不要动那个字符串。否则会md5校验失败的。

package meiaomie.com.invoicing.utils;
import android.util.Log;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.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.security.MessageDigest;import Decoder.BASE64Encoder;/*** 即时查询接口* 此接口用于向快递公司实时查询物流轨迹信息。该功能支持情况需查看技术文档。* 正式地址:https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx*** 系统级参数* RequestData    String   R   请求内容为JSON格式 详情可参考接口技术文档:https://www.kdniao.com/documents* EBusinessID       String   R   用户ID* RequestType      String   R   请求接口指令* DataSign           String   R   数据内容签名,加密方法为:把(请求内容(未编码)+ApiKey)进行MD5加密--32位小写,然后Base64编码,最后进行URL(utf-8)编码* DataType          String   R   DataType=2,请求、返回数据类型均为JSON格式* 应用级参数* R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)* OrderCode   String(30)    O   订单编号* ShipperCode     String(10)    R   快递公司编码  详细编码参考《快递鸟接口支持快递公司编码.xlsx》 https://www.kdniao.com/documents* LogisticCode     String(30)    R   快递单号* CustomerName    String(50)    C   ShipperCode为SF时必填,对应寄件人/收件人手机号后四位;ShipperCode为其他快递时,可不填或保留字段,不可传值* 请求示例* ZTO请求示例:* {* "OrderCode": "",* "ShipperCode": "ZTO",* "LogisticCode": "638650888018",* }** JD请求示例:* {* "OrderCode": "",* "CustomerName": "",* "ShipperCode": "JD",* "LogisticCode": "JDVA00003618100",* }** SF请求示例:* {* "OrderCode": "",* "CustomerName": "1234",* "ShipperCode": "SF",* "LogisticCode": "SF00003618100",* }*/public class KdApiSearchDemo {private String EBusinessID="";//即用户ID,private String ApiKey="";//即API key,登录快递鸟官网https://www.kdniao.com/UserCenter/v4/UserHome.aspx//请求url, 正式环境地址private String ReqURL="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";public static void main() {try {KdApiSearchDemo api = new KdApiSearchDemo();api.orderOnlineByJson();} catch (Exception e) {e.printStackTrace();}}Map<String,String> params = new HashMap<String,String>();String result="";//即时查询接口public String orderOnlineByJson() throws Exception{// 组装应用级参数String RequestData= "{"+"'CustomerName':'',"+"'OrderCode':'',"+"'ShipperCode':'ANE',"+"'LogisticCode':'300471491371'"+"}";// 组装系统级参数params.put("RequestData", urlEncoder(RequestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "1002");//免费即时查询接口指令1002/在途监控即时查询接口指令8001/地图版即时查询接口指令8003String dataSign=encrypt(RequestData, ApiKey, "UTF-8");Log.e("dataSign", dataSign );params.put("DataSign", urlEncoder(dataSign, "UTF-8"));params.put("DataType", "2");// 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数Thread thread=new Thread(new Runnable() {@Overridepublic void run() {result=sendPost(ReqURL, params);}});thread.start();//根据公司业务处理返回的信息......return result;}/*** MD5加密* str 内容* 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));}Log.e("md5", sb.toString().toLowerCase());return sb.toString().toLowerCase();}public static String MD5Encode(String str) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance("MD5");messageDigest.reset();messageDigest.update(str.getBytes("UTF-8"));} catch (NoSuchAlgorithmException e) {System.out.println("NoSuchAlgorithmException caught!");System.exit(-1);} catch (UnsupportedEncodingException e) {e.printStackTrace();}byte[] byteArray = messageDigest.digest();StringBuffer md5StrBuff = new StringBuffer();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));elsemd5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));}Log.e("md5", md5StrBuff.toString().toLowerCase());return md5StrBuff.toString();}public static String MD5(String str) throws NoSuchAlgorithmException {Log.e("key", str );String encode = str;StringBuilder stringbuilder = new StringBuilder();MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(encode.getBytes());byte[] str_encoded = md5.digest();for (int i = 0; i < str_encoded.length; i++) {if ((str_encoded[i] & 0xff) < 0x10) {stringbuilder.append("0");}stringbuilder.append(Long.toString(str_encoded[i] & 0xff, 16));}return stringbuilder.toString();}/*** base64编码* str 内容* charset 编码方式* @throws UnsupportedEncodingException*/private String base64(String str, String charset) throws UnsupportedEncodingException{String encoded = new BASE64Encoder().encode(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签名生成* content 内容* keyValue ApiKey* charset 编码方式* @throws UnsupportedEncodingException ,Exception* @return DataSign签名*/@SuppressWarnings("unused")private  String encrypt (String content,String keyValue,String charset) throws UnsupportedEncodingException, Exception{if (keyValue != null){Log.e("md5", base64(MD5(content + keyValue), charset));return base64(MD5(content + keyValue), charset);}return base64(MD5(content + keyValue), charset);}/*** 向指定 URL 发送POST方法的请求* url 发送请求的 URL* 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();}}Log.e( "main: ",result.toString());return result.toString();}
}

//在android界面随便写一个button,点击执行这个方法就可以查到快递接口了
KdApiSearchDemo demo=new KdApiSearchDemo();demo.main();

可以先测试下。下一篇准备写微信小程序对接的过程。

Android 对接快递鸟接口相关推荐

  1. 微信小程序对接快递鸟接口返回格式有误的解决

    小程序对接快递鸟接口也是先在快递鸟的官网下载一个 nodejs的示例代码.因为我是小程序新手.所以花的时候有点多了.小程序的加密和解密需要用到两个js类.我先传上来. md5.js function ...

  2. 都说快递鸟接口好,对接快,可是为什么我搞了几个小时还没有搞完

    快递鸟接口对接加密时应该是DataSign== 签名摘要(URL编码:UTF-8(base64(MD5(数据内容 +AppKey)))) ,可是文档上只写了md5加密,base64加密也应该提示下需要 ...

  3. 快速免费对接快递鸟圆通快递单号查询api接口

    快递查询API接口是使用的物流单号即可实现查询物流信息.主要应用在电商商城.ERP系统商.WMS系统商.快递柜.银行等企业.多家快递物流公司接口统一接入,建议对接接口提供商,一次性可以接入多家快递,在 ...

  4. python免费对接快递鸟api单号识别查询接口

    技术文档请参考快递鸟官网api:免费查询快递接口_100%安全保障_物流即时查询API-快递鸟 快递公司编码链接:https://www.kdniao.com/file/2019快递鸟接口支持快递公司 ...

  5. 快递鸟接口的调用过程

    快递鸟基于自有技术打造独立第三方平台,专注打造物流数据服务:支持全球1600+家快递物流查询接口:40+家常用快递公司电子面单:9家主流快递公司上门取件业务. 关于快递鸟API接口, 一.官方文档的地 ...

  6. python摄像头识别快递单号查询_python如何免费对接快递鸟api单号识别查询接口

    (一)接入流程: 1.登录快递鸟官网注册页面注册快递鸟账号 2.登录快递鸟用户管理后台 注:登录快递鸟用户管理后台后获得用户ID和APIKey,此用于保证应用来源的可靠性,避免应用伪造,被不法使用. ...

  7. python摄像头识别快递单号查询_免费对接快递鸟api单号识别查询接口(python)

    由于自己网站需要对接一些物流查询快递,然后在网上搜了一圈发现快递鸟比较适合我 之前写快递api的时候,官网上只有php和.net的示例,而我使用python封装的相关功能踩了许多坑,才搞出来,分享一下 ...

  8. 圆通快递查询电子面单接口对接快递鸟api指南

    一.接入前准备(TO商家业务人员) 1.申请快递鸟用户ID和API key 1.1登录快递鸟官网注册页面http://www.kdniao.com/reg注册快递鸟账号: 1.2登录快递鸟用户管理后台 ...

  9. 免费电子面单Api_快递鸟接口JAVA对接调用案例

    电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单. 一. ...

最新文章

  1. 微软虚拟化解决方案课件
  2. 设置ECLIPSE插件注意目录的结构
  3. JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
  4. Prototype Pattern(原型模式)
  5. 理解oracle的共享连接和专用连接
  6. 计算机网络复习-应用层
  7. 个人管理 - 程序员的四个阶段
  8. boost::program_options模块实现支持自定义选项语法的测试程序
  9. Java黑皮书课后题第4章:4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串
  10. Linux系统文件编程(1)
  11. 9206 课堂笔记 综合演练 添加数据与非空验证
  12. python assert
  13. php重定向函数是什么,php中url重定向的方法
  14. 04-AskDoctorForHelp-向医生寻求帮助
  15. Android获取系统ID(com.android.internal.R)
  16. 蓝桥杯 C语言 试题 算法训练 猴子分苹果
  17. 设置win10保护色
  18. 八种常见的防盗链方法总结及分析 (转自http://www.cnblogs.com/uubox)
  19. 快速搭建centos7虚拟机——使用virtualbox+vagrant
  20. 一文详尽混淆矩阵、准确率、精确率、召回率、F1值、P-R 曲线、ROC 曲线、AUC 值、Micro-F1 和 Macro-F1

热门文章

  1. Shell脚本编程项目实战(必看)
  2. redis基础和使用篇(一)--简介
  3. 文件服务器和nas存储,nas存储 文件服务器
  4. r语言和metawin_学会这些R语言技巧至少可以节省半年时间
  5. describe() matplotlib
  6. C语言getchar()函数理解及其用法
  7. URAL 1489 Points on a Parallelepiped
  8. MySQL基础入门到索引优化
  9. 树莓派python编程优点_树莓派为什么会使用python编程?为什么有时python运行效率不高?...
  10. 天气预报demo (ShareREC 官网 MobAPI)