微信公众号支付
前端调用微信支付内置js后,提示支付验证签名失败
{"err_desc":"支付验证签名失败","err_msg":"get_brand_wcpay_request:fail","err_code":"-1"}
我犯错时是因为 漏掉了第二次签名(一直用使用wxPay.unifiedOrder(data)返回的签名)
基本步骤:
步骤一:URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder 统一下单的请求参数
步骤二:(微信API已封装)
1. 将请求参数,按MD5方式,进行签名sign(第一次)
2. 然后把 统一订单的请求参数和签名 ,WXPay > processResponseXml(String xmlStr) > isResponseSignatureValid(respData) > generateSignature(data,key,signType).equals(sign) 再次签名,验证签名是否有效
3. 然后 验证签名是否有效 ,返回如下参数(返回的参数中也有签名,貌似与第一次sign不一样)。
只取预支付prepay_id 只取预支付prepay_id 只取预支付prepay_id !!!
步骤三:执行JS调起支付
重点来了!!! 第二次签名 (参数需要重新进行签名计算,参与签名的参数为:appId、timeStamp、nonceStr、package、signType,参数区分大小写。)然后把以下数据,返回给前端调用getBrandWCPayRequest方法。
try {
Map<String, String> resp = wxPay.unifiedOrder(data);
//再次签名
Map<String, String> map = new HashMap<>();
/** 添加时间戳 */
map.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
map.put("package", "prepay_id=" + resp.get("prepay_id"));
map.put("appId", APP_ID);
map.put("nonceStr", resp.get("nonce_str"));
map.put("signType", "MD5");
String sign = WXPayUtil.generateSignature(map, KEY, WXPayConstants.SignType.MD5);
map.put("sign", sign);
return map;
} catch (Exception e) {
e.printStackTrace();
}
步骤四:微信支付异步回调(未完待续)