在做支付宝支付与微信支付时看到两家公司给的dom其中关于MD5加密的
支付宝的dom:
DigestUtils.md5Hex(test).toUpperCase();
微信的dom:
private static String MD5(String sourceStr) throws UnsupportedEncodingException {
String result = “”;
try {
MessageDigest md = MessageDigest.getInstance(“MD5”);
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer(“”);
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append(“0”);
buf.append(Integer.toHexString(i));
}
result = buf.toString();
} catch (NoSuchAlgorithmException e) {
// log.info(e);
}
return result;
}
测试了下,
第一张图(http://img.blog.csdn.net/20150828222552981)
这里得到的结果是相同的,但是在支付时在微信使用DigestUtils.md5Hex(test).toUpperCase();函数得到的是错误的签名。不知道怎么回事
其中微信的dom是不能使用中文的,但是测试多次得到的结果都是三者相同,郁闷
要使用中文只需要将md.update(sourceStr.getBytes());改为md.update(sourceStr.getBytes(“UTF-8”));
即可。
贴出代码:
private static String MD5TOE(String sourceStr) throws UnsupportedEncodingException {
String result = “”;
try {
MessageDigest md = MessageDigest.getInstance(“MD5”);
md.update(sourceStr.getBytes(“UTF-8”));
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer(“”);
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append(“0”);
buf.append(Integer.toHexString(i));
}
result = buf.toString();
//log.info(“MD5(” + sourceStr + “,16) = ” + buf.toString().substring(8, 24));
} catch (NoSuchAlgorithmException e) {
// log.info(e);
}
return result;
}
其中这个log.info是得到16位的MD5.
有知道在支付时在微信使用DigestUtils.md5Hex(test).toUpperCase();函数得到的是错误的签名。可以说下原因。谢谢
版权声明:本文为博主原创文章,未经博主允许不得转载。