先推荐一个 官方验证签名是不是一样
https://pay.weixin.qq.com/wiki/tools/signverify/
我的验证就是不一样,肯定是我这边后台出问题了。
然后我发现 我错误的地方很傻逼。
我这边获取到了 perpay_id 然后 返回给前端的时候 还要再生成一次 paysign
结果 我还是 把之前 生成的 paysign的 map 放进去 ,后来发现 要 把返回给前端的 也就是带 prepay_id的map 去生成一次新的paysign
这是第一个错误的地方 然后发现怎么还是不一样 ,结果发现 后面生成 paysign的 key 是固定的
这是我之前错误的 map:
Map<String, String> result2 = new HashMap<>(8);
result2.put("app_id", appId);
result2.put("time_stamp", result.get("timeStamp"));
result2.put("nonce_str", result.get("nonceStr"));
result2.put("sign_type", "MD5");
result2.put("package", "prepay_id=" + prepayId);
这是我之后正确的map(注意map 的key 从下划线变成了驼峰):
Map<String, String> result = new HashMap<>(8);
result.put("appId", appId);
result.put("timeStamp", WXPayUtil.getCurrentTimestamp() + "");
result.put("nonceStr", WXPayUtil.generateNonceStr());
result.put("signType", "MD5");
result.put("package", "prepay_id=" + prepayId);
这下 代码生成的签名和 官方网站生成的签名一摸一样了。
另外 如果 你发现你官网的签名和代码的签名一样 那么 恭喜你很可能是另外一个坑了;
可能坑1:1发送的sign_type 不对,看网上说 官网的sdk 是默认HMACSHA256,而 api 说的是默认 MD5
2有人用iphone 测 发现 bug 是支付目录无权限,而安卓是支付签名验证失败,这一点要去 微信那改。