免费物流查询API接口对接流程-快递鸟
- 格式:docx
- 大小:856.24 KB
- 文档页数:5
常用快递接口,顺丰快递接口api对接调用顺丰快递是常用快递,电商、ERP等企业都需要对接其快递接口api。
对接有两种方式,第一和顺丰快递直接对接,第二,和快递鸟对接,和快递鸟对接可以一次性接入其他常用快递的接口。
快递100有顺丰接口,不过只能查询不能打印电子面单,而且是收费的,菜鸟有电子面单接口,但又不支持顺丰快递。
接口平台:快递鸟免费查询接口接口地址:http://ap /Ebusiness/EbusinessOrd erHandle.aspx支持格式:json请求方式:HTTP POST请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
顺丰快递接口api申请JSON请求/返回示例:1.请求{"OrderCode": "","ShipperCode": "SF","LogisticCode": "118650888018"}2.返回没有物流轨迹的{"EBusinessID": "1109259","Traces": [],"OrderCode": "","ShipperCode": "SF","LogisticCode": "118461988807","Success": false,"Reason": null}有物流轨迹的{"EBusinessID": "1109259","OrderCode": "","ShipperCode": "SF","LogisticCode": "118461988807","Success": true,"State": 3,"Reason": null,"Traces": [{"AcceptTime": "2014/06/25 08:05:37","AcceptStation": "正在派件..(派件人:邓裕富,电话:187****6310)[深圳市]","Remark": null},{"AcceptTime": "2014/06/25 04:01:28","AcceptStation": "快件在深圳集散中心,准备送往下一站深圳[深圳市]","Remark": null},{"AcceptTime": "2014/06/25 01:41:06","AcceptStation": "快件在深圳集散中心[深圳市]","Remark": null},{"AcceptTime": "2014/06/24 20:18:58","AcceptStation": "已收件[深圳市]","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}]}注:接口及签名说明1)、支持http传输协议2)、支持的数据传输格式Json/Xml(暂不支持<content/>这种形式)。
快递物流寄件下单api接口调用对接为了让你对接更简单,我会分享源代码,把源码复制到你的项目上,就能快速完成电商售后退货快递寄件下单预约快递员上门取件接口对接,调用快递鸟提供的上门取件API标准接口,成功调用后,快递员会准时上门取件,同时支持快递单号物流轨迹查询,快递鸟物流单号查询api接口不区分开发语言,支持Java,C#,PHP,Python,ObjectC等开发语言的程序调用。
1 接口规范说明1.1 接口规范及说明1.1.1 报文及报文编码报文格式:Json格式请求方法的编码格式(utf-8):交互协议上统一用UTF-8,避免传递中文数据出现乱码。
1.1.2 接口数据包结构图例- 数据包结构(系统级{数据})1.1.3 JSON示例1.1.4 系统级参数*快递所有接口统一使用此系统级参数,根据不同的请求接口指令接入不同的接口。
1.1.5 流程示意图1.1.6 名词定义1.2 签名说明1.2.1 关于签名快递鸟和第三方电子商务公司系统进行对接,有一定的安全机制。
采用IP认证加签名的方式对接,具体方案如下:1. 防止数据被篡改2. 注:DataSign生成后,对方接收到数据后,以同样的算法进行签名(推送接口RequestType为101/102不需要进行URL编码),生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生数据篡改。
2.调用接口的身份认证注册成为快递鸟用户后,会生成对应的用户ID和APIKey,用户ID相当于用户名,APIKey相当于密码。
举例:1.假设2.那么DataSign签名的内容为3.接收方收到数据后,获得EBusinessID 和RequestData和DataSign等这几个数据。
4.接收方对EBusinessID得到APIKey,RequestData+APIKey的数据进行md5和base64后的内容就为OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE=5.接收方判断签名后的数据跟传递过来的DataSign是否一致,如果一致进行业务操作,如果不一致返回错误。
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接口对接后可以在自己的网站点击查询就能查到物流轨迹,像京东淘宝查询物流的功能一样,适合一些自己研发的系统商、微信小程序,还有自己的电商网站。
方法/步骤
进入快递鸟网站下载对接相关的接口文档,和接口demo案例,接口demo案例可以直接调用,不用自己编写代码。
如果需要自己编写,可以参照接口文档
另外即时查询API、物流跟踪API和在途监控API都是查询快递的,可以根据不同情况对接使用
在右上角注册账号登录后进行账号认证,就可以对接接口了
在账号登录后首页可以查看接口ID和接口KEY,复制到demo中的“EBusinessID”和“AppKey”两个参数中,demo就可以使用了
对接完成后就是在调试平台调试接口,对比请求报文和返回报文确认对接是不是正确的。
这里需要注意的是,对接的是什么接口,就查看什么接口的调试报文
测试后就可以正式调用了,正式调用的时候在正式地址调用
最后做一个物流轨迹的数据展现就可以了,如下图。
快递鸟丰⽹速运快递查询接⼝源码_快递鸟单号查询API看完快递鸟api顺丰丰⽹速运快递对接教程这篇⽂章,然后把源码复制到你的项⽬上,就能快速完成丰⽹速运快递接⼝对接.更适合刚⼊门的菜鸟,调⽤快递鸟的丰⽹速运快递快递查询API接⼝,能查询到快递单号从收件、运输,到转运中⼼,派送到签收等各个环节的物流发货状态。
快递鸟api接⼝不区分开发语⾔,⽀持Java,C#,PHP,Python,ObjectC等开发语⾔的程序调⽤。
编码⽤顺丰编码即可查询(SF),下⾯具体讲解实现过程.1.完成前期准备⼯作1.1,去快递鸟官⽹免费注册⼀个账号1.2,免费获得⼀个apiKey(接⼝权限验证需要)1.3,完成实名认证流程1.4,订购⼀个免费套餐2.API接⼝2.3,请求⽅式:POST2.4,编码格式(utf-8):application/x-www-form-urlencoded;charset=utf-82.5,返回类型:JSON2.6,调试页⾯:2.7,调试⼯具:去调试(使⽤快递鸟账号登录)3.请求参数(Headers)4.请求参数(Body)6.请求完整报⽂(⽰例)RequestData=%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27JTSD%27%2c%27LogisticCode%27%3a%27jt0000052600488%27%7d&EBusinessID=1264783&RequestType=1002&DataSign=MTYyMDU4NWQ2NmU1ZDI2MDEzNGE5YmVlM2YxYzEzMTM%3d&DataType=27.成功返回报⽂(⽰例){"LogisticCode": "SF0000052600488","ShipperCode": "SF","Traces": [{"AcceptStation": "【芜湖市】【芜湖镜湖⽹点】的邓拥军 178********已取件","AcceptTime": "2020-03-16 16:26:13"},{"AcceptStation": "【芜湖市】【芜湖镜湖⽹点】的邓拥军 178********已取件","AcceptTime": "2020-03-16 16:41:33"},{"AcceptStation": "【芜湖市】【芜湖镜湖⽹点】已收件","AcceptTime": "2020-03-16 17:39:21"},{"AcceptStation": "【芜湖市】快件离开【芜湖镜湖⽹点】已发往【芜湖转运中⼼】","AcceptTime": "2020-03-16 17:40:27"},{"AcceptStation": "【芜湖市】快件到达【芜湖转运中⼼】","AcceptTime": "2020-03-16 19:36:32"},{"AcceptStation": "【芜湖市】快件离开【芜湖转运中⼼】已发往【合肥转运中⼼】","AcceptTime": "2020-03-16 20:47:03"},{"AcceptStation": "【合肥市】快件到达【合肥转运中⼼】","AcceptTime": "2020-03-16 23:40:10"},{"AcceptStation": "【合肥市】快件离开【合肥转运中⼼】已发往【⼴州花都转运中⼼】","AcceptTime": "2020-03-17 00:10:48"},{"AcceptStation": "【⼴州市】快件到达【⼴州花都转运中⼼】","AcceptTime": "2020-03-17 20:45:00"},{"AcceptStation": "【⼴州市】快件离开【⼴州花都转运中⼼】已发往【深圳宝安转运中⼼】","AcceptTime": "2020-03-18 00:17:55"},{"AcceptStation": "【深圳市】快件到达【深圳宝安转运中⼼】","AcceptTime": "2020-03-18 03:00:17"},{"AcceptStation": "【深圳市】快件离开【深圳宝安转运中⼼】已发往【深圳福⽥⽹点】","AcceptTime": "2020-03-18 04:44:39"},{"AcceptStation": "【深圳市】【深圳福⽥⽹点】的邹俊林 176********正在派件","AcceptTime": "2020-03-18 08:10:09"},{"AcceptStation": "【深圳市】【深圳福⽥⽹点】的赵凯 159********正在派件","AcceptTime": "2020-03-18 09:55:19"},{"AcceptStation": "【深圳市】快件已签收,签收⼈是【代收】,如有疑问请联系:159********,期待再次为您服务", "AcceptTime": "2020-03-18 14:53:54"}],"State": "3","EBusinessID": "1264783","Success": true}8.失败返回报⽂(⽰例){"LogisticCode": "SF0000052600488","ShipperCode": "SF","Traces": [],"State": "0","EBusinessID": "1264783","Reason": "业务错误[没有可⽤套餐]","Success": false}说明:未实名认证,未订购套餐,套餐可⽤查询量已经⽤完都会返回此报⽂信息9.⽆轨迹返回报⽂(⽰例){"LogisticCode": "SF0000052600488","ShipperCode": "SF","Traces": [],"State": "0","EBusinessID": "1264783","Reason": "暂⽆轨迹信息","Success": true}10.分步讲解(C#版本)10.1,请求数据包结构10.2,C#调⽤代码⽰例//电商IDstring eEBusinessID = "test1617571";//电商加密私钥,快递鸟提供,注意保管,不要泄漏string appKey= "554343b2-7252-439b-b4eb-1af42c8f2175";//请求urlstring reqURL = ":8080/kdniaosandbox/gateway/exterfaceInvoke.json";//请求指令string reqType="1002";//2-jsonstring dataType = "2";//字符编码采⽤UTF-8string charset = "UTF-8";//JSON字符串stringstring jsonStr = "{"OrderCode":"","ShipperCode":"SF","LogisticCode":"SF0000052600488"}" ;//把(jsonStr+APIKey)进⾏MD5加密string md5Str=MD5(jsonStr + apiKey, charset);//把md5Str 进⾏Base64编码string base64Str=base64(md5Str,charset);//进⾏URL编码 (utf-8)string datasign = HttpUtility.UrlEncode(base64Str, charset);//请求报⽂参数string postStr = "RequestType=reqType&EBusinessID= eEBusinessID&RequestData=jsonStr&DataSign= datasign&DataType=dataType";//通讯协议使⽤Http协议Post请求⽅式返回轨迹数据string post = SendPost(reqURL, postStr);//获取到的post数据就是快递鸟返回的完整报⽂,接下来⾃⼰写⼀个解析json的⽅法就能获取到⾥⾯的字段信息。
物流快递单号查询接口种类及对接方法目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。
第一种耗费时间长,但是是直接和快递公司合作,第二种虽然是间接对接,但是对接简便,对后期的接口维护可以省很多时间和人力成本。
集成接口还有其他公司提供,有其他需要可以去找,快递鸟其实能满足电商、ERP系统商这些企业需求了。
这里就以快递鸟为例说说对接方法。
快递鸟物流查询接口有免费和收费版本,对接周期大概在一天左右,他们有写好的demo,可以直接使用。
一.即时查询接口(免费)1. 接口规则(1)、查询接口支持按照运单号查询(单个查询,并发不超过10个/S)。
(2)、指定的物流运单号选择相应的快递公司编码,格式不对或则编码错误都会返失败的信息。
如EMS物流单号应选择快递公司编码(EMS)(3)、返回的物流跟踪信息按照发生的时间升序排列。
(4)、接口指令1002。
(5)、请求地址:快递鸟2. 系统级和应用级输入参数返回结果参数这个是用户在订阅单号成功且有物流轨迹更新后,快递鸟的推送客户通过下单、订阅接口,把运单号在快递鸟系统订阅。
运单物流信息有更新,快递鸟通过推送接口把更新的信息推送给客户。
推送接口由用户按照快递鸟规则实现。
商户开放接口,快递鸟定时将最新的物流轨迹推送到商户平台。
优点:客户不需要关注轨迹变化,一旦有更新,快递鸟自动推送。
缺点:对客户的服务器性能有所要求,快递鸟定时请求接口,对客户的服务器有一定的影响,客户服务器异常将接受不到最新数据。
快递鸟推送接口根据业务不同,会根据RequestType的分类推送不同的数据,用户需对推送的数据进行分类保存。
原推送接口无需变化,快递鸟会根据推送版本进行推送。
1. 接口规则(1)、客户服务器必须稳定,并且有一定的接受数据能力(需要在5S内给快递鸟返回成功示例,超时会判断推送失败)。
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 版本)供开发参考。
快递鸟电子面单使用手册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申请电子面单客户号及单号电子面单客户号即请求打印面单时的用户账号或月结编码或客户编码,不同物流服务商的叫法不同而已。
快递鸟电子面单使用手册V1.0目录1 服务介绍..................................................................................................... 错误!未指定书签。
2 服务价值..................................................................................................... 错误!未指定书签。
3 准备工作..................................................................................................... 错误!未指定书签。
3.1申请电子面单客户号及单号........................................................... 错误!未指定书签。
3.1.1月结模式申请客户号.................................................................... 错误!未指定书签。
3.1.1快递鸟模式直接打印.................................................................... 错误!未指定书签。
3.2购买或充值单号............................................................................... 错误!未指定书签。
3.3准备热敏打印纸及打印机............................................................... 错误!未指定书签。
浅谈各种快递单号查询接口种类及对接方法目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。
第一种耗费时间长,但是是直接和快递公司合作,第二种虽然是间接对接,但是对接简便,对后期的接口维护可以省很多时间和人力成本。
集成接口还有其他公司提供,有其他需要可以去找,快递鸟其实能满足电商、ERP系统商这些企业需求了。
这里就以快递鸟为例说说对接方法。
快递鸟物流查询接口有免费和收费版本,对接周期大概在一天左右,他们有写好的demo,可以直接使用。
一.即时查询接口1. 接口规则(1)、查询接口支持按照运单号查询(单个查询,并发不超过10个/S)。
(2)、指定的物流运单号选择相应的快递公司编码,格式不对或则编码错误都会返失败的信息。
如EMS物流单号应选择快递公司编码(EMS)(3)、返回的物流跟踪信息按照发生的时间升序排列。
(4)、接口指令1002。
2. 系统级和应用级输入参数返回结果参数4. 示例//请求示例<br>{"OrderCode": "","ShipperCode": "SF","LogisticCode": "118650888018" }//返回示例<br>//没有物流轨迹的{"EBusinessID": "1109259","Traces": [],"OrderCode": "",2.2接收接口这个是用户在订阅单号成功且有物流轨迹更新后,快递鸟的推送客户通过下单、订阅接口,把运单号在快递鸟系统订阅。
运单物流信息有更新,快递鸟通过推送接口把更新的信息推送给客户。
快递鸟预约取件接口API对接说明手册
一、接口描述/说明
(1)在线下单接口(预约取件接口)是提供给独立电商、仓储管理系统、物流供应链等物流系统平台使用的下单接口。
(2)为客户解决在线发货需求,商户通过网络选择快递公司发送请求通知快递公司有快递要发货。
(3)订单编号(OrderCode)不可重复提交,重复提交系统会返回具体错误代码。
(4)接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
(5)接口地址:API测试地址::8081/api/OOrderService
API正式地址:/OOrderService
(6)接口使用:在快递鸟网站申请接口KEY
请求系统级参数说明:
备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)
二、接口参数
请求内容字段定义
返回参数定义
三、示例。
python快速实现极兔快递物流轨迹单号查询API接⼝对接快递鸟在开发之前,我们先来了解⼀下什么是即时查询,按我的理解就是,我们提供运单号和快递公司编码,然后调⽤快递鸟提供的查询接⼝,即可查询运单号的发货情况,我们可以通过这个接⼝获悉到包裹的收件时间,派送时间,签收时间,签收⼈,如果体验做的更好⼀点,通过⼤数据可以分析这个包裹的预计派送时间。
以下是我通过调⽤快递鸟接⼝提供的即时查询接⼝获得的内容,快递鸟⽀持包括顺丰、中通、圆通、申通、韵达、百世、极兔、德邦、安能、EMS等在内的国内外超过600家的物流快递接⼝服务。
极兔快递查询调⽤快递鸟提供的快递查询API标准接⼝,快速对接600多家快递公司的物流轨迹查询,本篇⽂章实现<极兔快递>的快递单号查询。
⾸先我们准备好需要⽤到的资源,这⾥推荐⼤家去爱奇艺查看视频教程:测试商户ID:test1617571测试API key:554343b2-7252-439b-b4eb-1af42c8f2175(此Key仅限测试环境使⽤)API测试地址:接⼝参数,也叫业务参数,请求的业务接⼝不同,参数的字段,内容也不同,是跟着业务变化的,这⾥我们实现的是即时查询接⼝,请求指令类型:1002,快递鸟官⽹要求必须传递快递公司编码和物流单号,EMS快递的编码是EMS如要查看其他快递公司的编码,点击此链接:我们⽤真实单号(1160001630231)来完成轨迹接⼝调⽤,请求 JSON{'OrderCode':'','ShipperCode':'EMS','LogisticCode':' 1160001630231'}请求的完整报⽂(URL编码以后):RequestData=%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27EMS%27%2c%27LogisticCode%27%3a%271160001630231%27%7d%0d%0a++++++++&EBusinessID=1264未编码的请求报⽂:RequestData={'OrderCode':'','ShipperCode':'EMS','LogisticCode':'1160001630231'}&EBusinessID=1264783&RequestType=1002&DataSign=NDlmMDAzZTYwYmYyY2FmZjRjOTNhZDAwYjVkNDVjODM=&DataType=2返回参数定义:返回报⽂信息{"LogisticCode": "1160001630231","ShipperCode": "JTSD","Traces": [{"AcceptStation": "[莆⽥市]【莆⽥电商营业部】已收件,揽投员:郑美停,电话:152********","AcceptTime": "2020-02-06 20:12:56"}, {"AcceptStation": "[莆⽥市]离开【莆⽥电商营业部】,下⼀站【莆⽥市邮区中⼼】","AcceptTime": "2020-02-06 20:15:50"}, {"AcceptStation": "[莆⽥市]到达【莆⽥市邮区中⼼】","AcceptTime": "2020-02-06 20:17:26"}, {"AcceptStation": "[莆⽥市]离开【莆⽥市邮区中⼼】,下⼀站【福州旗⼭处理中⼼】","AcceptTime": "2020-02-06 23:59:31"}, {"AcceptStation": "[福州市]到达【福州旗⼭处理中⼼】(经转)","AcceptTime": "2020-02-07 17:40:37"}, {"AcceptStation": "[福州市]离开【福州旗⼭处理中⼼】,下⼀站【长沙邮件处理中⼼】(经转)","AcceptTime": "2020-02-08 04:56:41"}, {"AcceptStation": "[长沙市]到达【长沙邮件处理中⼼】(经转)","AcceptTime": "2020-02-08 16:05:58"}, {"AcceptStation": "[长沙市]离开【长沙邮件处理中⼼】,下⼀站【益阳邮件处理中⼼】(经转)","AcceptTime": "2020-02-08 20:28:47"}, {"AcceptStation": "[益阳市]到达【益阳邮件处理中⼼】","AcceptTime": "2020-02-09 00:25:22"}, {"AcceptStation": "[益阳市]离开【益阳邮件处理中⼼】,下⼀站【益阳市资阳揽投部】","AcceptTime": "2020-02-09 06:22:33"}, {"AcceptStation": "[益阳市]到达【益阳市资阳揽投部】","AcceptTime": "2020-02-09 08:56:06"}, {"AcceptStation": "[益阳市]【益阳市资阳揽投部】安排投递,投递员:龙飞跃,电话:158********,揽投部电话:177********", "AcceptTime": "2020-02-09 09:26:09"}, {"AcceptStation": "[益阳市]已签收,收发室,投递员:龙飞跃,电话:158********","AcceptTime": "2020-02-09 15:03:48"}],"State": "3","EBusinessID": "1264783","Success": true} 这⾥根据我们的实际业务需求来选择免费套餐或者收费套餐。
快递鸟智选物流接口对接方案1智选物流1.1对接流程1)注册快递鸟接口账号/reg2)在官网登录进入用户管理后台,进行实名认证,开通接口3)技术对接(在线开发文档:/api-subscribe)4、上线1.2JSON请求返回案例1)JSON请求{"MemberID": "123456","WarehouseID": "1","Detail": [{"OrderCode": "12345","OriginalExpCode":"SF","EstimatedShipTime":"2017-02-16 12:13:12""IsCOD": 0,"Sender": {"ProvinceName": "广东省","CityName": "广州","ExpAreaName": "龙岗区","Subdistrict": "布吉街道","Address": "518000"},"Receiver": {"ProvinceName": "广东","CityName": "梅州","ExpAreaName": "丰顺","Subdistrict": "布吉街道","Address": "518000"},"Goods": [{"ProductName": "包","Volume": "","Weight": "1"}]},{"OrderCode": "12346","IsCOD": 0,"Sender": {"ProvinceName": "广东省","CityName": "广州","ExpAreaName": "龙岗区","Subdistrict": "布吉街道","Address": "518000"},"Receiver": {"ProvinceName": "湖南","CityName": "长沙","ExpAreaName": "龙岗区","Subdistrict": "布吉街道","Address": "518000"},"Goods": [{"ProductName": "包","Volume": "","Weight": "1"}]}]}2)JSON返回{"EBusinessID": "1257227", "Success": true, "RecommendDetail": [{"ExpressList": [{"ExpCode": "ZTO","ExpName": "中通速递","LineName": "","Fee": 10.00,"EstimatedDeliveryTime": 44.20,"SpecificDeliveryTime ":"2017-02-12 09:12","IsSupport": "1","RecommendReason": 0,"Remark": ""},{"ExpCode": "ZTO","ExpName": "中通速递","LineName": "","Fee": 10.00,"EstimatedDeliveryTime": 44.20,"IsSupport": "1","RecommendReason": 1,"Remark": ""},{"ExpCode": "JYM","ExpName": "加运美","SpecificDeliveryTime ":"2017-02-12 09:12","LineName": "","EstimatedDeliveryTime": 15.23,"IsSupport": "1","RecommendReason": 2,"Remark": ""}],"OrderCode": "12345"},{"ExpressList": [{"ExpCode": "ZTO","ExpName": "中通速递","SpecificDeliveryTime ":"2017-02-12 09:12","LineName": "","Fee": 16.00,"EstimatedDeliveryTime": 48.26,"IsSupport": "1","RecommendReason": 0,"Remark": ""},{"ExpCode": "ZTO","ExpName": "中通速递","SpecificDeliveryTime ":"2017-02-12 09:12","LineName": "","Fee": 16.00,"EstimatedDeliveryTime": 48.26,"IsSupport": "1","RecommendReason": 1,"Remark": ""},{"ExpCode": "SF","ExpName": "顺丰快递","LineName": "","EstimatedDeliveryTime": 38.33,"IsSupport": "1","RecommendReason": 2,"Remark": ""}],"OrderCode": "12346"}]}1.3Demo1).NETusing System;using System.Collections.Generic;using System.IO;using System.Linq;using ;using System.Text;using System.Web;namespace KdGoldAPI{public class KdApiExpRecommend{//电商IDprivate string EBusinessID = "请申请";//电商加密私钥,注意保管,不要泄漏private string AppKey = "请申请";//请求url//测试环境private string ReqURL = ":8081/Ebusiness/EbusinessOrderHandle.aspx";//正式环境//private string ReqURL = "/Ebusiness/EbusinessOrderHandle.aspx";/// <summary>/// Json方式智选物流/// </summary>/// <returns></returns>public string getExpRecommendByJson(){string requestData = "{'MemberID':'123456','WarehouseID':'1','Detail':[{'OrderCode':'12345','IsCOD':0,'Sender':{'Provi nceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'广东','CityName':'梅州','ExpAreaName':'丰顺','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]},{'OrderCode':'12346','IsCOD':0,'Sender':{'ProvinceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'湖南','CityName':'长沙','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]}]}";Dictionary<string, string> param = new Dictionary<string, string>();param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));param.Add("EBusinessID", EBusinessID);param.Add("RequestType", "2006");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>/// Json方式运费模板导入/// </summary>/// <returns></returns>public string importCostTemplateByJson(){string requestData ="{'MemberID':'123456','Detail':[{'ShipperCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'龙岗','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':''},{'Ship perCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'雨花','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':'{{w-0}-0.4}*{{{1000-w}-0.4}+1}*4.700+ {{w-1000}-0.6}*[(w-1000)/1000]*4.700)','ShippingType':'1','IntervalList':[{'StartWeight': 1.0,'EndWeight': 2.0, 'Fee': 3.0}]}]}";Dictionary<string, string> param = new Dictionary<string, string>();param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));param.Add("EBusinessID", EBusinessID);param.Add("RequestType", "2004");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)JAVAimport 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 KdApiExpRecommend {//DEMOpublic static void main(String[] args) {KdApiExpRecommend api = new KdApiExpRecommend();try {String result = api.getOrderTracesByJson();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 getExpRecommendByJson() throws Exception{String requestData= "{'MemberID':'123456','WarehouseID':'1','Detail':[{'OrderCode':'12345','IsCOD':0,'Sender':{'Provi nceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'广东','CityName':'梅州','ExpAreaName':'丰顺','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]},{'OrderCode':'12346','IsCOD':0,'Sender':{'ProvinceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'湖南','CityName':'长沙','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]}]}";Map<String, String> params = new HashMap<String, String>();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "2006");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;}/*** Json方式导入运费模板* @throws Exception*/public String importCostTemplateByJson() throws Exception{String requestData="{'MemberID':'123456','Detail':[{'ShipperCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'龙岗','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':''},{'Ship perCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'雨花','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':'{{w-0}-0.4}*{{{1000-w}-0.4}+1}*4.700+ {{w-1000}-0.6}*[(w-1000)/1000]*4.700)','ShippingType':'1','IntervalList':[{'StartWeight': 1.0,'EndWeight': 2.0, 'Fee': 3.0}]}]}";Map<String, String> params = new HashMap<String, String>();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "2004");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();}}3)PHP<?php//电商IDdefined('EBusinessID') or define('EBusinessID', '请申请');//电商加密私钥,注意保管,不要泄漏defined('AppKey') or define('AppKey', '请申请');//请求url//测试地址defined('ReqURL') or define('ReqURL', ':8081/Ebusiness/EbusinessOrderHandle.aspx');//正式地址//defined('ReqURL') or define('ReqURL', '/Ebusiness/EbusinessOrderHandle.aspx');//调用获取物流轨迹//-------------------------------------------------------------$logisticResult = getExpRecommendByJson();echo $logisticResult;//-------------------------------------------------------------/*** Json方式智选物流*/function getExpRecommendByJson(){$requestData="{'MemberID':'123456','WarehouseID':'1','Detail':[{'OrderCode':'12345','IsCOD':0,'Sender':{'Provi nceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'广东','CityName':'梅州','ExpAreaName':'丰顺','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]},{'OrderCode':'12346','IsCOD':0,'Sender':{'ProvinceName':'广东省','CityName':'广州','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Receiver':{'ProvinceName':'湖南','CityName':'长沙','ExpAreaName':'龙岗区','Subdistrict':'布吉街道','Address':'518000'},'Goods':[{'ProductName':'包','Volume':'','Weight':'1'}]}]}";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '2006','RequestData' => urlencode($requestData) ,'DataType' => '2',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** Json方式导入运费模板*/function importCostTemplateByJson(){$requestData= "{'MemberID':'123456','Detail':[{'ShipperCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'龙岗','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':''},{'Ship perCode':'YD','SendProvince':'广东','SendCity':'广州','SendExpArea':'天河','ReceiveProvince':'湖南','ReceiveCity':'长沙','ReceiveExpArea':'雨花','FirstWeight':'1','FirstFee':'8','AdditionalWeight':'1','AdditionalFee':'10','WeightFormula':'{{w-0}-0.4}*{{{1000-w}-0.4}+1}*4.700+ {{w-1000}-0.6}*[(w-1000)/1000]*4.700)','ShippingType':'1','IntervalList':[{'StartWeight': 1.0,'EndWeight': 2.0, 'Fee': 3.0}]}]}";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '2004','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)));}?>2运费模板导入接口2.1功能说明ERP服务商也可以将用户的协议物流公司及其协议价格先保存到接口运费模板系统中,智选物流每次计算时:若接口传递了协议公司和价格,那么默认按照接口提供的数据进行计算;若接口没有提供数据,则获取以保存的运费模板进行计算。
菜鸟物流api接口对接标准菜鸟物流是阿里巴巴集团旗下的一家专业物流服务提供商,致力于为电商行业提供全方位的物流解决方案。
菜鸟物流提供了一系列的API接口,方便企业与菜鸟物流进行系统对接,实现物流信息的及时同步和管理。
下面将详细介绍菜鸟物流API接口对接的标准。
1.确定对接需求:在进行API接口对接之前,首先需要确定对接的具体需求,包括物流信息的同步、订单的下发、运单的打印等功能。
2.申请接口权限:在菜鸟物流官网上申请API接口权限,获取对接所需的AppKey和AppSecret。
3.查询接口文档:下载菜鸟物流提供的API接口文档,了解各个接口的功能和调用方式。
4.选择合适的接口:根据对接需求选择合适的API接口,如物流信息查询接口、订单创建接口、运单打印接口等。
5.确定数据格式:确定接口请求和返回数据的格式,通常采用JSON格式进行数据交互。
6.进行接口调试:使用Postman等工具进行接口调试,验证接口的正确性和稳定性。
7.编写接口代码:根据接口文档编写对应的接口调用代码,实现与菜鸟物流系统的数据交互。
8.进行接口对接测试:在测试环境下进行接口对接测试,确保接口的功能正常。
9.与菜鸟物流对接人员沟通:在遇到问题时及时与菜鸟物流对接人员沟通,协助解决接口对接中的各种技术问题。
10.部署上线:完成接口对接测试后,将代码部署到生产环境上线,实现与菜鸟物流系统的正式对接。
11.完善接口监控:对接成功后,需要建立接口监控机制,及时发现和解决接口异常问题。
12.高可用性设计:在接口对接过程中,需要考虑接口的高可用性设计,保障接口的稳定性和可靠性。
13.数据加密传输:在进行数据传输时,需采用加密算法对数据进行加密,确保数据的安全性。
14.接口调用频率控制:合理控制接口的调用频率,防止接口被滥用导致系统崩溃。
15.接口权限验证:在接口调用时需要进行权限验证,确保只有授权的用户可以调用接口。
16.异常处理机制:对接口调用过程中可能出现的异常情况进行处理,保证系统的稳定性。
快递鸟电子面单接口说明文档快递鸟2017-04-25版本一、前言1、业务背景随着电子商务和物流信息化服务的迅猛发展,电子面单已经成为了商家快速发货并连接订单与物流的有力工具。
快递鸟电子面单接口是快递鸟提供给独立电商、仓储管理系统、打单软件、物流供应链等物流系统平台使用的物流下单接口,满足商家在线发货需求并提供打印电子面单的服务。
商家通过贵司系统选择物流公司发送请求通知快递公司有快递要发货,贵公司把数据通过此接口转发到快递鸟,由快递鸟为商家通知对应的快递公司快递员上门取件。
电子面单成功下单后,快递鸟系统内将自动订阅,一旦轨迹发生变化时,快递鸟将调用贵司推送接收接口将物流信息反向推送至商家。
同时若客户使用代收货款服务,快递鸟会将代收货款的货款状态独立推送给商家用户。
电子面单具有如下特点:●打印效率高相比传统针式打印机套打模式,打印速度提升6-8倍,热敏打印机打印速度平均30-40张/分。
●发货效率高包裹出库时减少了抽底单的工序,降低了操作成本、提升操作效率,运单和订单即时绑定,无需人工再次扫描绑定发货。
目前商家在使用电子面单的过程中也存在一些情况导致部分用户无法顺畅使用,例如:●大电商有多家合作快递公司,各家快递公司的模板尺寸不一,需要使用多个打印机打印面单。
●单号作废后回收机制不完善导致电商成本升高。
●二联电子面单无底单,运费核账存在问题(部分商家货物重量以称重为准)。
●打印时发现面单号余额不足,耽误发货。
●小B电商发货量不够申请网点的电子面单服务。
快递鸟电子面单接口为解决客户以上问题,新增如下解决方案:●电子面单余量查询:可通过电子面单余量查询接口查询,并且在快递鸟官网可设置余额不足提醒值(后续会加上余额不足短信/邮件提醒功能)●电子面单取消/回收:可通过电子面单取消接口,回收部分加盟快递公司的面单号。
●通用电子面单模板,含二联、三联模板●快递公司电子面单客户号在线申请●散户模式电子面单:部分快递公司无需申请电子面单客户号即可直接打印电子面单。
目前快递鸟物流查询API接口有两种对接方式,这两种方式都需要先到快递鸟官网上填写申请信息(注册网址:/reg)
填写申请信息,信息表格中“日查询次数”要选择对,如果不确认,可以先接入查询接口。
申请完成,登录就可以看到自己的ID和KEY,这个ID和KEY只能一个公司使用,保证数据的稳定性,所以这个ID和KEY都是保密的。
从这一步开始,每日查询次数≤3000次和>3000的对接方式就不一样了。
1.每日查询次数≤3000次(即时查询接口)
即时查询接口,是根据快递单号和快递公司编码实时查询物流轨迹信息的接口。
注册后可以参照如下进行开发对接:
1.1即时查询接口对接描述/说明
(1)根据订单编号和快递公司编码查询物流轨迹信息(支持在快递鸟订单)。
(2)根据快递单号和快递公司编码查询物流轨迹信息。
(3)接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。
如:EMS物流单号应选择快递公司编码(EMS)查看快递公司编码
(4)返回的物流跟踪信息按照发生的时间升序排列。
(5)接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
(6)请求系统级参数说明:
备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。
(7)接口地址:API地址:/Ebusiness/EbusinessOrderHandle.aspx (8)接口参数
请求内容字段定义
返回参数定义
2.每日查询次数>3000(订阅接口)
订阅推送接口,用户订阅快递单号,快递鸟系统会定时推送新的物流信息。
注册后填写《用户接入表》(接入表下载网址/download),完善《用户信息登记表》、《物流数据需求表》这两个表格的内容,并发送到service@。
注册并提交《用户接入表》后可以参照如下进行开发对接:
2.1订阅接口对接描述/说明:
(1)此功能为专业定制,为特殊商户提供订阅服务,快递鸟系统会定时推送新的物流信息到商户系统。
(2)订阅快递号需指定相应的快递公司编码,格式不对或则编码错误都会返失败的信息。
如:EMS物流单号应选择快递公司编码(EMS)查看快递公司编码
(3)接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
(4)请求系统级参数说明:
备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。
(5)接口地址:
API地址:/Ebusiness/EbusinessOrderHandle.aspx
2.2推送接口(商户实现)
(1)客户需要按快递鸟要求开发接口,保证信息的正常接收。
(2)快递鸟主动推送时,物流信息接收接口由商户提供。
(3)接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。
(4)运单物流信息全量推送(每次推送的运单物流信息包括运单当前所有的的物流信息)。
(5)请求系统级参数说明:
备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。
2.3接口参数
(1)请求内容字段定义
(2)返回参数定义
(3)推送接口(商户实现)
请求内容字段定义
返回参数定义
开发完成后联系在线客服进行接口双方联调,联调结束后就可以调用接口及接收物流轨迹了。