微信支付-公众号支付(JSAPI)

微信公众号支付

官方文档  

前端调用微信支付内置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();
        }

步骤四:微信支付异步回调(未完待续)

猜你喜欢

转载自blog.csdn.net/qq_40625058/article/details/82556219