德邦快遞的接入,關(guān)鍵也是組合數(shù)據(jù),提交并處理響應(yīng)數(shù)據(jù)邢隧,流程和順豐差不多痕慢,工具類比較簡(jiǎn)單,官方文檔都有抑堡,在做之前摆出,先把官方文檔都讀一遍,大概知道要找的內(nèi)容在什么位置首妖,以及了解流程偎漫。
對(duì)接規(guī)范和流程
◆傳輸協(xié)議
暫時(shí)只支持HTTP協(xié)議進(jìn)行通信。
◆數(shù)據(jù)傳輸格式
所有接口暫只支持json消息格式有缆。
◆編碼格式:UTF-8
交互編碼格式統(tǒng)一用UTF-8,避免傳遞中文數(shù)據(jù)出現(xiàn)亂碼象踊。
◆安全驗(yàn)證
在數(shù)據(jù)傳輸過(guò)程中,為避免數(shù)據(jù)被篡改,需要對(duì)數(shù)據(jù)進(jìn)行加密温亲。入?yún)⒂伤膫€(gè)參數(shù)組成:
params(請(qǐng)求參數(shù)),digest(密文摘要), timestamp(時(shí)間戳),companyCode(第三方接入商的公司編碼,雙方約定)
參數(shù)傳遞采用http post請(qǐng)求,請(qǐng)求消息頭設(shè)置("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
在傳輸?shù)膮?shù)中,既要傳遞原始的json字符串params,又要傳輸加密后的摘要digest。
設(shè)置有效的請(qǐng)求時(shí)間戳,當(dāng)接收端收到請(qǐng)求端的時(shí)間差不在有效的時(shí)間戳范圍內(nèi),則認(rèn)為該訂單無(wú)效通危。
德邦開(kāi)放平臺(tái)可以根據(jù)不同的公司設(shè)置不同的時(shí)間戳有效時(shí)長(zhǎng)铸豁。調(diào)用方在重發(fā)消息時(shí)時(shí)間戳應(yīng)重新生成,請(qǐng)求報(bào)文的摘要也需要重新生成。
timestamp:
13位Unix時(shí)間戳 timestamp = System.currentTimeMillis();
digest:
摘要的生成規(guī)則是 String plainText = params + appkey + timestamp,注意傳遞的timestamp要和加密的timestamp值相同菊碟。
加密源碼如下:
private static String getDigest(String plainText) {
return Base64.encodeBase64String(DigestUtils.md5Hex(plainText).getBytes());
}
Base64引用 : org.apache.commons.codec.binary.Base64
DigestUtils引用 : org.apache.commons.codec.digest.DigestUtils
然后可以測(cè)試一個(gè)流程是否可行节芥,比如【新】下單服務(wù)接口:
static String params = "{\n" +
" \"companyCode\":\"EWB111\",\n" +
" \"custOrderNo\":\"123456\",\n" +
" \"customerCode\":\"12345678\",\n" +
" \"logisticID\":\"LPEXP33343111111113445\",\n" +
" \"needTraceInfo\":1,\n" +
" \"orderType\":\"1\",\n" +
" \"packageInfo\":{\n" +
" \"cargoName\":\"貨物名\",\n" +
" \"deliveryType\":\"9\",\n" +
" \"totalNumber\":2,\n" +
" \"totalVolume\":0.01,\n" +
" \"totalWeight\":1,\n" +
" \"packageService\":\"紙\"\n" +
" },\n" +
" \"receiver\":{\n" +
" \"address\":\"詳細(xì)地址\",\n" +
" \"city\":\"上海市\(zhòng)",\n" +
" \"companyName\":\"德邦\",\n" +
" \"county\":\"青浦區(qū)\",\n" +
" \"mobile\":\"180****2531\",\n" +
" \"name\":\"AAA\",\n" +
" \"province\":\"上海\",\n" +
" \"town\":\"徐涇鎮(zhèn)\"\n" +
" },\n" +
"\n" +
" \"sender\":{\n" +
" \"address\":\"詳細(xì)地址\",\n" +
" \"city\":\"上海市\(zhòng)",\n" +
" \"companyName\":\"德邦\",\n" +
" \"county\":\"青浦區(qū)\",\n" +
" \"mobile\":\"180****3451\",\n" +
" \"name\":\"AAA\",\n" +
" \"province\":\"上海\",\n" +
" \"town\":\"徐涇鎮(zhèn)\"\n" +
" },\n" +
" \"transportType\":\"PACKAGE\",\n" +
" \"gmtCommit\":\"@time\",\n" +
" \"payType\":\"1\",\n" +
" \"isOut\":\"N\"\n" +
"}";
public static void main(String[] args) throws JSONException, Exception {
long timestamp = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
String _params = params.replaceAll("@time", DateUtils.dateToString(cal, "yyyy-MM-dd HH:mm:ss"));
String digest = getDigest(_params + 你的appkey + timestamp);
String companyCode = "你的company code";
Map map = new LinkedHashMap();
map.put("params", _params);
map.put("digest", digest);
map.put("timestamp", String.valueOf(timestamp));
map.put("companyCode", companyCode);
String response = HttpClientUtils.post(NEW_ORDER_URL, map);
System.out.println(response);
}
如無(wú)意外,應(yīng)該會(huì)收到成功的響應(yīng)數(shù)據(jù)逆害,然后你就可以一次性地把你需要的接口都測(cè)試一遍头镊,只需要修改一下傳入的參數(shù),看到一片綠還是挺爽的魄幕。測(cè)試完相艇,再慢慢逐個(gè)完善業(yè)務(wù)邏輯吧。