用了3天左右对接落实圆通快递电子面单,这过程遇到觉得坑的就是签名,用了将近一个下午。
接口地址:.cn/OpenPlatform/doc
电子面单创建标准接口:
签名流程:
1.1.3 数据处理
主要是每次自己签名跟上面的老是对上不,他又不给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 .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;
}