免费快递查询接口文档
快递单号查询自动识别接口API技术文档
快递单号查询自动识别接口API
快递鸟
版本
1功能说明
通过运单单号自动识别所属的快递公司。
同一个单号可能属于一家或者多家公司,快递鸟提供的服务为智能识别可能的快递公司,识别结果还需用户审核。
接口说明如下:
该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。
接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订阅的动作。
接口识别会返回一家或者多家快递公司,返回的数据根据快递鸟大数据分析结果排序,排名靠前的命中率更高。
若识别失败,快递鸟返回的匹配结果为空。
2接口规则
(1)、接口只支持Json格式参数,接口指令2002。
只支持POST请求方式,utf-8编码。
(2)、支持增值服务,保价、代收货款、货款直退、货款垫付等。
(3)、测试地址:
:8081/Ebusiness/EbusinessOrderHandle.aspx
(4)、正式地址:/Ebusiness/EbusinessOrderHandle.aspx
3系统级输入参数
4应用级输入参数
5返回结果参数。
订单查询接口文档
1.1.订单状态查询[OM1]1.1.1.功能描述此接口用于根据订单号查询订单当前状态。
如果订单已经出票,则返回结果会包含票号。
1.1.2.接口地址Webservice方式:测试地址::55779/ltips/services/getOrderStatusService1.0?wsdl正式地址::8000/ltips/services/getOrderStatusService1.0?wsdlPost方式:测试地址::55779/ltips/services/getOrderStatusServiceRestful1.0/getOrderStatus 正式地址::8000/ltips/services/getOrderStatusServiceRestful1.0/getOrderStatus 1.1.3.方法名称getOrderStatus1.1.4.参数说明GetOrderStatusRequest(请求参数)GetOrderStatusReply(返回结果)1.2.订单取消[OM2]1.2.1.功能描述此接口用于通过订单号取消当前订单,且可同时取消PNR。
1.2.2.接口地址Webservice方式:测试地址::55779/ltips/services/cancelOrderService1.0?wsdl 正式地址::8000/ltips/services/cancelOrderService1.0?wsdlPost方式:测试地址::55779/ltips/services/cancelOrderServiceRestful1.0/cancelOrder 正式地址::8000/ltips/services/cancelOrderServiceRestful1.0/cancelOrder 1.2.3.方法名称cancelOrder1.2.4.参数说明CancelOrderRequest(请求参数)CancelOrderReply(返回结果)1.3.订单详情查询[OM3]1.3.1.功能描述此接口用于通过订单号查询订单详情。
免费快递在线下单接口对接文档 (PHP)
1.3.4 应用级输入参数
参数名称 CallBack MemberID
CustomerName
CustomerPwd SendSite ShipperCode LogisticCode OrderCode MonthCode
PayType
ExpType IsNotice Cost OtherCost
描述 请求内容,JSON 格式,须和 DataType 一致
R
电商 ID
R
请求指令类型:1001
R
数据内容签名
O
请求、返回数据类型:2-json;
1.1.3 应用级输入参数
参数名称 WarehouseID WarehouseAddress CallBack MemberID ShipperCode
类型 String String String String String
Bool String
必须要求 R R R R
R O
说明 电商用户 ID 订单编号 快递公司编码 快递单号
成功与否:true,false 失败原因
1.2.6 JSON 请求示例
{ "OrderCode": "201406240005", "ShipperCode": "ZJS", "LogisticCode": "118461988807"
Company Name Tel Receiver Mobile PostCode ProvinceName
类型 String String
String String String String String String String
快递单号查询api 开发快递查询应用程序
快递单号查询api 开发快递查询应用程序快递单号查询api是对外开放的应用程序接口,基于该API开发自己的快递查询应用程序。
接口名称:快递单号查询api接口平台:聚合数据接口地址:/exp/index支持格式:JSON/XML请求方式:HTTP POST/GET请求示例:/exp/index?key=key&com=sf&no=575677355677请求参数:名称类型必填说明com string 是需要查询的快递公司编号no string 是需要查询的订单号key string 是应用APPKEY(应用详细页查询)dtype string 否返回数据的格式,xml或json,默认json调用样例及调试工具:API测试工具返回字段:名称类型说明参考JSON返回示例- -快递单号查询api JSON返回示例:{"resultcode":"200",/*返回标识码*/"reason":"查询成功!","result":{"company":"顺丰","com":"sf","no":"575677355677","list":[{"datetime":"2013-06-25 10:44:05", /*时间*/"remark":"已收件", /*描述*/"zone":"台州市" /*区域*/},{"datetime":"2013-06-25 11:05:21","remark":"快件在台州,准备送往下一站台州集散中心","zone":"台州市"},{"datetime":"2013-06-25 20:36:02","remark":"快件在台州集散中心,准备送往下一站台州集散中心","zone":"台州市"},{"datetime":"2013-06-25 21:17:36","remark":"快件在台州集散中心,准备送往下一站杭州集散中心","zone":"台州市"},{"datetime":"2013-06-26 12:20:00","remark":"快件在杭州集散中心,准备送往下一站西安集散中心","zone":"杭州市"},{"datetime":"2013-06-27 05:48:42","remark":"快件在西安集散中心,准备送往下一站西安","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:03:03","remark":"正在派件..","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:51:33","remark":"派件已签收","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:51","remark":"签收人是:已签收","zone":"西安市/咸阳市"}]"status": "1", /*0或1,1表示签收或退回*/}}快递单号查询api XML返回示例:<root><resultcode>200</resultcode><reason>查询成功!</reason><result><company>顺丰</company><com>sf</com><no>575677355677</no><list><item><datetime>2013-06-25 10:44:05</datetime><remark>已收件</remark><zone>台州市</zone></item><item><datetime>2013-06-25 11:05:21</datetime><remark>快件在台州,准备送往下一站台州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-25 20:36:02</datetime><remark>快件在台州集散中心,准备送往下一站台州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-25 21:17:36</datetime><remark>快件在台州集散中心,准备送往下一站杭州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-26 12:20:00</datetime><remark>快件在杭州集散中心,准备送往下一站西安集散中心</remark><zone>杭州市</zone></item><item><datetime>2013-06-27 05:48:42</datetime><remark>快件在西安集散中心,准备送往下一站西安</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:03:03</datetime><remark>正在派件..</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:51:33</datetime><remark>派件已签收</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:51</datetime><remark>签收人是:已签收</remark><zone>西安市/咸阳市</zone></item></list><status>1</status></result></root>。
快递单号查询免费api接口(PHP示例)——快宝开放平台
请求代码示例↓支持6中开发语言对接,包括JAVA,C#,PHP,Python,Node.js,Crul;根据您的开发语言,选择参考对应的代码示例,下面以PHP代码为例:1$host = "https:///api";2$method = "POST";3$headers = array();4//根据API的要求,定义相对应的Content-Type5array_push($headers,"Content-Type".":"."application/x-www-form-urlencoded;charset=UTF-8");6$querys = "";7$bodys = [8 "app_id"=>'50001',9 "method"=>'.get',10 "sign"=>"bdf3b5f50865ac813cbdfd6c9b572b79",11 "ts"=>'1524209949',12 "data"=>'{ "waybill_no":"物流单号多个的以英文逗号分隔","exp_company_code":"品牌简称"}'13 ];14$bodys = http_build_query($bodys);15$url = $host;16$curl = curl_init();17curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);18curl_setopt($curl, CURLOPT_URL, $url);19curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);20curl_setopt($curl, CURLOPT_FAILONERROR, false);21curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);22curl_setopt($curl, CURLOPT_HEADER, true);23if (1 == strpos("$".$host, "https://"))24 {25curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);26curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);27 }28curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);29var_dump(curl_exec($curl));成功响应示例↓响应(成功、失败)示例,仅支持JSON格式。
快递单号查询API接口对接流程
快递单号查询API接口对接后可以在自己的网站点击查询就能查到物流轨迹,像京东淘宝查询物流的功能一样,适合一些自己研发的系统商、微信小程序,还有自己的电商网站。
方法/步骤
进入快递鸟网站下载对接相关的接口文档,和接口demo案例,接口demo案例可以直接调用,不用自己编写代码。
如果需要自己编写,可以参照接口文档
另外即时查询API、物流跟踪API和在途监控API都是查询快递的,可以根据不同情况对接使用
在右上角注册账号登录后进行账号认证,就可以对接接口了
在账号登录后首页可以查看接口ID和接口KEY,复制到demo中的“EBusinessID”和“AppKey”两个参数中,demo就可以使用了
对接完成后就是在调试平台调试接口,对比请求报文和返回报文确认对接是不是正确的。
这里需要注意的是,对接的是什么接口,就查看什么接口的调试报文
测试后就可以正式调用了,正式调用的时候在正式地址调用
最后做一个物流轨迹的数据展现就可以了,如下图。
快递鸟API查询快递接口
1.申请一个快递鸟的帐号获取授权申请/reg快递鸟的帐号使永久免费的,且申请了立即就能用的,也不需要审核。
2.按照单号识别接口和即时查询接口封装好数据3.获取返回的 json 数据输出import jsonimport urllibimport urllib.requestimport hashlibimport base64import urllib.parse# 此处为快递鸟官网申请的帐号和密码APP_id = "1266271"APP_key = "7526a46e-3a2a-4f5b-8659-d72f361e3386"def encrypt(origin_data, appkey):"""数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码""" m = hashlib.md5()m.update((origin_data+appkey).encode("utf8"))encodestr = m.hexdigest()base64_text = base64.b64encode(encodestr.encode(encoding='utf-8'))return base64_textdef sendpost(url, datas):"""发送post请求"""postdata = urllib.parse.urlencode(datas).encode('utf-8')header = {"Accept": "application/x-www-form-urlencoded;charset=utf-8","Accept-Encoding": "utf-8"}req = urllib.request.Request(url, postdata, header)get_data = (urllib.request.urlopen(req).read().decode('utf-8'))return get_datadef get_company(logistic_code, appid, appkey, url):"""获取对应快递单号的快递公司代码和名称"""data1 = {'LogisticCode': logistic_code}d1 = json.dumps(data1, sort_keys=True)requestdata = encrypt(d1, appkey)post_data = {'RequestData': d1,'EBusinessID': appid,'RequestType': '2002','DataType': '2','DataSign': requestdata.decode()}json_data = sendpost(url, post_data)sort_data = json.loads(json_data)return sort_datadef get_traces(logistic_code, shipper_code, appid, appkey, url):"""查询接口支持按照运单号查询(单个查询)"""data1 = {'LogisticCode': logistic_code, 'ShipperCode': shipper_code}d1 = json.dumps(data1, sort_keys=True)requestdata = encrypt(d1, appkey)post_data = {'RequestData': d1, 'EBusinessID': appid, 'RequestType': '1002', 'DataType': '2','DataSign': requestdata.decode()}json_data = sendpost(url, post_data)sort_data = json.loads(json_data)return sort_datadef recognise(expresscode):"""输出数据"""url = ':8081/Ebusiness/EbusinessOrderHandle.aspx' data = get_company(expresscode, APP_id, APP_key, url)if not any(data['Shippers']):print("未查到该快递信息,请检查快递单号是否有误!")else:print("已查到该", str(data['Shippers'][0]['ShipperName'])+"("+str(data['Shippers'][0]['ShipperCode'])+")", expresscode)trace_data = get_traces(expresscode, data['Shippers'][0]['ShipperCode'], APP_id, APP_key, url)if trace_data['Success'] == "false" or not any(trace_data['Traces']): print("未查询到该快递物流轨迹!")else:str_state = "问题件"if trace_data['State'] == '2':str_state = "在途中"if trace_data['State'] == '3':str_state = "已签收"print("目前状态: "+str_state)trace_data = trace_data['Traces']item_no = 1for item in trace_data:print(str(item_no)+":", item['AcceptTime'],item['AcceptStation'])item_no += 1print("\n")returnwhile True:code = input("请输入快递单号(Esc退出):")code = code.strip()if code == "esc":breakrecognise(code)【疑问解答】1、问题:快递鸟接口有并发要求吗?快递鸟即时查询接口并发不超过10次/秒,物流跟踪接口订阅不超过30次/秒,电子面单接口下单不超过20次/秒。
免费快递查询接口文档
免费快递查询接口文档-快递鸟API1.报文及报文编码接口提供:快递鸟报文格式:Json 格式请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"交互协议上统一用UTF-8,避免传递中文数据出现乱码。
2.应用场景(1)电商网站用户打开“我的订单”时调用此API显示物流信息详情。
(2)电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题。
(3)每日调用次数限制不超过3000次,如超过该限制,可对接物流跟踪API。
(4)全流程的物流状态跟踪I3.关于签名采用IP 认证加签名的方式对接,具体方案如下:1)防止数据被篡改在POST 请求中会传递 5 个必须(R)参数RequestData==数据内容(URL 编码:UTF-8)EBusinessID==用户IDRequestType=请求指令类型DataSign== 数据内容签名:把(请求内容(未编码)+ApiKey)进行MD5 加密,然后Base64编码,最后进行URL(utf-8)编码DataType==返回数据类型(2-json)注:DataSign 生成后,对方接收到数据后,以同样的算法进行签名,生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生数据篡改。
2)调用接口的身份认证注册成为接口用户后,会生成对应的用户ID 和APIKey,用户ID 相当于用户名,APIKey 相当于密码。
4.接入步骤1)接口网注册账号成为用户;提供的用户ID 是调用接口服务的身份证明,不可更改、不可转用,API Key 是应用访问API 的签名附加密钥,必须妥善保存。
两者关系类似于用户名和密码,两者都会在签名和业务参数中使用。
2)登陆用户后台,登陆用户后台,进行实名认证,并开通会员服务;3)根据技术文档进行开发并在调试平台测试联调;根据技术文档进行开发并在调试平台测试联调;API 接口的DEMO(包括:.Net 版本、Java 版本、PHP 版本)供开发参考。
免费物流查询API接口对接案例
免费物流查询API接口对接案例这是来自快递鸟的一个快递查询的api接口,支持快递单号查询,接口不错,分享给大家。
接口申请地址:/regPHP代码<?php//电商IDdefined('EBusinessID') or define('EBusinessID', 1237100);//电商加密私钥,注意保管,不要泄漏defined('AppKey') or define('AppKey', '518a73d8-1f7f-441a-b644-33e77b49d846');//请求urldefined('ReqURL') or define('ReqURL', '/Ebusiness/EbusinessOrderHandle.aspx');/*** Json方式查询订单物流轨迹*/function getOrderTracesByJson(){$requestData= "{'OrderCode':'','ShipperCode':'SF','LogisticCode':'589707398027'}";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '1002','RequestData' => urlencode($requestData) ,'DataType' => '2',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** XML方式查询订单物流轨迹*/function getOrderTracesByXml(){$requestData= "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"."<Content>"."<OrderCode></OrderCode>"."<ShipperCode>SF</ShipperCode>"."<LogisticCode>589707398027</LogisticCode>"."</Content>";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '1002','RequestData' => urlencode($requestData) ,'DataType' => '1',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** post提交数据* @param string $url 请求Url* @param array $datas 提交的数据* @return url响应返回的html*/function sendPost($url, $datas) {$temps = array();foreach ($datas as $key => $value) {$temps[] = sprintf('%s=%s', $key, $value);}$post_data = implode('&', $temps);$url_info = parse_url($url);if($url_info['port']==''){$url_info['port']=80;}echo $url_info['port'];$httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";$httpheader.= "Host:" . $url_info['host'] . "\r\n";$httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";$httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";$httpheader.= "Connection:close\r\n\r\n";$httpheader.= $post_data;$fd = fsockopen($url_info['host'], $url_info['port']);fwrite($fd, $httpheader);$gets = "";$headerFlag = true;while (!feof($fd)) {if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {break;}}while (!feof($fd)) {$gets.= fread($fd, 128);}fclose($fd);return $gets;}/*** 电商Sign签名生成* @param data 内容* @param appkey Appkey* @return DataSign签名*/function encrypt($data, $appkey) {return urlencode(base64_encode(md5($data.$appkey)));}?>.NET代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using ;using System.IO;namespace KdGoldAPI{public class KdApiSearchDemo{//电商IDprivate string EBusinessID = "1237100";//电商加密私钥,注意保管,不要泄漏private string AppKey = "518a73d8-1f7f-441a-b644-33e77b49d846";//请求urlprivate string ReqURL = "/Ebusiness/EbusinessOrderHandle.aspx";/// <summary>/// Json方式查询订单物流轨迹/// </summary>/// <returns></returns>public string getOrderTracesByJson(){string requestData = "{'OrderCode':'','ShipperCode':'SF','LogisticCode':'589707398027'}";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(ReqURL, param);//根据公司业务处理返回的信息......return result;}/// <summary>/// XML方式查询订单物流轨迹/// </summary>/// <returns></returns>public string getOrderTracesByXml(){string requestData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +"<Content>" +"<OrderCode></OrderCode>" +"<ShipperCode>SF</ShipperCode>" +"<LogisticCode>589707398027</LogisticCode>" +"</Content>";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", "1");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;erAgent = "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 = puteHash(buffer);string ret = "";foreach (byte a in somme){if (a < 16)ret += "0" + a.ToString("X");elseret += 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){returnConvert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));}}}。
常用快递API接口方案
BufferedReader in = null;
StringBuilder result = new StringBuilder();
try {
URL realUrl = new URL(url);
HttpURLConnection conn =(HttpURLConnection) ();
* @param url 发送请求的 URL
* @param params 请求的参数集合
* @return 远程资源的响应结果
*/
@SuppressWarnings("unused")
private String sendPost(String url, Map<String, String> params) {
{
if (keyValue != null)
{
return base64(MD5(content + keyValue, charset), charset);
}
return base64(MD5(content, charset), charset);
}
/**
* 向指定 URL 发送POST方法的请求
String encoded = (charset));
return encoded;
}
@SuppressWarnings("unused")
private String urlEncoder(String str, String charset) throwsUnsupportedEncodingException{
* @param url 发送请求的 URL
接口技术文档doc
快递鸟接口(API)技术文档版本日期版本说明作者2014-12-01 3.0 重新整理,根据功能分类,部分有调整杨文胜2014-01-11 3.1 对接口的说明进行了注释,提高可读性杨汉汶2014-01-13 3.2 新增推送接口杨汉汶2015-03-11 3.3 新增批量订阅推送接口,删除3.2版本推送接口杨文胜2015-10-12 3.4 新增订单分发接口,整理电子面单接口曹强2016-01-19 3.5 重新调整在线下单接口曹强2016-03-01 3.6 增加智选物流接口曹强2016-03-01 3.7 分发及订阅接口更新任海洋2016-04-07 3.7.1 推送接口更新任海洋2016-05-11 3.7.2 电子面单新增通知快递员上门字段,推送接口新增货款状态推送詹益伟2016-07-01 4.0 全新4.0接口,新增单号识别接口、智选物流接口、更新物流轨迹接口(订阅查询)詹益伟2016-9-26 4.0.1 推送接口新增DataSign字段、订阅2.0新增仓库标识ID、智选物流接口新增字段胡蕾蕾2016-11-03 4.1 新增在途监控(增值服务)曹强2016-12-13 4.1.1 电子面单新增第三方订单号ThrOrderCode胡蕾蕾2017-1-10 4.2 新增隐私快递胡蕾蕾2017-2-16 4.2.1 新增代收货款业务胡蕾蕾2017-4-13 4.3 1、即时查询接口中轨迹状态新增0-无轨迹2、普通回调接口中删除201状态3、修改智选物流接口文档4、电子面单接口添加特殊字符提示陈爱2017-4-25 4.4 1、新增申请电子面单客户号接口2、新增电子面单余额查询接口3、新增电子面单单号回收接口4、新增申请客户号信息推送接口陈爱2017-6-22 4.5 新增短信接口李旭安2017-7-14 4.6 电子面单接口新增支持邮政快递包裹吴明名词定义必须要求说明R 必填(Required)。
物流一站式查询之顺丰接口篇
物流⼀站式查询之顺丰接⼝篇连载篇提前看前情提要本篇内容承接上篇《⽂末所说,顺丰物流关闭了对第三⽅的物流接⼝,导致众多第三⽅物流平台查询不到顺丰快递的物流信息。
但是问题终归是要解决滴,别家不⾏,咱就直接⽤顺丰⾃家的。
原本⽹上找顺丰物流信息查询发现看了下介绍,因为也是顺丰的平台,也没多想,看到流程还是⽐较清晰的。
本来想找在线客服咨询下,结果发现在线客服有的只是⼀个群号,⽽且还不能加⼈了,于是乎就按照接⼊流程开始操作,本地都开发的差不多了,后来意外联系到⼀个顺丰的IT⼈员,通过他得知,顺丰物流信息接⼝已经转到另⼀个部门和平台操作了,这个开放平台已经⼏乎没有⼈维护了。
于是再他的协助下,我得到了最新的对接⽂档。
按找新⽂档,之前的开发的全部得重写,请求接⼝不⼀样,数据传输和接收⽅式不⼀样,由开放平台的Json格式到现在⽤XML传输。
这⾥贴⼀下接⼊规范⽂档的⽬录顺便提⼀下顺丰路由查询接⼝就是查询物流信息的接⼝,不过再顺丰平台使⽤此接⼝有个前提条件,就是必须是顺丰的⽉结⽤户。
登陆可以查看到基本信息注:①不是顺丰⽉结卡⽤户或者企业,不能接⼊路由查询②不是通过顺丰接⼝下单的运单号,不能接⼊路由推送接⼝,换⽽⾔之,如果是通过顺丰⼤客户发货系统或者其他⽅式进⾏的打单获取到的快递单号,⽆法对此单进⾏订阅推送操作。
开发篇看完基本流程和接⼊规范之后,就可以按照⽂档规范进⾏编码。
因为⽬前我只⽤到了标红的三个接⼝,所以接下来对这三个接⼝⼀⼀讲解。
(注开发之前本机IP需要得到官⽅授权,不然会请求会返回IP未授权)下单接⼝1.1. 功能描述下订单接⼝根据客户需要,可提供以下三个功能:1) 客户系统向顺丰下发订单。
2) 为订单分配运单号。
3) 筛单(可选,具体商务沟通中双⽅约定,由顺丰内部为客户配置)。
此接⼝也⽤于路由推送注册。
客户的顺丰运单号不是通过此下订单接⼝获取,但却需要获取BSP的路由推送时,需要通过此接⼝对相应的顺丰运单进⾏注册以使⽤BSP的路由推送接⼝。
接入快递接口API单号识别查询接口demo
接入快递接口API单号识别查询接口demo背景:分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递鸟集成api做为数据来源接口,这个接口是免费使用的,不过提供的功能还是非常强大的,有专门的售后维护团队。
有多种语言demo可以进行调用1. 需求根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能2.应用场景(如图)3、进入“我的会员中心”进行实名认证注:3.1、认证类型、应用类型根据用户实际情况选择即可,接口返回数据与选择结果无关;3.2、标记为*的为必填,要求上传清晰、jpg格式且小于2M的证件图片;3.3、技术对接人信息为用户方对接工程师的信息;3.4、如有其他疑问可进入官网加入商务合作群进行咨询。
认证成功后,进入“产品服务管理”,开通相关会员服务Demo由第三方写好,只需要下载就可以运行用上,(自己做简单的修改)下面是下载Demo的网站,根据自己需要下载6. 下面是java版本的根据单号查询物流跟踪信息的详细代码6.1 创建KdniaoTrackQueryAPI 接口类下面是Demo的main方法测试代码import net.sf.json.JSONArray;import net.sf.json.JSONObject;//测试接口public class Demo {public static void main(String[] args) {KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();try {//第一个参数是快递公司简称(YD -- 韵达速递)//第二个参数是需要查询的快递单号String result = api.getOrderTracesByJson("YD", "3827670147715"); JSONObject jsonObject = JSONObject.fromObject(result);String ShipperCode = jsonObject.getString("ShipperCode");String LogisticCode = jsonObject.getString("LogisticCode");JSONArray Traces = jsonObject.getJSONArray("Traces");System.out.print(result+"\n");System.out.println("快递名称"+ShipperCode);System.out.println("快递单号"+LogisticCode);for(int i = 0; i < Traces.size(); i++) {JSONObject object = (JSONObject) Traces.get(i);String AcceptTime = object.getString("AcceptTime");String AcceptStation = object.getString("AcceptStation");System.out.println("时间:"+AcceptTime+"\t"+AcceptStation); }} catch (Exception e) {e.printStackTrace();}}}测试效果实图。
物流查询接口
物流查询接⼝private static final String appcode = "bd6033ccd19d4f7eb06af47df27944a2"; // 替换这⾥填写你⾃⼰的AppCode 请在买家中⼼查看@RequestMapping("/logisticsDetail")public String listSkip(HttpServletRequest request, Model model,String orderId) {model.addAttribute("WEB_URL", ServiceUrl.WEB_URL);model.addAttribute("WEB_NAME", ServiceUrl.WEB_NAME);ShipmentsEntity condition=new ShipmentsEntity();condition.setSOrderId(Long.valueOf(orderId));condition.setType(0);condition.setsRole(1);EntityWrapper<ShipmentsEntity> entityWrapper=new EntityWrapper<ShipmentsEntity>(condition);ShipmentsEntity reponseData=shipMentService.selectOne(entityWrapper);Map<String, Object> returnMap = new HashMap<String, Object>();if(reponseData!=null) {String host = "https://";String path = "/showapi_expInfo";String method = "GET";Map<String, String> headers = new HashMap<String, String>();//最后在header中的格式(中间是英⽂空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + appcode);Map<String, String> querys = new HashMap<String, String>();String com= logisticsService.selectById(reponseData.getSLogisticsId()).getLSimpleName();//物流编码querys.put("com", com);//运单号querys.put("nu", reponseData.getSNumber());// 物流信息String returnStr = "";try {HttpResponse response = HttpTool.doGet(host, path, method, headers, querys);// 从返回信息中拿到returnStr = EntityUtils.toString(response.getEntity());if (StringUtils.isEmpty(returnStr)) {throw new BusinessRuntimeException("查询物流信息失败");}returnMap= JSON.parseObject(returnStr,HashMap.class);} catch (Exception e) {e.printStackTrace();}}model.addAttribute("list",returnMap);return "h5/wuliu";}⼯具类:package com.zldev.framework.util;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.List;import java.util.Map;import .ssl.SSLContext;import .ssl.TrustManager;import .ssl.X509TrustManager;import ng3.StringUtils;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpDelete;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpPut;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.entity.ByteArrayEntity;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;public class HttpTool {/*** get** @param host* @param path* @param method* @param headers* @param querys* @return* @throws Exception*/public static HttpResponse doGet(String host, String path, String method,Map<String, String> headers,Map<String, String> querys)throws Exception {HttpClient httpClient = wrapClient(host);HttpGet request = new HttpGet(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}return httpClient.execute(request);}/*** post form** @param host* @param path* @param method* @param headers* @param querys* @param bodys* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,Map<String, String> bodys)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (bodys != null) {List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();for (String key : bodys.keySet()) {nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));}UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");request.setEntity(formEntity);}return httpClient.execute(request);}/*** Post String** @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method, Map<String, String> headers,Map<String, String> querys,String body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (StringUtils.isNotBlank(body)) {request.setEntity(new StringEntity(body, "utf-8"));}return httpClient.execute(request);}/*** Post stream** @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method, Map<String, String> headers,Map<String, String> querys,byte[] body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (body != null) {request.setEntity(new ByteArrayEntity(body));}return httpClient.execute(request);}/*** Put String* @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPut(String host, String path, String method, Map<String, String> headers,Map<String, String> querys,String body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPut request = new HttpPut(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (StringUtils.isNotBlank(body)) {request.setEntity(new StringEntity(body, "utf-8"));}return httpClient.execute(request);}/*** Put stream* @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPut(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,byte[] body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPut request = new HttpPut(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (body != null) {request.setEntity(new ByteArrayEntity(body));}return httpClient.execute(request);}/*** Delete** @param host* @param path* @param method* @param headers* @param querys* @return* @throws Exception*/public static HttpResponse doDelete(String host, String path, String method,Map<String, String> headers,Map<String, String> querys)throws Exception {HttpClient httpClient = wrapClient(host);HttpDelete request = new HttpDelete(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}return httpClient.execute(request);}private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException { StringBuilder sbUrl = new StringBuilder();sbUrl.append(host);if (!StringUtils.isBlank(path)) {sbUrl.append(path);}if (null != querys) {StringBuilder sbQuery = new StringBuilder();for (Map.Entry<String, String> query : querys.entrySet()) {if (0 < sbQuery.length()) {sbQuery.append("&");}if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {sbQuery.append(query.getValue());}if (!StringUtils.isBlank(query.getKey())) {sbQuery.append(query.getKey());if (!StringUtils.isBlank(query.getValue())) {sbQuery.append("=");sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));}}}if (0 < sbQuery.length()) {sbUrl.append("?").append(sbQuery);}}return sbUrl.toString();}private static HttpClient wrapClient(String host) {HttpClient httpClient = new DefaultHttpClient();if (host.startsWith("https://")) {sslClient(httpClient);}return httpClient;}private static void sslClient(HttpClient httpClient) {try {SSLContext ctx = SSLContext.getInstance("TLS");X509TrustManager tm = new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] xcs, String str) {}public void checkServerTrusted(X509Certificate[] xcs, String str) {}};ctx.init(null, new TrustManager[] { tm }, null);SSLSocketFactory ssf = new SSLSocketFactory(ctx);ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager ccm = httpClient.getConnectionManager();SchemeRegistry registry = ccm.getSchemeRegistry();registry.register(new Scheme("https", 443, ssf));} catch (KeyManagementException ex) {throw new RuntimeException(ex);} catch (NoSuchAlgorithmException ex) {throw new RuntimeException(ex);}}}。
常用快递单号物流查询接口通用API(JAVA对接)
常用快递单号物流查询接口通用API (JAVA 对接)快递查询接口通用API 是给发货电商以实现查询快递物流轨迹功能的,接口对接前要先到快递鸟网站申请接口秘钥和APIKEY快递API 的应用场景与用途最常见的应用场景如下:(1)电商网站:例如B2C ,团购,B2B ,批发分销站,C2C ,本地生活交易等网站。
(2)管理系统:订单处理平台,调度平台,发货平台,分销系统,渠道管理系统,客户管理系统,ERP 等。
快递API 的用途如下:(1)让顾客登录网站后,直接在“我的订单”页面上可以看到订单的物流状态。
(2)自动筛选出“已签收”,“疑难件”等状态的单号,减轻物流跟单人员的压力。
(3)更改订单的状态和交易流程,例如单号变为“已签收”,可以让订单转化可以确认退换货等。
(4)评估选择快递公司,根据“已签收”的运单数,可以算出销售人员的业绩,并进行应对的结算。
(5)邮件,短信提醒用户运单的最新状态,可以安抚用户,也可以利用邮件短信二次营销。
对接要求:(1),查询接口支持遵循运输单号查询(个别查询,并发不超过10个/ S )。
(2),指定的物流运输单号选择相应的快递公司编码,格式不对或则编码错误都会返回失败的信息。
例如EMS 物流单号应选择快递公司编码(EMS )(3),返回的物流跟踪信息遵循发生的时间升序排列。
(4),接口指令1002(5),接口提供:快递鸟 (6),请求地址:http ://java 请求示例: 1个2 3 4 5 6 7 8 9 10 import java.io.BufferedReader;import java.io.IOException; import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /**** 单日超过500单查询量,建议接入物流轨迹订阅推送接口**/public class KdniaoTrackQueryAPI {//DEMOpublic static void main(String[] args) {KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();try {String result = api.getOrderTracesByJson("ANE", "210001633605");System.out.print(result);} catch (Exception e) {e.printStackTrace();}}//电商IDprivate String EBusinessID="申请";//电商加密私钥,注意保管,不要泄漏private String AppKey="申请";//请求urlprivate String ReqURL="/Ebusiness/EbusinessOrderHandle.aspx";/*** Json 方式 查询订单物流轨迹* @throws Exception*/public String getOrderTracesByJson(String expCode, String expNo) throws Exception{String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";Map params = new HashMap();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "1002");String dataSign=encrypt(requestData, AppKey, "UTF-8");params.put("DataSign", urlEncoder(dataSign, "UTF-8"));params.put("DataType", "2");String result=sendPost(ReqURL, params);//根据公司业务处理返回的信息......5556575859606162636465666768697071727374757677787980818283848586878889909192939495969798return 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;}/**99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142* 电商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 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();143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186// 获取URLConnection对象对应的输出流out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");// 发送请求参数if(params != null) {StringBuilder param = new StringBuilder();for(Map.Entry 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();188 189190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 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();}。
圆通快递查询接口-快递鸟接口案例
1、功能说明物流轨迹查询-使用的物流单号和快递单号即可实现查询物流信息。
2、接口规则(1)、查询接口支持按照运单号查询(单个查询)。
(2)、圆通编码(ShipperCode):YTO(3)、返回的物流跟踪信息按照发生的时间升序排列。
(4)、接口指令1002。
3、系统级输入参数4、应用级输入参数5、返回结果参数6、XML请求示例(测试时请输入正确单号)<Content><OrderCode></OrderCode><ShipperCode>YTO</ShipperCode><LogisticCode>560237522916</LogisticCode> </Content>7、JSON请求示例(测试时请输入正确单号){"OrderCode": "","ShipperCode": " YTO ","LogisticCode": "560237522916"}8、XML返回示例(测试时请输入正确单号)没有轨迹<Response><EBusinessID>1109259</EBusinessID><OrderCode /><ShipperCode> YTO </ShipperCode><LogisticCode>560237522916</LogisticCode> <Success>false</Success><Traces></Traces></Response>有物流轨迹<Response><EBusinessID>1109259</EBusinessID><OrderCode><OrderCode /><ShipperCode> YTO </ShipperCode><LogisticCode>560237522916</LogisticCode><Success>true</Success><State>3</State><Traces><Trace><AcceptTime>2014/04/09 20:23:53</AcceptTime><AcceptStation>已收件[深圳市]</AcceptStation></Trace><Trace><AcceptTime>2014/04/09 21:08:47</AcceptTime><AcceptStation>快件在深圳,准备送往下一站深圳集散中心[深圳市]< /AcceptStation></Trace><Trace><AcceptTime>2014/04/10 01:45:45</AcceptTime><AcceptStation>快件在深圳集散中心[深圳市]</AcceptStation> </Trace><Trace><AcceptTime>2014/04/10 04:42:20</AcceptTime><AcceptStation>快件在深圳集散中心,准备送往下一站深圳[深圳市]< /AcceptStation></Trace><Trace><AcceptTime>2014/04/10 08:10:31</AcceptTime><AcceptStation>正在派件..(派件人:邓裕富,电话:187****6310)[深圳市]< /AcceptStation></Trace><Trace><AcceptTime>2014/04/10 09:49:39</AcceptTime><AcceptStation>派件已签收[深圳市]</AcceptStation></Trace><Trace><AcceptTime>2014/04/10 09:49:00</AcceptTime><AcceptStation>签收人是:**[深圳市]</AcceptStation></Trace></Traces></OrderCode></Response>9、JSON返回示例(测试时请输入正确单号)"Remark": null},{"AcceptTime": "2014/06/24 20:55:28","AcceptStation": "快件在深圳 ,准备送往下一站深圳集散中心 [深圳市] ","Remark": null},{"AcceptTime": "2014/06/25 10:23:03","AcceptStation": "派件已签收[深圳市]","Remark": null},{"AcceptTime": "2014/06/25 10:23:03","AcceptStation": "签收人是:已签收[深圳市]","Remark": null}]}。
快递鸟接口技术文档说明书
快递鸟接口(API)技术文档1前言 (5)2接口规范说明 (5)2.1接口规范及说明 (5)2.1.1报文及报文编码 (5)2.1.2接口数据包结构 (5)2.1.3JSON示例 (6)2.1.4系统级参数 (6)2.1.5流程示意图 (7)2.2签名说明 (7)2.2.1关于签名 (7)2.2.2(C#)DataSign签名加密代码 (9)3下单类接口 (10)3.1接入步骤 (10)3.2预约取件接口 (11)3.2.1功能说明 (11)3.2.2基本信息 (11)3.2.3接口规则 (12)3.2.4支持情况 (12)3.2.5应用级参数 (12)3.2.6返回参数 (17)3.3预约取件取消接口 (17)3.3.1功能说明 (17)3.3.2基本信息 (17)3.3.3接口规则 (18)3.3.4支持情况 (18)3.3.5应用场景 (18)3.3.6应用级参数 (18)3.3.7返回参数 (19)3.4电子面单接口 (19)3.4.1功能说明 (19)3.4.2基本信息 (19)3.4.3应用场景 (20)3.4.4接口规则 (20)3.4.6应用场景 (21)3.4.7应用级参数 (21)3.4.8返回参数 (30)3.5电子面单取消接口 (35)3.5.1功能说明 (35)3.5.2基本信息 (36)3.5.3接口规则 (36)3.5.4支持情况 (36)3.5.5应用级参数 (36)3.5.6返回参数 (37)3.6电子面单追加子单接口 (37)3.6.1功能说明 (37)3.6.2基本信息 (37)3.6.3应用级参数 (38)3.6.4返回参数 (38)3.7获取电子面单文件接口 (39)3.7.1功能说明 (39)3.7.2基本信息 (39)3.7.3应用级参数 (39)3.7.4返回参数 (40)4轨迹查询类接口 (42)4.1即时查询接口 (42)4.1.1功能说明 (42)4.1.2基本信息 (42)4.1.3接口规则 (42)4.1.4支持情况 (42)4.1.5应用场景 (42)4.1.6应用级参数 (42)4.1.7返回参数 (43)4.2物流跟踪 (45)4.2.1轨迹订阅接口 (45)4.3单号识别接口 (64)4.3.1功能说明 (64)4.3.2基本信息 (64)4.3.3接口规则 (64)4.3.4应用级参数 (64)4.3.5返回参数 (65)5增值类接口 (66)5.1在途监控-国内版 (66)5.1.1即时查询接口(增值版) (66)5.1.2物流跟踪接口(增值版) (72)5.2快递查询接口 (78)5.2.1功能说明 (78)5.2.2基本信息 (78)5.2.3接口规则 (78)5.2.4支持情况 (78)5.2.5应用场景 (78)5.2.6应用级参数 (78)5.2.7返回参数 (79)5.3在途监控-国际版 (84)5.3.1物流跟踪接口(国际版) (84)5.4物流查询地图接口 (86)5.4.1即时查询接口(地图版) (87)5.4.2物流跟踪接口(地图版) (95)5.5短信服务 (100)5.5.1短信模板接口 (101)5.5.2短信发送接口 (103)5.5.3短信黑名单接口 (105)5.6智能地址解析接口 (106)5.6.1功能说明 (106)5.6.2基本信息 (106)5.6.3应用级参数 (106)5.6.4返回参数 (107)6附录 (109)6.1对接相关资料 (109)6.2电子面单模板规格 (109)6.3返回编码列表 (116)7技术支持 (117)1前言快递鸟API旨在为电商、电商平台、物流工具、打单工具、仓储系统、移动APP等系统提供专业、稳定、优质的API接口服务,满足不同用户的物流管理需求。
快递单号查询快递鸟API接口-京东快运
快递单号查询快递鸟API接⼝-京东快运调⽤快递鸟提供的快递查询API标准接⼝,快速对接100多家快递公司的物流轨迹查询,本篇⽂章实现<京东快运>的快递单号查询。
⾸先我们准备好需要⽤到的资源,这⾥推荐⼤家去爱奇艺查看视频教程:测试商户ID:test1617571测试API key:554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使⽤)API测试地址:接下来,我们讲解⼀下请求参数⼀、接⼝描述/说明请求系统级参数说明:参数名称类型说明必须要求RequestData String请求内容需进⾏URL(utf-8)编码。
请求内容JSON格式,须和DataType⼀致。
REBusinessID String商户ID,请在我的服务页⾯查看。
RRequestType String请求指令类型:1002RDataSign String 数据内容签名:把(请求内容(未编码)+AppKey)进⾏MD5加密,然后Base64编码,最后进⾏URL(utf-8)编码。
详细过程请查看Demo。
RDataType String请求、返回数据类型:2-json;O备注:R-必填(Required),O-可选(Optional),C-报⽂中该参数在⼀定条件下可选(Conditional)这⾥提到了系统级参数,也相当于是公⽤参数,这些参数是调⽤每个接⼝都是必须要传参的。
⼆、接⼝参数请求内容字段定义:参数名称类型说明必须要求OrderCode String订单编号OShipperCode String快递公司编码RLogisticCode String物流单号RCustomerName String寄件⼈或收件⼈的⼿机号后四位数字R接⼝参数,也叫业务参数,请求的业务接⼝不同,参数的字段,内容也不同,是跟着业务变化的,这⾥我们实现的是即时查询接⼝,请求指令类型:1002,快递鸟官⽹要求必须传递快递公司编码和物流单号,京东快运的编码是JD如要查看其他快递公司的编码,点击此链接:我们⽤京东快运的真实单号(JDVD00215296905)来完成快递单号查询接⼝的调⽤,请求的完整报⽂(URL编码以后):RequestData=%0d%0a++++++++++++%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27JD%27%2c%27LogisticCode%27%3a%27JDVD00215296905%27%2c%27CustomerNURL解码的请求报⽂:{'OrderCode':'','ShipperCode':'JD','LogisticCode':'JDVD00215296905','CustomerName':'12333'}&EBusinessID=1264783&RequestType=1002&DataSign=M2QzMmVmMzUwNmNkNDFhODc2MmZmMWY5OWNkODU0NmQ=&DataType=2窗体顶端窗体底端返回参数定义:参数名称类型说明必须要求EBusinessID String⽤户ID ROrderCode String订单编号OShipperCode String快递公司编码RLogisticCode String物流运单号OSuccess Bool成功与否RReason String失败原因OState String物流状态:2-在途中,3-签收,4-问RState String物流状态:2-在途中,3-签收,4-问R题件TracesAcceptTime StringAcceptStation StringRemark String返回报⽂信息-{ "LogisticCode" : "JDVD00215296905", "ShipperCode" : "JD", "Traces" : [ { "AcceptStation" : "货物已交付京东物流", "AcceptTime" : "2019-10-07 13:47:08" }, { "AcceptStation" : "配送员杨海滨已经揽收完成", "AcceptTime" : "2019-10-07 13:47:08" }, { "AcceptStation" : "受国庆假期影响,您的快递可能会延迟配送,请您耐⼼等待;", "AcceptTime" : "2019-10-07 13:47:12" }, { "AcceptStation" : "货物已到达【成都枢纽中⼼】", "AcceptTime" : "2019-10-07 20:21:41" }, { "AcceptStation" : "货物已完成分拣,离开【成都枢纽中⼼】", "AcceptTime" : "2019-10-07 23:24:14" }, { "AcceptStation" : "货物已完成分拣,离开【南充中转场】", "AcceptTime" : "2019-10-08 08:30:49" }, { "AcceptStation" : "货物已分配,等待配送", "AcceptTime" : "2019-10-08 08:42:27" }, { "AcceptStation" : "配送员开始配送,请您准备收货,配送员,张少虎,⼿机号,188********", "AcceptTime" : "2019-10-08 10:04:23" }, { "AcceptStation" : "货物已由本⼈签收,感谢您选择京东物流!", "AcceptTime" : "2019-10-08 15:46:50" } ], "State" : "3", "EBusinessID" : "1264783", "Success" : true }附上详细的接⼝⽂档给⼤家:提供源码下载:调⽤第三⽅物流接⼝,替换⾃⼰的key就能直接使⽤,主要实现了物流在线轨迹查询,订单订阅,轨迹推送,⽀持上百家家的快递查询接⼝,包括主流的四通⼀达,⽀持上门取件服务,其他接⼝调⽤,修改调⽤指令和参数就能实现。
快递查询API接口(51tracking)
快递查询API接⼝(51tracking)快递查询接⼝⽬前提供快递查询的接⼝平台有:快递100快递⽹不同接⼝的区别:(1)51tracking⽀持380家快递公司,其中有55家为国内的快递,其余325家为国际快递。
具体的价格为0.8分钱/单号左右,新注册⽤户可以免费测试12⼩时。
(2)快递100属于在国内做得⽐较早的平台,可以申请每天最多2000次的API调⽤,但需要给快递100做⼀个友链。
超过2000次收费,每次0.06~0.1元不等。
(3)快递⽹可以申请每天最多500次的API调⽤,但同样需要做⼀个友链。
超过部分,每次0.05元。
快递API的应⽤场景与⽤途1. 最常见的应⽤场景如下:(1)电商⽹站:例如B2C、团购、B2B、批发分销站、C2C、本地⽣活交易等⽹站。
(2)管理系统:订单处理平台、订货平台、发货平台、分销系统、渠道管理系统、客户管理系统、ERP等。
2. 快递API的⽤途如下:(1)让顾客登录⽹站后,直接在“我的订单”页⾯内就能看到订单的物流状态。
(2)⾃动筛选出“已签收”、“疑难件”等状态的单号,减轻物流跟单⼈员的压⼒。
(3)改变订单的状态和交易流程,例如单号变为“已签收”,就能让订单变为可以确认退换货等。
(4)评估选择快递公司,根据“已签收”的运单数,可以算出销售⼈员的业绩,且便于应对货到付款的结算。
(5)邮件、短信提醒⽤户运单的最新状态,可以安抚⽤户,也可以利⽤邮件短信⼆次营销。
对接⽰例这⾥以51tracking为例,不同的接⼝的对接⽅式⽐较类似,都需要注册,并⽣成⾃⼰的API key。
以下以51tracking的查询API为例。
接⼝⽀持的消息接收⽅式为HTTP POST 请求⽅法的编码格式为 utf-8 请求body部分的参数的数据格式为json 格式接⼝参数接⼝请求地址请求头部信息参数参数名称类型说明是否必须Content-Type: application/json定义请求头部的数据格式是Trackingmore-Api-Key: string后台获取的API是请求body参数说明参数说明类型说明是否必须tracking_number string查询快递的快递单号是carrier_code string51tracking定义的快递商简码,⽐如china ems 就是china-ema是carrier_code 参数是51tracking ⾃⼰定义的快递商家的简码。
常用快递API接口方案
params.put("EBusinessID", EBusinessID);
params.put("RequestType", "1001");
String dataSign=encrypt(requestData, AppKey, "UTF-8");
"'Volume':0.0," +
"'Remark':'小心轻放'," +
"'Commodity':" +
"[{" +
"'GoodsName':'鞋子'," +
"'Goodsquantity':1," +
"'GoodsWeight':1.0}]" +
"}";
Map<String, String> params = new HashMap<String, String>();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
免费快递查询接口文档-快递鸟API1.报文及报文编码接口提供:快递鸟报文格式:Json 格式请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"交互协议上统一用UTF-8,避免传递中文数据出现乱码。
2.应用场景(1)电商网站用户打开“我的订单”时调用此API显示物流信息详情。
(2)电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题。
(3)每日调用次数限制不超过3000次,如超过该限制,可对接物流跟踪API。
(4)全流程的物流状态跟踪I3.关于签名采用IP 认证加签名的方式对接,具体方案如下:1)防止数据被篡改在POST 请求中会传递 5 个必须(R)参数RequestData==数据内容(URL 编码:UTF-8)EBusinessID==用户IDRequestType=请求指令类型DataSign== 数据内容签名:把(请求内容(未编码)+ApiKey)进行MD5 加密,然后Base64编码,最后进行URL(utf-8)编码DataType==返回数据类型(2-json)注:DataSign 生成后,对方接收到数据后,以同样的算法进行签名,生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生数据篡改。
2)调用接口的身份认证注册成为接口用户后,会生成对应的用户ID 和APIKey,用户ID 相当于用户名,APIKey 相当于密码。
4.接入步骤1)接口网注册账号成为用户;提供的用户ID 是调用接口服务的身份证明,不可更改、不可转用,API Key 是应用访问API 的签名附加密钥,必须妥善保存。
两者关系类似于用户名和密码,两者都会在签名和业务参数中使用。
2)登陆用户后台,登陆用户后台,进行实名认证,并开通会员服务;3)根据技术文档进行开发并在调试平台测试联调;根据技术文档进行开发并在调试平台测试联调;API 接口的DEMO(包括:.Net 版本、Java 版本、PHP 版本)供开发参考。
4)系统发布上线。
系统发布上线。
注意:测试环境中获取的测试快递单号不可用于实际发货。
5.Demo1).NET开发using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using ;using System.IO;namespace KdGoldAPI{public class KdApiSearchDemo{//电商IDprivate string EBusinessID = "1237100";//电商加密私钥,注意保管,不要泄漏private string AppKey = "518a73d8-1f7f-441a-b644-33e77b49d846";//请求urlprivate string ReqURL = "/Ebusiness/EbusinessOrderHandle.aspx";/// <summary>/// Json方式查询订单物流轨迹/// </summary>/// <returns></returns>public string getOrderTracesByJson(){string requestData = "{'OrderCode':'','ShipperCode':'SF','LogisticCode':'589707398027'}";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(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;erAgent = "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 = puteHash(buffer);string ret = "";foreach (byte a in somme){if (a < 16)ret += "0" + a.ToString("X");elseret += 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){returnConvert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));}}}2)PHP开发<?php//电商IDdefined('EBusinessID') or define('EBusinessID', '请申请/reg');//电商加密私钥,注意保管,不要泄漏defined('AppKey') or define('AppKey', '请到官网申请/reg');//请求urldefined('ReqURL') or define('ReqURL', '/Ebusiness/EbusinessOrderHandle.aspx');//调用查询物流轨迹//---------------------------------------------$logisticResult=getOrderTracesByJson();echo logisticResult;//---------------------------------------------/*** Json方式查询订单物流轨迹*/function getOrderTracesByJson(){$requestData= "{'OrderCode':'','ShipperCode':'YTO','LogisticCode':'12345678'}";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '1002','RequestData' => urlencode($requestData) ,'DataType' => '2',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** post提交数据* @param string $url 请求Url* @param array $datas 提交的数据* @return url响应返回的html*/function sendPost($url, $datas) {$temps = array();foreach ($datas as $key => $value) {$temps[] = sprintf('%s=%s', $key, $value);}$post_data = implode('&', $temps);$url_info = parse_url($url);if(empty($url_info['port'])){$url_info['port']=80;}$httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";$httpheader.= "Host:" . $url_info['host'] . "\r\n";$httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";$httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";$httpheader.= "Connection:close\r\n\r\n";$httpheader.= $post_data;$fd = fsockopen($url_info['host'], $url_info['port']);fwrite($fd, $httpheader);$gets = "";$headerFlag = true;while (!feof($fd)) {if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) { break;}}while (!feof($fd)) {$gets.= fread($fd, 128);}fclose($fd);return $gets;}/*** 电商Sign签名生成* @param data 内容* @param appkey Appkey* @return DataSign签名*/function encrypt($data, $appkey) {return urlencode(base64_encode(md5($data.$appkey)));}?>3)JAVA开发import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;public class KdniaoTrackQueryAPI {//DEMOpublic static void main(String[] args) {KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();try {String result = api.getOrderTracesByJson("ANE", "210001633605");System.out.print(result);} catch (Exception e) {e.printStackTrace();}}//电商IDprivate String EBusinessID="请申请";//电商加密私钥,注意保管,不要泄漏private String AppKey="请申请";//请求urlprivate String ReqURL="/Ebusiness/EbusinessOrderHandle.aspx";/*** Json方式查询订单物流轨迹* @throws Exception*/public String getOrderTracesByJson(String expCode, String expNo) throws Exception{ String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";Map<String, String> params = new HashMap<String, String>();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "1002");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();}}。