单号自动识别接口文档-快递鸟
快递单号查询自动识别接口API技术文档

快递单号查询自动识别接口API
快递鸟
版本
1功能说明
通过运单单号自动识别所属的快递公司。
同一个单号可能属于一家或者多家公司,快递鸟提供的服务为智能识别可能的快递公司,识别结果还需用户审核。
接口说明如下:
该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。
接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订阅的动作。
接口识别会返回一家或者多家快递公司,返回的数据根据快递鸟大数据分析结果排序,排名靠前的命中率更高。
若识别失败,快递鸟返回的匹配结果为空。
2接口规则
(1)、接口只支持Json格式参数,接口指令2002。
只支持POST请求方式,utf-8编码。
(2)、支持增值服务,保价、代收货款、货款直退、货款垫付等。
(3)、测试地址:
:8081/Ebusiness/EbusinessOrderHandle.aspx
(4)、正式地址:/Ebusiness/EbusinessOrderHandle.aspx
3系统级输入参数
4应用级输入参数
5返回结果参数。
快递鸟API电子面单接口说明文档

快递鸟电子面单接口说明文档快递鸟2017-04-25版本一、前言1、业务背景随着电子商务和物流信息化服务的迅猛发展,电子面单已经成为了商家快速发货并连接订单与物流的有力工具。
快递鸟电子面单接口是快递鸟提供给独立电商、仓储管理系统、打单软件、物流供应链等物流系统平台使用的物流下单接口,满足商家在线发货需求并提供打印电子面单的服务。
商家通过贵司系统选择物流公司发送请求通知快递公司有快递要发货,贵公司把数据通过此接口转发到快递鸟,由快递鸟为商家通知对应的快递公司快递员上门取件。
电子面单成功下单后,快递鸟系统内将自动订阅,一旦轨迹发生变化时,快递鸟将调用贵司推送接收接口将物流信息反向推送至商家。
同时若客户使用代收货款服务,快递鸟会将代收货款的货款状态独立推送给商家用户。
电子面单具有如下特点:●打印效率高相比传统针式打印机套打模式,打印速度提升6-8倍,热敏打印机打印速度平均30-40张/分。
●发货效率高包裹出库时减少了抽底单的工序,降低了操作成本、提升操作效率,运单和订单即时绑定,无需人工再次扫描绑定发货。
目前商家在使用电子面单的过程中也存在一些情况导致部分用户无法顺畅使用,例如:●大电商有多家合作快递公司,各家快递公司的模板尺寸不一,需要使用多个打印机打印面单。
●单号作废后回收机制不完善导致电商成本升高。
●二联电子面单无底单,运费核账存在问题(部分商家货物重量以称重为准)。
●打印时发现面单号余额不足,耽误发货。
●小B电商发货量不够申请网点的电子面单服务。
快递鸟电子面单接口为解决客户以上问题,新增如下解决方案:●电子面单余量查询:可通过电子面单余量查询接口查询,并且在快递鸟官网可设置余额不足提醒值(后续会加上余额不足短信/邮件提醒功能)●电子面单取消/回收:可通过电子面单取消接口,回收部分加盟快递公司的面单号。
●通用电子面单模板,含二联、三联模板●快递公司电子面单客户号在线申请●散户模式电子面单:部分快递公司无需申请电子面单客户号即可直接打印电子面单。
php快递鸟单号查询api接口免费对接调用

php快递鸟单号查询api接⼝免费对接调⽤快递鸟集成快递单号查询API接⼝,可以同时对接顺丰快递查询,中通、申通、圆通、韵达、百世、EMS等国内外418家物流快递公司接⼝查询等。
这些快递物流企业,提供了快递单号⾃动识别接⼝,快递单号查询接⼝等快递物流服务。
对于电商企业,ERP服务企业,集成此接⼝到⾃⼰的软件中,增加了企业的竞争⼒。
⼀、接⼝应⽤场景1.在电商平台购物后,通过购物订单跟踪物流时,调⽤此API获取物流信息详情2.处理运费对账时,⼀键获取运单物流状态3.批量跟踪及获取运单物流信息对接流程快递鸟⽹站申请接⼝KEY并认证-对接接⼝-调试-上线使⽤三、技术对接快递鸟提供的快递查询接⼝,⽀持418家快递物流查询,涵盖了国内外主流快递服务企业的单号查询,信息及时,数据完整。
登录快递鸟官⽹⽀持多种开发语⾔对接,包括JAVA,C#,PHP等。
根据您的开发语⾔,选择参考对应的代码⽰例,下⾯以PHP代码为例:<?php//电商IDdefined('EBusinessID') or define('EBusinessID', '123456');//电商加密私钥,快递鸟提供,注意保管,不要泄漏defined('AppKey') or define('AppKey', '1234567890');//请求url:测试地址//defined('ReqURL') or define('ReqURL', ':8080/kdniaosandbox/gateway/exterfaceInvoke.json');//请求url:正式地址defined('ReqURL') or define('ReqURL', '/Ebusiness/EbusinessOrderHandle.aspx');$kgs = "JD";//快递公司简称,官⽅有⽂档$number = "12345678";//快递单号//调⽤查询物流轨迹//---------------------------------------------$logisticResult=getOrderTracesByJson($kgs,$number);echo$logisticResult;//解析数据$data = json_decode($logisticResult,true);if($data['Success'] == true){//返回信息成功$str = "";if(isset($data['Traces']) && !empty($data['Traces'])){for($i=0;$i<count($data['Traces']);$i++){$str .= "时间:".$data['Traces'][$i]['AcceptTime']."<br/>地址:".$data['Traces'][$i]['AcceptStation']."<br/>";}}echo "您查询的单号是:".$data['LogisticCode']."<br/>物流信息:<br/>".$str."";}//---------------------------------------------/*** Json⽅式查询订单物流轨迹*/function getOrderTracesByJson($kgs,$number){$requestData= "{'OrderCode':'','ShipperCode':'$kgs','LogisticCode':'$number'}";$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)));}>。
快递鸟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 版本)供开发参考。
接口技术文档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)。
快递鸟电子面单API接口使用指南

