用了3天左右对接落实圆通快递电子面单,这过程遇到觉得坑的就是签名,用了将近一个下午。
接口地址:http://open.yto.net.cn/OpenPlatform/doc
电子面单创建标准接口:
签名流程:
1.1.3 数据处理
序号 | 步骤 |
---|---|
1 | 在POST时用“logistics_interface”字段表示要发送的XML报文内容。 |
2 | 在POST时用“data_digest”字段进行签名验证。 |
3 | 假设xml内容为: <order></order>, partnerId(商家密钥)为123456。 则要签名的内容为<order></order>123456,然后对<order></order>123456先进行MD5加密,然后转换为base64字符串。 即经过md5(16位)和base64后的内容就为 LghTkEmsD2tbQ3fsIBRcBg==。 |
4 | 同样需要对签名的字符串进行URL编码,LghTkEmsD2tbQ3fsIBRcBg==的内容为:LghTkEmsD2tbQ3fsIBRcBg%3D%3D。 |
5 | 最终要发送的数据为logistics_interface=%3Corder%3E%3C%2Forder%3E &data_digest= LghTkEmsD2tbQ3fsIBRcBg%3D%3D &type=offline&clientId=K21000119 |
主要是每次自己签名跟上面的老是对上不,他又不给md5 16位的结果出来,郁闷。。。
假设xml内容为: <order></order>, partnerId(商家密钥)为123456。 则要签名的内容为<order></order>123456,然后对<order></order>123456先进行MD5加密,然后转换为base64字符串。 即经过md5(16位)和base64后的内容就为 LghTkEmsD2tbQ3fsIBRcBg==。
这个是重点,每次都是不一样的结果base64 md5换了几种方式都一样
下午快疯的时候,还是得吹下冷风
最后还是逆着来将 LghTkEmsD2tbQ3fsIBRcBg== base64网上解密是乱码,程序解也是,只能分析下解密后的byte数组,发现存在着负数的,而我们一般md5转出来的string,是默认加上256的,然后 然后就可以了
原来是 md5 16位byte数组 再base64,怎么就不写清楚点呢
另注意下 编码的问题
import java.security.MessageDigest;
import com.sun.org.apache.xml.internal.security.utils.Base64;
/**
* 签名
* 参数xml+partnerId md5加密 为16位byte
* 再base64位
* @param sourceStr
* @param key
* @return
*/
private String MD5(String sourceStr, String key) {
String result = "";
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest((sourceStr + key).getBytes(Charset.forName("utf-8")));
result = Base64.encode(bytes);
} catch (NoSuchAlgorithmException e) {
System.out.println(e);
LOG.info("圆通生成签名出错:{}", e.getMessage());
}
return result;
}