如何最快实现物流即使查询功能-物流轨迹查询API

上一篇文章我们介绍了一个物流服务提供商,推荐大家使用快递鸟接口,主要介绍了如何注册账号,获得密钥,找不到注册地址的,我在发一下:

http://kdniao.com/reg

今天我们来聊如何利用快递鸟提供的接口来实现即时查询。

在开发之前,我们先来了解一下什么是即时查询,按我的理解就是,我们提供运单号和快递公司编码,然后调用快递鸟提供的查询接口,即可查询运单号的发货情况,我们可以通过这个接口获悉到包裹的收件时间,派送时间,签收时间,签收人,如果体验做的更好一点,通过大数据可以分析这个包裹的预计派送时间。

以下是我通过调用快递鸟接口提供的即时查询接口获得的内容:

外观显示效果可以忽略,这是我项目应用的截图,我们得到轨迹信息以后,可以按自己的页面风格最终呈现给客户。

好了,现在我们来聊一聊具体实现吧!

首先我们准备好需要用到的资源,

测试商户ID:

test1617571

测试API key:

554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用)

API测试地址:

http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json

我的项目是用C#开发的,所以我以C#开发为例来讲解,后期有需求也可以提供Java,PHP的文章

我们先来解读一下快递鸟官网提供的接口文档说明

这个使用流程图我是在快递鸟官网截图的,我们先来梳理一下几个角色

1,          用户,这个很好理解,就是我们这群开发人员,苦逼的程序员

2,          快递鸟,这个写的也很清楚了,就是物流服务提供商

3,          客户,这是我们自己的客户,我们得到快递鸟的数据以后是需要内部封装,通过各种界面展示给我们真正的上帝看的,客户看到的是我们再次封装的信息,当然如果你想把快递鸟返回的信息直接暴露给你的客户看,我也不反对。只能说,你是最棒的。

接下来,我们讲解一下请求参数

请求系统级参数说明:

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

这里提到了系统级参数,也相当于是公用参数,这些参数是调用每个接口都是必须要传参的。

接口参数:

接口参数,也叫业务参数,请求的业务接口不同,参数的字段,内容也不同,是跟着业务变化的,这里我们实现的是即时查询接口,快递鸟官网要求必须传递快递公司编码和物流单号

物流单号很好理解,就是快递面单上的运单号,快递公司编码是必须传递快递鸟支持的编码,你可能会问,我如何能知道快递鸟支持哪些快递公司,不急,马上告诉你。

下载快递公司编码:

http://www.kdniao.com/documents

上一篇文章有提到,下载下来你就秒懂了,哈哈!

正如我前面的轨迹截图,是一个中通的轨迹数据,中通快递的编码是ZTO,物流单号是78120038107849

业务参数报文组合如下:

{‘OrderCode‘:‘‘,‘ShipperCode‘:‘ZTO‘,‘LogisticCode‘:‘78120038107849‘}

请求的完整报文:

RequestData=%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27ZTO%27%2c%27LogisticCode%27%3a%2778120038107849%27%7d&EBusinessID=1617571&RequestType=1002&DataSign=YzBmYTViYmExZmFhOGY1ZTY3MWY5OGFjYWRhNWVjNjU%3d&DataType=2

返回的报文信息:

{ "LogisticCode" : "78120038107849", "ShipperCode" : "ZTO", "Traces" : [ { "AcceptStation" : "【济源市】 【济源】(0391-6965909) 的 张霞(18839032214) 已揽收", "AcceptTime" : "2020-01-16 18:30:33" }, { "AcceptStation" : "【济源市】 快件离开 【济源】 已发往 【深圳中心】", "AcceptTime" : "2020-01-16 18:36:41" }, { "AcceptStation" : "【新乡市】 快件已经到达 【新乡中转】", "AcceptTime" : "2020-01-16 22:45:49" }, { "AcceptStation" : "【新乡市】 快件离开 【新乡中转】 已发往 【深圳中心】", "AcceptTime" : "2020-01-16 22:47:48" }, { "AcceptStation" : "【深圳市】 快件已经到达 【深圳中心】", "AcceptTime" : "2020-01-18 04:05:46" }, { "AcceptStation" : "【深圳市】 快件离开 【深圳中心】 已发往 【深圳龙华】", "AcceptTime" : "2020-01-18 08:34:46" }, { "AcceptStation" : "【深圳市】 快件已经到达 【深圳龙华】", "AcceptTime" : "2020-01-18 13:14:10" }, { "AcceptStation" : "【深圳市】 【深圳龙华】 的陈智龙-王颖(13923773902) 正在第1次派件, 请保持电话畅通,并耐心等待(95720为中通快递员外呼专属号码,请放心接听)", "AcceptTime" : "2020-01-18 16:38:35" }, { "AcceptStation" : "【深圳市】 快件已由【丰巢的鑫茂花园A区(丰巢智能快递柜)】代签收, 如有问题请电联(13923773902 / 4000633333,18025858922), 感谢您使用中通快递, 期待再次为您服务!", "AcceptTime" : "2020-01-18 17:32:15" } ], "State" : "3", "EBusinessID" : "1617571", "Success" : true }

