问题
相同的字符串,本地和服务器加密结果不一样,导致请求第三方接口时,签名验证失败
找到原因:
本地开发,IDEA设置的UTF-8
然而服务器的编码是gbk
解决方法
!!记得设置编码,不同的编码加密得到的结果不一样,如果不设置,默认使用系统文件的编码
String sign = DigestUtils.md5DigestAsHex(str.getBytes(“utf-8”));
具体代码如下:
/**
* 签名算法
*
* @param bodyParams
* @return 签名字符串
*/
public String sign(Map<String, String> bodyParams) {
try {
// 待签名串
String channelName = bodyParams.get("channelName");
String companyName = bodyParams.get("companyName");
String subCompanyName = bodyParams.get("subCompanyName");
String department = bodyParams.get("department");
String userName = bodyParams.get("userName");
String userMobile = bodyParams.get("userMobile");
String userId = bodyParams.get("userId");
String orgCodeFlag = bodyParams.get("orgCodeFlag");
String appKey = config.getAppKey();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(channelName).append(companyName).append(subCompanyName).append(department).append(userName)
.append(userMobile).append(userId).append(orgCodeFlag).append(appKey);
String str = stringBuilder.toString();
log.info("需要加密的字符串: {}", str);
// md5加密
// !!记得设置编码,不同的编码加密得到的结果不一样,如果不设置,默认使用系统文件的编码
String sign = DigestUtils.md5DigestAsHex(str.getBytes("utf-8"));
log.info("MD5加密之后的签名: {}", sign);
return sign;
} catch (Exception e) {
log.info("字符串加密出错");
e.printStackTrace();
return null;
}
}