快递鸟电子面单使用手册V1.0目录1 服务介绍 (1)2 服务价值 (2)3 准备工作 (2)3.1申请电子面单客户号及单号 (2)3.1.1月结模式申请客户号 (3)3.1.1快递鸟模式直接打印 (9)3.2购买或充值单号 (9)3.3准备热敏打印纸及打印机 (9)4 对接流程 (10)4.1 自营商家对接流程 (10)4.2 系统商,电商平台商家对接流程 (15)5 常见问题 (15)1服务介绍快递鸟电子面单API服务,是指由快递公司通过快递鸟电子面单API,向打单用户提供物流单号,实现种通过热敏纸打印输出纸质物流面单并发货的服务。
现该服务已支持21家快递公司,57个官方承认模板(含隐私快递),有效提高打印速度4-6倍,一次开发即可接入所有支持快递公司。
目前已支持:顺丰(SF)、EMS(EMS)、宅急送(ZJS)、圆通(YTO)、百世快递(HTKY)、中通(ZTO)、韵达(YD)、申通(STO)、德邦(DBL)、优速(UC)、京东(JD)、信丰(XFEX)、全峰(QFKD)、跨越速运(KYSY)、安能小包(ANE)、快捷快递(FAST)、国通(GTO)、天天快递(HHTT)、邮政快递包裹(YZPY)、中铁快运(ZTKY),后续更多的快递公司正在对接中。
EMS电子面单模板展示2服务价值打印速度提升:电子面单是普通纸质面单的4-6倍,平均每单打印只需花费1-2秒钟,高效率的打单大大缓解电商等客户的大批量打单压力,轻松应对大促。
提高发货效率:传统发货模式,操作员需要将已打出的快递单和订单信息匹配后再发货,电子面单不需要把快递单和定单信息逐一匹配操作,在定单信息申请快递单号的时候就已完成了定单匹配;卖家无需再安排人员专门抽取“发货联”,操作效率进一步提升。
3准备工作针对自营商家,以下工作可在对接过程中准备,以便对接完成后即可上线立即使用。
平台及系统商可参考如下流程指导平台用户自行准备。
3.1申请电子面单客户号及单号电子面单客户号即请求打印面单时的用户账号或月结编码或客户编码,不同物流服务商的叫法不同而已。
快递鸟物流接口技术文档

快递鸟接口(API)技术文档版本名词定义1 前言.............................................. 错误!未定义书签。
2 概述.............................................. 错误!未定义书签。
用户使用流程图............................. 错误!未定义书签。
接口规范及说明............................. 错误!未定义书签。
报文及报文编码............................. 错误!未定义书签。
接入步骤................................... 错误!未定义书签。
接口数据包结构............................. 错误!未定义书签。
JSON 范例.................................. 错误!未定义书签。
流程示意图................................. 错误!未定义书签。
网关地址................................... 错误!未定义书签。
签名说明................................... 错误!未定义书签。
关于签名................................... 错误!未定义书签。
(C#)DataSign签名加密代码.................. 错误!未定义书签。
3 下单.............................................. 错误!未定义书签。
预约取件接口............................... 错误!未定义书签。
接口规则................................... 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单号自动识别接口文档-快递鸟一.接口说明PC端、移动端应用或网站应用集成运单物流信息查询功能时,只需要录入单号即可完成查询,无需用户输入快递公司。
电商网站要在快递鸟查询或者订阅运单时,可通过单号识别先行判断物流公司后,再订阅到快递鸟。
二.对接描述1.该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。
2.接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订阅的动作。
3.接口识别会返回一家或者多家快递公司,返回的数据根据快递鸟大数据分析结果排序,排名靠前的命中率更高。
4.若识别失败,快递鸟返回的匹配结果为空。
5.接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
三.参数列表四.对接案例1.JSON请求{"LogisticCode": "3967950525457"}2.JSON返回{"EBusinessID": "1257021","Success": true,"LogisticCode": "3967950525457","Shippers": [{"ShipperCode": "YD","ShipperName": "韵达快递"}]}3.C#对接demousing System;using System.Collections.Generic;using System.IO;using System.Linq;using ;using System.Text;using System.Web;namespace KdGoldAPI{public class KdApiOrderDistinguish{//电商IDprivate string EBusinessID = "请到快递鸟官网申请/ServiceApply.aspx";//电商加密私钥,快递鸟提供,注意保管,不要泄漏private string AppKey = "请到快递鸟官网申请/ServiceApply.aspx";//请求url//测试环境private string ReqURL = ":8081/Ebusiness/EbusinessOrderHandle.aspx";//正式环境//private string ReqURL = "/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;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));}}}附:单号查询接口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="请到快递鸟官网申请/ServiceApply.aspx";//电商加密私钥,快递鸟提供,注意保管,不要泄漏private String AppKey="请到快递鸟官网申请/ServiceApply.aspx";//请求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;}/*** XML方式查询订单物流轨迹* @throws Exception*/public String getOrderTracesByXml() throws Exception{String requestData= "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"+"<Content>"+"<OrderCode></OrderCode>"+"<ShipperCode>SF</ShipperCode>"+"<LogisticCode>589707398027</LogisticCode>"+"</Content>";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", "1");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();}}。