背景:
不久前,自己对接调用实现了中通快递 api 的功能,发现如果换了其它快递再重新对接,岂不是会浪费太多的时间,物流这个接口对接是一个难题,要么需要逐一连接多家快递公司进行发货每对接一个快递公司就要开发十余个接口,开发工作量繁琐复杂。
所以选个第三方提供的快递 API 是最为合理的, 下面给出快递鸟的 api 接口的设计实现。
1、应用场景
(1)PC 端、移动端应用或网站应用集成运单物流信息查询功能时,只需要录入单号即可完成查询,无需用户输入快递公司。
(2)电商网站要在快递鸟查询或者订阅运单时,可通过单号识别先行判断物流公司后,再订阅到快递鸟。
2、是否需要授权
要 Free 申请服务
3、接口描述 / 说明
API ID:点击获取
API Key:点击获取
示例
(1)请求示例
JSON 格式
(1)该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。
(2)接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订阅的动作。
(3)接口识别会返回一家或者多家快递公司,返回的数据根据快递鸟大数据分析结果排序,排名靠前的命中率更高。
(4)若识别失败,快递鸟返回的匹配结果为空。
(5)接口支持的消息接收方式为 HTTP POST,请求方法的编码格式(utf-8):“application/x-www-form-urlencoded;charset=utf-8”。
(6)请求系统级参数说明:
请求示例:
show sourceview source
print?
1 {
2 "LogisticCode": "3967950525457"
3 }(2)返回示例
JSON 格式
show source
01 {
02 "EBusinessID": "1257021",
03 "Success": true,
04 "LogisticCode": "3967950525457",
05 "Shippers": [
06 {
07 "ShipperCode": "YD",
08 "ShipperName": "韵达快递"
09 }
10 ]
11 }
返回示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
namespace KdGoldAPI
{
public class KdApiOrderDistinguish
{
// 电商 ID
private string EBusinessID = "请到快递鸟官网申请 http://www.kdniao.com/ServiceApply.aspx";
// 电商加密私钥,快递鸟提供,注意保管,不要泄漏
private string AppKey = "请到快递鸟官网申请 http://www.kdniao.com/ServiceApply.aspx";
// 请求 url
// 测试环境
private string ReqURL = "http://testapi.kdniao.cc:8081/Ebusiness/EbusinessOrderHandle.aspx";
// 正式环境
//private string ReqURL = "http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx";
/// <summary>
/// Json 方式 单号识别
/// </summary>
/// <returns></returns>
public string orderTracesSubByJson()
{string requestData = "{'LogisticCode':'3967950525457'}";
Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));
param.Add("EBusinessID", EBusinessID);
param.Add("RequestType", "2002");
string dataSign = encrypt(requestData, AppKey, "UTF-8");
param.Add("DataSign", HttpUtility.UrlEncode(dataSign, Encoding.UTF8));
param.Add("DataType", "2");
string result = sendPost(ReqURL, 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);
}
}
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));
}
}
}