物流跟踪 调用快递鸟API
概要:关于调用快递鸟API,我有几句话想说,有几行代码想写
业务需求:就是做做商城,卖卖东西。然后需要做个物流跟踪的功能
需要获取的信息大概就是这个样子
现在看这个快递怎么这么慢
如何实现?
直接调用快递鸟API。
首先登陆快递鸟官网,浏览器搜索www.baidu.com,然后搜索关键字 快递鸟。(感谢百度对我的学习方面一直以来给予的帮助,谢谢)
然后注册一个官网的账号,认证自己的用户信息,记住自己的用户ID和API key,代码里调用接口时会使用到。我这里主要做个物流跟踪的功能,所以我需要调用的物流跟踪API,所以我需要先订阅这个API的服务。大家如果想调用别的接口就相应的去订阅就可以了。
然后在官网找到这里 点击下载相应语言的demo
直接使用demo里面的代码即可,只需要改变一下EBusinessID和AppKey的值
- @RestController
- @RequestMapping("/admin/logistics")
- @Validated
- @Api(description = "物流追踪接口")
- public class AdminKdniaoTrackQueryAPI {
- //用户ID
- private String EBusinessID="用户ID";
- //电商加密私钥,快递鸟提供,注意保管,不要泄漏
- private String AppKey="API key";
- //请求url
- private String ReqURL="http://api.kdniao.com/api/dist";
- @RequiresPermissions("admin:logistics:getOrderTracesByJson")
- //@RequiresPermissionsDesc(menu = {"物流管理", "物流追踪"}, button = "查询")
- @ApiOperation(value = "根据物流单号和快递公司编码查询物流信息", notes = "根据物流单号和快递公司编码查询物流信息", httpMethod = "GET")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "shipChannel", value = "快递公司编码",dataType = "String"),
- @ApiImplicitParam(name = "shipSn", value = "物流单号", dataType = "String" )
- })
- @ResponseBody
- @GetMapping("/getOrderTracesByJson")
- public String getOrderTracesByJson(String shipChannel, String shipSn) throws Exception{
- String requestData= "{'OrderCode':'','ShipperCode':'" + shipChannel + "','LogisticCode':'" + shipSn + "'}";
- Map<String, String> params = new HashMap<>();
- params.put("RequestData", urlEncoder(requestData, "UTF-8"));
- params.put("EBusinessID", EBusinessID);
- params.put("RequestType", "");
- String dataSign=encrypt(requestData, AppKey, "UTF-8");
- params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
- params.put("DataType", "");
- String result=sendPost(ReqURL, params);
- //根据公司业务处理返回的信息......
- return result;
- }
- /**
- * MD5加密
- * @param str 内容
- * @param charset 编码方式
- * @throws Exception
- */
- 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();
- for (int i = ; i < result.length; i++) {
- int val = result[i] & 0xff;
- if (val <= 0xf) {
- sb.append("");
- }
- 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;
- }
- 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签名
- */
- private String encrypt (String content, String keyValue, String charset) throws 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 远程资源的响应结果
- */
- 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()>){
- 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', '', '', '', '',
- '', '', '', '', '', '', '+', '/' };
- public static String base64Encode(byte[] data) {
- StringBuffer sb = new StringBuffer();
- int len = data.length;
- int i = ;
- int b1, b2, b3;
- while (i < len) {
- b1 = data[i++] & 0xff;
- if (i == len)
- {
- sb.append(base64EncodeChars[b1 >>> ]);
- sb.append(base64EncodeChars[(b1 & 0x3) << ]);
- sb.append("==");
- break;
- }
- b2 = data[i++] & 0xff;
- if (i == len)
- {
- sb.append(base64EncodeChars[b1 >>> ]);
- sb.append(base64EncodeChars[((b1 & 0x03) << ) | ((b2 & 0xf0) >>> )]);
- sb.append(base64EncodeChars[(b2 & 0x0f) << ]);
- sb.append("=");
- break;
- }
- b3 = data[i++] & 0xff;
- sb.append(base64EncodeChars[b1 >>> ]);
- sb.append(base64EncodeChars[((b1 & 0x03) << ) | ((b2 & 0xf0) >>> )]);
- sb.append(base64EncodeChars[((b2 & 0x0f) << ) | ((b3 & 0xc0) >>> )]);
- sb.append(base64EncodeChars[b3 & 0x3f]);
- }
- return sb.toString();
- }
- }
这里提供一个快递鸟API的官方技术对接交流群:705144434
物流跟踪 调用快递鸟API的更多相关文章
- TP5 调用快递鸟api 查询快递信息
1,去快递鸟,下载sdk https://www.kdniao.com/api-track 下载PHPsdk 2,下载下来的事PHP文件,不是以类的形式显示的,所以为了方便,我把他封装成了类,不需要封 ...
- 如何使用Postman快速简单的调用快递物流平台快递鸟API接口
前沿 快递鸟是一家聚合类的第三方快递物流平台,目前该平台提供的产品主要以API为主.由于API不能直观的看到产品效果,需要进行API对接联调成功后才能真实的看到产品的实际效果.但是如果一上来就写代码进 ...
- 物流一站式单号查询之快递鸟API接口(附Demo源码)
连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ...
- 快递鸟API接口调用代码示例(免费不限量)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- JAVA 快递查询接口API调用-快递鸟接口
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- PHP实现物流查询(通过快递网API实现)
物流查询实现 引 言:目前快递公司太多了,不可能一个一个去申请api查询.这个时候,就可以通过合作,找一些中间商合作.我试了两家,一家是快递100,一家是快递网. 他们都需要申请key.但是快递100 ...
- 解决在TP5中无法使用快递鸟的即时查询API
快递鸟的接口对接其实很简单,先去官网注册账号,登陆把基本信息填好,然后在产品管理中订购一下“物流查询”,免费,不过其他产品是收费,免费的有对接口调用频率限制,结合自己的应用流量够用就可以. 使用前复制 ...
- 调用第三方物流公司API即时查询物流信息
主要是利用快递鸟提供的物流服务,通过对接快递鸟的API,调用即时查询接口,获取物流信息. 这里采用java语言,调用快递鸟的接口为例.步骤如下: 1.首先,得去快递鸟的官方网站注册一个账号并进行实名认 ...
- 快递鸟顺丰物流api接口对接多种方法整理
目前很多自营电商平台.ERP系统.仓储系统.快递柜企业,对物流模块数据需求还是比较旺盛的.之前有介绍过简单的接口对接方法,这次给大家整理介绍两种快递数据的获取方法. 接口秘钥可以向顺丰公司申请,或者一 ...
随机推荐
- asp.net mvc Bundle
在使用ASP.NET MVC4中使用BundleConfig 将 js css文件 合并压缩使用,但是文件名含有min及特殊字符的将不引用 ,也不提示其他信息.
- php 算法知识 冒泡排序
function bubble_order($arr){ //得到长度 $count_num=count($arr); for($k=1;$k<$count_num;$k++){ //对长度越来 ...
- Python 基础之面向对象之八步理解装饰器
装饰器:在不改变原有代码的情况下,为该原函数扩展新功能特征:返回新函数,替换旧函数语法:@ 语法糖 1.装饰器原型 #例1: def kuozhan(func): def newfunc(): ...
- 面试问题之——给你图片的url,你能知道它所占的字节空间吗?
从一个需求说起 这标题起得有点标题党,实际情况是我最近在做一个公司内部工具时,遇到了这么一个需求,给定一个静态资源站点上某张图片的url(比如https://a.xxxcdn.com/demo.jpg ...
- selenium 获取table数据
public class Table { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...
- Java--对象与类(二)
final 实例域 可以将实例域定义为final.构建对象时必须初始化这样的域.也就是说在一个构造器执行之后,这个域被设置,并且之后无法对其修改 final 修饰符大多应用于基本(primitive) ...
- 【 JdbcUtils 】mysql数据库查询
JdbcUtils package k.util; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; i ...
- Django:cookie和session相关问题
http://www.cnblogs.com/fnng/p/3750596.html http://www.cnblogs.com/chenchao1990/p/5283725.html
- C++11常用特性介绍——auto类型修饰符
1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...
- Curl常用函数介绍
一.LibCurl基本编程框架 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libc ...