常用快遞電子面單接口API對接方法
快遞電子面單接口API比較常用在電商、倉儲系統和ERP系統,對接後不用下載下傳安裝軟體,可以直接嵌入系統網站調用。
目前有快遞鳥和菜鳥提供內建的電子面單列印接口,分别支援20,15家快遞的電子面單列印
1.1 接口
(1)、訂單編号(OrderCode)不可重複送出,重複送出系統會傳回具體錯誤代碼。
(2)、支援常用20家快遞電子面單列印。
(3)、測試位址:http://testapi.kdniao.cc:8081/api/eorderservice/
(4)、正式位址:http://api.kdniao.cc/api/EOrderService
(5)、接口申請:快遞鳥網站新增賬號申請接口
(6)、單号申請:部分快遞需提前申請單号

1.2 系統級和應用級輸入參數
系統級輸入參數 | 應用級輸入參數 | 類型 | 是否必須 | 描述 |
RequestData(必填參數,請求内容,JSON格式,須和DataType一緻) | CallBack | String | O | 使用者自定義回調資訊 |
MemberID | String | O | 會員辨別 平台方與快遞鳥統一使用者辨別的商家ID | |
CustomerName | String | O | 電子面單客戶賬号 (與快遞網點申請或通過快遞鳥官網申請或通過申請電子面單客戶号申請) | |
CustomerPwd | String | O | 電子面單密碼 | |
SendSite | String | O | 收件網點辨別 | |
ShipperCode | String | R | 快遞公司編碼 | |
LogisticCode | String | O | 快遞單号 | |
ThrOrderCode | String | O | 第三方訂單号 | |
OrderCode | String | R | 訂單編号 | |
MonthCode | String | C | 月結編碼 | |
PayType | Int | R | 郵費支付方式: 1-現付,2-到付,3-月結,4-第三方支付 | |
ExpType | String | R | 快遞類型:1-标準快件 | |
IsNotice | Int | O | 是否通知快遞員上門攬件:0-通知;1-不通知;不填則預設為1 | |
Cost | Double | O | 寄件費(運費) | |
OtherCost | Double | O | 其他費用 | |
Receiver | Company | String | O | 收件人公司 |
Name | String | R | 收件人 | |
Tel | String | R | 電話與手機,必填一個 | |
Mobile | String | |||
PostCode | String | O | 收件人郵編 | |
ProvinceName | String | R | 收件省(如廣東省,不要缺少“省”) | |
CityName | String | R | 收件市(如深圳市,不要缺少“市”) | |
ExpAreaName | String | O | 收件區(如福田區,不要缺少“區”或“縣”) | |
Address | String | R | 收件人詳細位址 | |
Sender | Company | String | O | 發件人公司 |
Name | String | R | 發件人 | |
Tel | String | R | 電話與手機,必填一個 | |
Mobile | String | |||
PostCode | String | O | 發件人郵編 | |
ProvinceName | String | R | 發件省(如廣東省,不要缺少“省”) | |
CityName | String | R | 發件市(如深圳市,不要缺少“市”) | |
ExpAreaName | String | O | 發件區(如福田區,不要缺少“區”或“縣”) | |
Address | String | R | 發件詳細位址 | |
StartDate | String | O | 上門取貨時間段: "yyyy-MM-dd HH:mm:ss"格式化,本文中所有時間格式相同 | |
EndDate | String | O | ||
Weight | Double | O | 物品總重量kg | |
Quantity | Int | O | 件數/包裹數 | |
Volume | Double | O | 物品總體積m3 | |
Remark | String | O | 備注 | |
AddService | Name | String | 增值服務名稱 | |
Value | String | 增值服務值 | ||
CustomerID | String | 客戶辨別(選填) | ||
Commodity | GoodsName | String | R | 商品名稱 |
GoodsCode | String | O | 商品編碼 | |
Goodsquantity | Int | O | 件數 | |
GoodsPrice | Double | O | 商品價格 | |
GoodsWeight | Double | O | 商品重量kg | |
GoodsDesc | String | O | 商品描述 | |
GoodsVol | Double | O | 商品體積m3 | |
IsReturnPrintTemplate | String | O | 傳回電子面單模闆: 0-不需要;1-需要 | |
IsSendMessage | Int | O | 是否訂閱短信 0-不需要;1-需要 | |
TemplateSize | String | O | 模闆尺寸 | |
EBusinessID | String | R | 商戶ID | |
RequestType | String | R | 請求指令類型:1007 | |
DataSign | String | R | 資料内容簽名 | |
DataType | String | R | 請求、傳回資料類型: 2-json | |
1.3 傳回結果參數
l 同步傳回
參數名稱 | 類型 | 必須要求 | 說明 | |
EBusinessID | String | R | 電商使用者ID | |
Order | OrderCode | String | R | 訂單編号 |
ShipperCode | String | R | 快遞公司編碼 | |
LogisticCode | String | R | 快遞單号 | |
MarkDestination | String | O | 大頭筆 | |
OriginCode | String | O | 始發地區域編碼 | |
OriginName | String | O | 始發地/始發網點 | |
DestinatioCode | String | O | 目的地區域編碼 | |
DestinatioName | String | O | 目的地/到達網點 | |
SortingCode | String | O | 分揀編碼 | |
PackageCode | String | O | 集包編碼 | |
Success | Bool | R | 成功與否 | |
ResultCode | String | R | 錯誤編碼 | |
Reason | String | O | 失敗原因 | |
UniquerRequestNumber | String | R | 唯一辨別 | |
PrintTemplate | String | O | 面單列印模闆 | |
EstimatedDeliveryTime | String | O | 訂單預計到貨時間yyyy-mm-dd | |
Callback | String | O | 使用者自定義回調資訊 | |
SubCount | Int | O | 子單數量 | |
SubOrders | String | O | 子單号 | |
SubPrintTemplates | String | O | 子單模闆 | |
ReceiverSafePhone | String | O | 收件人安全電話 | |
SenderSafePhone | String | 寄件人安全電話 | ||
DialPage | String | R | 撥号頁面網址(轉換成二維碼可掃描撥号) |
2 批量列印接口對接demo
package cc.kdniao.api;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.messaging.saaj.util.Base64;
/**
* Servlet implementation class printOrder
*/
@WebServlet("/printOrder")
public class printOrder extends HttpServlet {
private static final long serialVersionUID = 1L;
final String EBussinessID = "";//kdniao.com EBusinessID
final String AppKey = ""; //kdniao.com AppKey
final Integer IsPreview = 0; //是否預覽 0-不預覽 1-預覽
/**
* @see HttpServlet#HttpServlet()
*/
public printOrder() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
PrintWriter print = response.getWriter();
String jsonResult = "";
try {
String ip = getIpAddress(request);
jsonResult = getPrintParam(ip);
} catch (Exception e) {
//write log
}
print.println(jsonResult);
print.flush();
print.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, UnsupportedEncodingException {
// TODO Auto-generated method stub
response.setContentType("");
PrintWriter print = response.getWriter();
String jsonResult = "";
try {
String ip = getIpAddress(request);
jsonResult = getPrintParam(ip);
} catch (Exception e) {
//wirte log
}
print.println(jsonResult);
print.flush();
print.close();
}
/**
* get print order param to json string
* @return
*
* @throws Exception
*/
private String getPrintParam(String ip) throws Exception {
String data = "[{\"OrderCode\":\"234351215333113311353\",\"PortName\":\"SF\"},{\"OrderCode\":\"234351215333113311354\",\"PortName\":\"列印機名稱二\"}]";
String result = "{\"RequestData\": \"" + URLEncoder.encode(data, "UTF-8") + "\", \"EBusinessID\":\"" + EBussinessID + "\", \"DataSign\":\"" + encrpy(ip + data, AppKey) + "\", \"IsPreview\":\""
+ IsPreview + "\"}";
return result;
}
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();
}
private String encrpy(String content, String key) throws UnsupportedEncodingException, Exception {
String charset = "UTF-8";
return new String(Base64.encode(md5(content + key, charset).getBytes(charset)));
}
/**
* 擷取請求主機IP位址,如果通過代理進來,則透過防火牆擷取真實IP位址;
*
* @param request
* @return
* @throws IOException
*/
public final static String getIpAddress(HttpServletRequest request) throws IOException {
// 擷取請求主機IP位址,如果通過代理進來,則透過防火牆擷取真實IP位址
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = (String) ips[index];
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}
}