微信下单签名错误
不得不说微信坑确实多
如果有来生希望不要在使用微信接口 太痛苦了铁子
在sign生成签名拼接字符串的时候 排序必须正确。
注意是在生成sign签名的时候,不是在生成xml的时候 我当时就是因为在生成xml的时候排序 结果没有用。
顺序必须像这样 跟着文档走 顺序不能错
appid=xxx&body=xxx&mch_id=xxx ....
原本代码
本想是通过反射来自动生成字符串的拼接 以及sign签名算法。达到一劳永逸 但实际上是我想多了 因为字段没有办法按照微信文档排序
public static String createSign(Object o , String key)throws Exception{
var buffer = new StringBuilder();
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
if ( field.get(o) instanceof String ) {
buffer.append("&" + name + "=");
buffer.append((String) field.get(o));
}else if ( field.get(o) instanceof Number ){
buffer.append("&" + name + "=");
buffer.append((Number) field.get(o));
}else {
continue;
}
}
buffer.append("&key=" + key);
var s = buffer.toString();
var = s.replaceFirst("&", "");
var md5 = DigestUtils.md5DigestAsHex(str.getBytes()).toUpperCase();
return md5;
}
修改过后代码
没错只能写死 因为居然是因为排序问题 必须跟着文档的排序走
public static String createSgin(Order pay) throws NoSuchAlgorithmException {
String sign = "appid="+pay.getAppid()+
"&body="+pay.getBody()+
"&mch_id="+pay.getMch_id()+
"&nonce_str="+pay.getNonce_str()+
"¬ify_url="+pay.getNotify_url()+
"&openid="+pay.getOpenid()+
"&out_trade_no="+pay.getOut_trade_no()+
"&spbill_create_ip="+pay.getSpbill_create_ip()+
"&total_fee="+pay.getTotal_fee()+
"&trade_type="+pay.getTrade_type();
sign += "&key=Yq1qaz2wsx3edc4rfv5tgb6yHJJ123";
//签名加密
String md5 = DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase();
return md5;
}