微信JSAIP支付(调起支付)paySign签名,超详情

JSAPI调起支付:(需要的参数)

问题:这么实现它?

微信支付签名值paySign计算方法

1. 完整的代码展示:

            // 需要的全部请求参数
            String prepayId = resultMap.get("prepay_id");//下单返回的prepayId
            long timestamp = System.currentTimeMillis();//时间戳
            String nonceStr = WXPayUtil.generateNonceStr();//随机字符串
            String pack = StringUtils.join("prepay_id=", prepayId);//订单详情扩展字符串
            String paySign = getSign(wxPayConfig.getAppid(), timestamp, nonceStr, pack);//签名
            logger.info("paySignpaySignpaySign="+paySign);
            JSONObject data = new JSONObject();
            data.put("appid",wxPayConfig.getAppid());//appid
            data.put("timeStamp",String.valueOf(timestamp));
            data.put("nonceStr",nonceStr);
            data.put("package",pack);
            data.put("signType","RSA");//签名方式
            data.put("paySign",paySign);
            return data;

2. 问题:签名参数是怎么实现的(是通过公共方法来实现的)

 /**
     * 作用:使用字段appId、timeStamp、nonceStr、package计算得出的签名值
     * 场景:根据微信统一下单接口返回的 prepay_id 生成调启支付所需的签名值
     * @param appId
     * @param timestamp
     * @param nonceStr
     * @param pack package
     * @return
     * @throws Exception
     */
    public String getSign(String appId, long timestamp, String nonceStr, String pack) throws Exception{
        String message = buildMessage(appId, timestamp, nonceStr, pack);
        String paySign= sign(message.getBytes("utf-8"));
        return paySign;
    }

    private String buildMessage(String appId, long timestamp, String nonceStr, String pack) {
        return appId + "\n"
                + timestamp + "\n"
                + nonceStr + "\n"
                + pack + "\n";
    }
    private String sign(byte[] message) throws Exception{
        Signature sign = Signature.getInstance("SHA256withRSA");
        //这里需要一个PrivateKey类型的参数,就是商户的私钥。
        //获取商户私钥
        PrivateKey privateKey = wxPayConfig.getPrivateKey(wxPayConfig.getPrivateKeyPath());
        sign.initSign(privateKey);
        sign.update(message);
        return Base64.getEncoder().encodeToString(sign.sign());
    }

3. 前端的写法:
 

/**
 * @description: 通过JSAPI下单API成功获取预支付交易会话标识(prepay_id)后,需要通过JSAPI调起支付API来调起微信支付收银台
 * 注1:WeixinJSBridge内置对象在其他浏览器中无效
 * 注2:此API需要将请求参数进行签名(参与签名的参数为:appId、timeStamp、nonceStr、package,参数区分大小写)
 * @param {*}
 * @return {*}
 */
function onBridgeReady (res: any)
{
  /* eslint-disable-next-line */
   WeixinJSBridge.invoke('getBrandWCPayRequest', {
    // 公众号ID,由商户传入
    'appId': res.appId,
    // 时间戳(转为String类型,兼容IOS “未传timeStamp”问题)
    'timeStamp': String(res.timeStamp),
    // 随机串
    'nonceStr': res.nonceStr,
    // 预支付交易会话标识
    'package': `prepay_id=${res.prepayId}`,
    // 微信签名方式
    'signType': res.signType,
    // 微信签名
    'paySign': res.paySign
  },
  function (result: any)
  {
    // 微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。

    // 支付成功
    if (result.err_msg === 'get_brand_wcpay_request:ok')
    {
      console.log('支付成功');
    }

    // 支付取消
    if (result.err_msg === 'get_brand_wcpay_request:cancel')
    {
      console.log('支付取消');
    }

    // 支付失败
    if (result.err_msg === 'get_brand_wcpay_request:fail')
    {
      console.log('支付失败');
    }
  });
}

/**
 * @description: 调起微信JSAPI支付
 * @param {*}
 * @return {*}
 */
function bootWechatJSAPIPay (res: any)
{
  let document: any;

  if (typeof WeixinJSBridge === 'undefined')
  {
    if (document.addEventListener)
    {
      document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    }
    else if (document.attachEvent)
    {
      document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
      document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
  }
  else
  {
    onBridgeReady(res);
  }
}

// 调起微信JSAPI支付
bootWechatJSAPIPay(orderRes);

猜你喜欢

转载自blog.csdn.net/m0_55699184/article/details/131868336