德邦快递接口开发-java(工具类)

2019-10-14  本文已影响0人  我想你是不知道的

德邦快递的接入,关键也是组合数据,提交并处理响应数据,流程和顺丰差不多,工具类比较简单,官方文档都有,在做之前,先把官方文档都读一遍,大概知道要找的内容在什么位置,以及了解流程。

对接规范和流程
◆传输协议
暂时只支持HTTP协议进行通信。
◆数据传输格式
所有接口暂只支持json消息格式。
◆编码格式:UTF-8
交互编码格式统一用UTF-8,避免传递中文数据出现乱码。
◆安全验证
在数据传输过程中,为避免数据被篡改,需要对数据进行加密。入参由四个参数组成:
params(请求参数),digest(密文摘要), timestamp(时间戳),companyCode(第三方接入商的公司编码,双方约定)
参数传递采用http post请求,请求消息头设置("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
在传输的参数中,既要传递原始的json字符串params,又要传输加密后的摘要digest。
设置有效的请求时间戳,当接收端收到请求端的时间差不在有效的时间戳范围内,则认为该订单无效。
德邦开放平台可以根据不同的公司设置不同的时间戳有效时长。调用方在重发消息时时间戳应重新生成,请求报文的摘要也需要重新生成。
timestamp:
13位Unix时间戳 timestamp = System.currentTimeMillis();
digest:
摘要的生成规则是 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

然后可以测试一个流程是否可行,比如【新】下单服务接口:

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\":\"详细地址\",\n" + 
        "        \"city\":\"上海市\",\n" + 
        "        \"companyName\":\"德邦\",\n" + 
        "        \"county\":\"青浦区\",\n" + 
        "        \"mobile\":\"180****2531\",\n" + 
        "        \"name\":\"AAA\",\n" + 
        "        \"province\":\"上海\",\n" + 
        "        \"town\":\"徐泾镇\"\n" + 
        "    },\n" + 
        "\n" + 
        "    \"sender\":{\n" + 
        "        \"address\":\"详细地址\",\n" + 
        "        \"city\":\"上海市\",\n" + 
        "        \"companyName\":\"德邦\",\n" + 
        "        \"county\":\"青浦区\",\n" + 
        "        \"mobile\":\"180****3451\",\n" + 
        "        \"name\":\"AAA\",\n" + 
        "        \"province\":\"上海\",\n" + 
        "        \"town\":\"徐泾镇\"\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);
}

如无意外,应该会收到成功的响应数据,然后你就可以一次性地把你需要的接口都测试一遍,只需要修改一下传入的参数,看到一片绿还是挺爽的。测试完,再慢慢逐个完善业务逻辑吧。


测试通过
上一篇 下一篇

猜你喜欢

热点阅读