快遞電子面單接口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 |
0 |
增值服務名稱 |
||
| Value |
String |
0 |
增值服務值 |
|||
| CustomerID |
String |
0 |
客戶標識(選填) |
|||
| 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 |
0 |
寄件人安全電話 |
|
| 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;
}
}
