快遞鳥作為全球最大的第三方物流接口服務商,電子面單可一次性對接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編碼,且提交表單中的請求數據必須加轉義字符