C#关键代码:

string requestData = "{‘OrderCode‘:‘‘,‘ShipperCode‘:‘ZTO‘,‘LogisticCode‘:‘78120038107849‘}";

string dataSign = encrypt(requestData, “554343b2-7252-439b-b4eb-1af42c8f2175”, "UTF-8");

/// <summary>

/// 即时查询物流轨迹

/// </summary>

/// <param name="url">http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json</param>

/// <param name="eBusinessID">test1617571</param>

/// <param name="appKey">554343b2-7252-439b-b4eb-1af42c8f2175</param>

/// <param name="requestData">{‘OrderCode‘:‘‘,‘ShipperCode‘:‘ZTO‘,‘LogisticCode‘:‘78120038107849‘}</param>

/// <returns></returns>

public string getOrderTracesByJson(string url,string eBusinessID, string appKey, string requestData)

{

Dictionary<string, string> param = new Dictionary<string, string>();

param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));

param.Add("EBusinessID", eBusinessID);

param.Add("RequestType", "1002");

string dataSign = encrypt(requestData, appKey, "UTF-8");

param.Add("DataSign", HttpUtility.UrlEncode(dataSign, Encoding.UTF8));

param.Add("DataType", "2");

string result = sendPost(url, param);

return result;

}

/// <summary>

/// Post方式提交数据,返回网页的源代码

/// </summary>

/// <param name="url">发送请求的 URL</param>

/// <param name="param">请求的参数集合</param>

/// <returns>远程资源的响应结果</returns>

private string sendPost(string url, Dictionary<string, string> param)

{

string result = "";

StringBuilder postData = new StringBuilder();

if (param != null && param.Count > 0)

{

foreach (var p in param)

{

if (postData.Length > 0)

{

postData.Append("&");

}

postData.Append(p.Key);

postData.Append("=");

postData.Append(p.Value);

}

}

// return postData.ToString();

byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(postData.ToString());

try

{

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.ContentType = "application/x-www-form-urlencoded";

request.Referer = url;

request.Accept = "*/*";

request.Timeout = 30 * 1000;

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";

request.Method = "POST";

request.ContentLength = byteData.Length;

Stream stream = request.GetRequestStream();

stream.Write(byteData, 0, byteData.Length);

stream.Flush();

stream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream backStream = response.GetResponseStream();

StreamReader sr = new StreamReader(backStream, Encoding.GetEncoding("UTF-8"));

result = sr.ReadToEnd();

sr.Close();

backStream.Close();

response.Close();

request.Abort();

}

catch (Exception ex)

{

result = ex.Message;

}

return result;

}

///<summary>

///电商Sign签名

///</summary>

///<param name="content">内容</param>

///<param name="keyValue">Appkey</param>

///<param name="charset">URL编码 </param>

///<returns>DataSign签名</returns>

private string encrypt(String content, String keyValue, String charset)

{

if (keyValue != null)

{

return base64(MD5(content + keyValue, charset), charset);

}

return base64(MD5(content, charset), charset);

}

///<summary>

/// 字符串MD5加密

///</summary>

///<param name="str">要加密的字符串</param>

///<param name="charset">编码方式</param>

///<returns>密文</returns>

private string MD5(string str, string charset)

{

byte[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);

try

{

System.Security.Cryptography.MD5CryptoServiceProvider check;

check = new System.Security.Cryptography.MD5CryptoServiceProvider();

byte[] somme = check.ComputeHash(buffer);

string ret = "";

foreach (byte a in somme)

{

if (a < 16)

ret += "0" + a.ToString("X");

else

ret += a.ToString("X");

}

return ret.ToLower();

}

catch

{

throw;

}

}

/// <summary>

/// base64编码

/// </summary>

/// <param name="str">内容</param>

/// <param name="charset">编码方式</param>

/// <returns></returns>

private string base64(String str, String charset)

{

return Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));

}

附上详细的接口文档给大家:

http://www.kdniao.com/documents

原文地址:https://www.cnblogs.com/51api/p/12268530.html

时间: 2024-11-07 21:41:06

如何最快实现物流即使查询功能-物流轨迹查询API的相关文章

Navicat查询功能怎么用

Navicat主要功能包括 SQL 创建工具或编辑器.数据模型工具.数据传输.导入或导出.数据或结构同步.报表.以及更多.今天我们主要讲Navicat查询功能.其查询功能是根据用户的需求从数据库提取数据.Navicat 提供两个强大的工具与 SQL 查询工作:查询编辑器可直接编辑查询文本,查询创建工可来视觉化创建查询.用户可以保存查询用作设置计划,点击 Navicat 主界面的“查询”按钮可打开查询对象列表.或在主窗口点击“新建查询”按钮打开查询创建工具或查询编辑器. Navicat 查询按钮

