快递鸟作为全球最大的第三方物流接口服务商,电子面单可一次性对接33家主流快递快运公司接口,永久免费,调用接口时快递鸟会向物流公司请求单号,并实时返回,可直接打印电子面单发货。
快递鸟支持EMS(EMS)、顺丰速运(SF)、邮政国内标快(YZBK)、邮政快递包裹(YZPY)、宅急送(ZJS)、联昊通速递(LHT)、全一快递(UAPEX)、申通快递(STO)、德邦快递(DBL)、京东快递(JD)、信丰物流(XFEX)、天天快递(HHTT)、速尔快递(SURE)、跨越速运(KYSY)、品骏快递(PJ)、承诺达(CND)、中通快递(ZTO)、韵达速递(YD)、百世快递(HTKY)、圆通速递(YTO)、远成快运(YCWL)、优速快递(UC)、安能快递(ANE)、天地华宇(HOAU)、腾林物流(TLWL)、德邦快运(DBLKY)、安能快运(ANEKY)、京东快运(JDKY)、龙邦快运(LB)、百世快运(HTKYKY)、中通快运(ZTOKY)、佳吉快运(CNEX)、韵达快运(YDKY)、顺心捷达(SX)电子面单接口。
1.登陆上述快递鸟网址进行注册获取ID与Key.——实名认证——开通需要的会员服务(电子面单)
批量打印:
开发对接前要下载技术说明文档(快递物流api接口文档下载_电子面单接口文档-快递鸟code接口文档),接口开发可以下载电子面单接口DEMO(快递鸟「即时查询DEMO」让对接更简单)进行参考,快递公司对应的编码可以下载“快递公司编码列表文档”“电子面单客户号参数对照表”“快递公司快递业务类型”进行查看
使用电子面单接口还需要电子面单账号获取单号,每家快递公司电子面单账号需要传的字段不同,详情参考“电子面单客户号参数对照表”,电子面单获取单号需要在快递鸟官网注册账号,可以在线申请部分快递公司电子面单客户号,不支持的可以线下联系当地网点申请,申请到后,需联系网点预先充值单号,通过快递鸟电子面单API下单即可获取到快递单号和大头笔信息
使用电子面单接口还需要电子面单账号,测试环境:必须使用快递鸟提供的测试账号,在快递鸟官网-帮助与文档下载,“快递鸟电子面单参数配置对照表”查看相应账号和接口请求对应的字段名;
正式环境:
无需电子面单账号直接下单:顺丰,EMS(广东省内发全国),宅急送,快捷,邮政快递包裹、中铁快运、全一快递;
线上(快递鸟后台)申请账号:优速、中通、韵达、圆通、远成快运、安能、百世;
(申请路径:快递鸟官网—电子面单—我的快递公司—申请新的快递公司);
其他的快递公司您需要和当地的快递网点线下申请账号(预存单号)才可以使用。
接入过程中如有疑问可以加技术支持qq群进行咨询,具体对接文档在QQ群文件可以下载,开发完成后在测试环境测试,测试环境只是提供给用户调通接口使用,每家快递公司逻辑相同,测通一家快递公司说明接口已调通,正式环境下,有些快递公司无需电子面单账号直接下单打单,有些快递公司需要在快递鸟后台申请账号,有的快递公司您需要和当地的快递网点线下申请账号(预存单号)才可以使用。电子面单批量打印是可下载电子面单批量打印demo(快递鸟官网打印控件下载_云打印控件_电子面单打印控件_web打印控)进行参考。
对接中要注意:(1)确保接口中电商ID、密钥(AppKey)与用户管理后台的商户ID、密钥完全一致。(2)OrderCode必须是快递鸟电子面单下单接口正式环境下单的订单号;PortName是打印机名称,必须与本地打印机名称一致。(3)确保接口demo中GetIp()方法获取到的IP和用户连接打印机的电脑IP一致。(4)安装快递鸟打印控件C-Lodop (Print),调用快递鸟批量打印demo后会提示下载或在快递鸟网站下载。
最后发布上线,这就对接成功可以使用啦。电子面单接口调用成功后接口会直接返回HTML电子面单模板,可以直接使用浏览器打印,或者使用HTML控件进行打印。
批量打印的流程:
1、先调用电子面单打印接口获得必须字段:OrderCode(订单号)
2、拼接组合打印的数据data:格式json_encode([0=>[‘OrderCode‘ => ‘订单号1‘, ‘PortName‘ => ‘打印机名称‘]]);
3、签名
所需参数:
(1)、第二部拼接好的data,如下图:
打印的数据
(2)、连接打印机的主机外网ip
(3)、用户申请的快递鸟的APIKey
注意:(2)、(3)结合方式:ip . data 生产新的data,并用签名函数生成签名,如下图
签名代码如下:
以上流程,官方给的demo中都有,主要需要注意的点是如果快递鸟批量打印接口中返回错误总是提示 数据验证不通过 的话,需要注意的是客户端ip地址的获取,签名的数据拼接及表单数据的拼接方式,用户的appkey和商户ID是否正确等等;
以下是需要注意的点
一、连接打印机的ip获取是否有误?
(1)如果是在本地做测试,那么官方提供的获取本机ip地址是不行的,需要使用一下代码:
获取本机外网ip
(2)若是正式环境的话,则直接用官方demo就可以了,代码如下:
<?php /** * * 快递鸟电子面单接口 * * @技术QQ: 4009633321 * @技术QQ群: 200121393 * @see: http://www.kdniao.com/MiandanAPI.aspx * @copyright: 深圳市快金数据技术服务有限公司 * * ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx */ //电商ID defined(‘EBusinessID‘) or define(‘EBusinessID‘, ‘请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx‘); //电商加密私钥,快递鸟提供,注意保管,不要泄漏 defined(‘AppKey‘) or define(‘AppKey‘, ‘请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx‘); //请求url,接口正式地址:http://api.kdniao.cc/api/Eorderservice defined(‘ReqURL‘) or define(‘ReqURL‘, ‘http://testapi.kdniao.cc:8081/api/Eorderservice‘); //调用获取物流轨迹 //------------------------------------------------------------- //构造电子面单提交信息 $eorder = []; $eorder["ShipperCode"] = "SF"; $eorder["OrderCode"] = "PM201604062341"; $eorder["PayType"] = 1; $eorder["ExpType"] = 1; $sender = []; $sender["Name"] = "李先生"; $sender["Mobile"] = "18888888888"; $sender["ProvinceName"] = "李先生"; $sender["CityName"] = "深圳市"; $sender["ExpAreaName"] = "福田区"; $sender["Address"] = "赛格广场5401AB"; $receiver = []; $receiver["Name"] = "李先生"; $receiver["Mobile"] = "18888888888"; $receiver["ProvinceName"] = "李先生"; $receiver["CityName"] = "深圳市"; $receiver["ExpAreaName"] = "福田区"; $receiver["Address"] = "赛格广场5401AB"; $commodityOne = []; $commodityOne["GoodsName"] = "其他"; $commodity = []; $commodity[] = $commodityOne; $eorder["Sender"] = $sender; $eorder["Receiver"] = $receiver; $eorder["Commodity"] = $commodity; //调用电子面单 $jsonParam = json_encode($eorder, JSON_UNESCAPED_UNICODE); //$jsonParam = JSON($eorder);//兼容php5.2(含)以下 echo "电子面单接口提交内容:<br/>".$jsonParam; $jsonResult = submitEOrder($jsonParam); echo "<br/><br/>电子面单提交结果:<br/>".$jsonResult; //解析电子面单返回结果 $result = json_decode($jsonResult, true); echo "<br/><br/>返回码:".$result["ResultCode"]; if($result["ResultCode"] == "100") { echo "<br/>是否成功:".$result["Success"]; } else { echo "<br/>电子面单下单失败"; } //------------------------------------------------------------- /** * Json方式 查询订单物流轨迹 */ function submitEOrder($requestData){ $datas = array( ‘EBusinessID‘ => EBusinessID, ‘RequestType‘ => ‘1007‘, ‘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($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))); } /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die(‘possible deep recursion attack‘); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, ‘urlencode‘, true); $json = json_encode($array); return urldecode($json); } ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $.getJSON(‘/kdPrintOrderDemo/printOrder‘, function(data){ $("#EBusinessID").val(data.EBusinessID) $("#RequestData").val(data.RequestData) $("#IsPreview").val(data.IsPreview) $("#DataSign").val(data.DataSign) form1.submit() }) }); </script> </head> <body> <h1>Demo</h1> <div id="head"></div> <form id="form1" action="http://www.kdniao.com/External/PrintOrder.aspx" method="post" target="_self"> <div style=""> <div><input type="text" id="RequestData" name="RequestData" /></div> <div><input type="text" id="EBusinessID" name="EBusinessID" /></div> <div><input type="text" id="DataSign" name="DataSign" /></div> <div><input type="text" id="IsPreview" name="IsPreview" /></div> </div> </form> </body> </html>
二、电子面单批量打印对接注意事项:
(1)确保接口中电商ID、密钥(AppKey)与用户管理后台的商户ID、密钥完全一致;
(2)OrderCode必须是快递鸟电子面单下单接口正式环境下单的订单号;PortName是打印机名称,必须与客户端本地打印机名称一致;
(3)确保接口demo中GetIp()方法获取到的IP和用户服务器外网IP(百度搜索IP138)的一致。
(4)安装快递鸟打印控件C-Lodop (Print)
安装方式1、调用快递鸟批量打印demo后会提示下载。
安装方式2、在快递鸟官网下载,下载地址:快递鸟官网打印控件下载_云打印控件_电子面单打印控件_web打印控
需要特别注意:
1、如授权商家修改主账号密码,则授权码(Access token)随之失效,需重新授权。主账号密码不允许修改;
2、应用授权token有效期为一年。
3、token和CustomerPwd事业部编码要唯一绑定。
最终,快递鸟用户,需要将以下对应信息,复制提供给快递鸟技术支持进行配置:
EBusinessID快递鸟ID:
AppKey:
App Secret:
token:
CustomerName商家编码/青龙编码:
CustomerPwd事业部编码:
WareHouseID发货仓编码:
寄件人简称:
三、获取签名时,数据的拼接是否有误?
原来的代码中是用urlencode的形式将data数据进行编码再签名的,后期貌似不用进行url编码,且提交表单中的请求数据必须加转义字符
原文:https://www.cnblogs.com/kdn2019/p/11514476.html