CAD绘图时,ID坐标查询功能

我们在日常的CAD绘图设计过程中,常常会用到CAD查询功能,其中查询坐标功能是一个特别常用的功能之一,我们要绘制出精准优质的CAD图纸,就必须要熟练地掌握好CAD绘图的各项功能,CADID坐标查询功能当然也必须要熟练地使用.小编今天就给大家分享一下如何使用ID坐标查询功能的具体方法.演示步骤如下: 步骤一:准备CAD图形素材 1.首先我们当然是先运行迅捷CAD编辑器专业版,然后打开一张我们需要的CAD素材图纸: 2.或是在CAD绘图区域里任意绘制一个图形作为素材,我们在这里绘制一个矩形为例. 步

物流即时查询功能-百世快递

今天我们来聊如何利用快递鸟提供的接口来查询百世快递的物流轨迹. 讲解之前我们来看一下,接口完成以后的实际显示效果 以下是产品应用截图,调用快递鸟接口获得的轨迹信息: 实际上快递鸟返回的报文信息会更详细,在给客户展示的信息可根据产品需要来封装返回轨迹信息. 现在我们来聊一聊具体实现! 首先我们准备好需要用到的资源, 测试商户ID: test1617571 测试API key: 554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用) API测试地址: h

物流即时查询功能-韵达快递

今天我们来聊如何利用快递鸟提供的接口来查询韵达快递的物流轨迹. 讲解之前我们来看一下,接口完成以后的实际显示效果 以下是产品应用截图,调用快递鸟接口获得的轨迹信息: 实际上快递鸟返回的报文信息会更详细,在给客户展示的信息可根据产品需要来封装返回轨迹信息. 现在我们来聊一聊具体实现! 首先我们准备好需要用到的资源, 测试商户ID: test1617571 测试API key: 554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用) API测试地址: h

物流即时查询功能-申通快递

今天我们来聊如何利用快递鸟提供的接口来查询[申通快递]的物流轨迹. 讲解之前我们来看一下,接口完成以后的实际显示效果 以下是我调用快递鸟接口获得的申通物流轨迹信息,显示的界面效果需要自己开发: 现在我们来聊一聊具体实现! 首先我们准备好需要用到的资源, 测试商户ID: test1617571 测试API key: 554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使用) API测试地址: http://sandboxapi.kdniao.com:808

物流轨迹查询API - 产品应用篇

上一篇文章我们介绍了,如何利用快递鸟提供的接口来实现即时查询以及物流跟踪.提供了C#版本,Java版本, PHP的代码来实现接口对接, 今天我们聊聊,如何应用这个产品,能为我们做些什么? 如果你是电商平台.自营商城.ERP.打单工具.楼宇/物业系统.云打印.微信小程序/公众号.APP.OA等,那你一定需要这个功能,有配货业务,就有获取物流轨迹信息的需求. 快递鸟接口作为第三方接口,集合了多家物流的数据,通过规范格式统一输出一套规则,不对物流信息做处理,不做语言转换,只对数据字段做转换,分析物流状

【百度地图API】小学生找哥哥——小学生没钱打车,所以此为公交查询功能

原文:[百度地图API]小学生找哥哥--小学生没钱打车,所以此为公交查询功能 任务描述: 有位在魏公村附近上小学的小朋友,要去北京邮电大学找哥哥.他身上钱很少,只够坐公交的.所以,百度地图API快帮帮他吧! 如何实现: 把地图中心定在魏公村,在视野范围内搜索小学. 搜索完毕后,点击出现的红色标注,在输入框中输入北京邮电大学,然后查询,即可得到公交路线图. 图示: 运行代码,点击这里. 点击公交按钮需要做的查询工作. 在这里,请大家一定注意,所有公交查询,只创建一次对象.不然会有很大的内存消耗哦~

python实现whois查询功能的方法源码

恐怕很多朋友跟我一样,使用python语言居然能实现whois服务器查询功能.下面我把代码和说明搬来给大家看看,有谁需要可以参考下.本来想直接从whois服务器查询的,但是发现要写socket 用43端口链接服务器,但是有些服务器的地址不清楚,而且查询命令貌似有改变所以不想折腾了,就想着直接用chinaz的页面实现一下算了.如下代码是在 win7下操作的,安装python3.2测试通过. Python3.2实现whois查询功能的方法源码: # -*- coding:utf-8 -*- impo

[Architecture Pattern] Repository实作查询功能

[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计,能够切割BLL与DAL之间的相依性,并且提供系统抽换DAL的能力.但在软件开发的过程中,套用Repository Pattern最容易遇到的问题就是,如何在Repository中实作「查询」这个功能.像是在下列这个查询订单的页面,系统必须要依照用户输入的查询条件,来从DAL中查询出所有符合条件内容的