uniapp支持微信v3支付如何实现

在uniapp中如何实现微信V3支付?官方文档提到需要配置证书和密钥,但具体步骤不太清楚。请问有没有完整的示例代码或配置流程?包括如何生成商户证书、设置APIv3密钥、以及uniapp中调用支付的详细实现方法?特别是后端接口应该如何配合?遇到报错"证书无效"该如何解决?

2 回复

在uniapp中实现微信V3支付,需先引入微信支付SDK,配置商户信息。调用uni.requestPayment接口,传入订单参数,包括appId、timeStamp、nonceStr、package、signType和paySign。确保后端生成正确的签名,前端调用支付接口即可。


UniApp 支持微信 V3 支付主要通过以下步骤实现:

  1. 后端生成支付参数
    在服务器端调用微信 V3 支付 API,生成支付所需的参数(如 prepay_id、时间戳、随机字符串等),并对参数签名。V3 接口使用 JSON 格式和 SHA256-RSA 签名。

    示例代码(Node.js 后端)

    const crypto = require('crypto');
    const axios = require('axios');
    
    async function createWxPay(order) {
      const method = 'POST';
      const url = '/v3/pay/transactions/jsapi';
      const timestamp = Math.floor(Date.now() / 1000);
      const nonceStr = crypto.randomBytes(16).toString('hex');
      const body = JSON.stringify({
        mchid: '商户号',
        appid: '小程序AppID',
        description: order.desc,
        out_trade_no: order.id,
        notify_url: 'https://yourdomain.com/notify',
        amount: { total: order.amount }
      });
    
      // 生成签名(需商户私钥)
      const signStr = `${method}\n${url}\n${timestamp}\n${nonceStr}\n${body}\n`;
      const sign = crypto.createSign('RSA-SHA256').update(signStr).sign(privateKey, 'base64');
    
      // 请求微信 API
      const resp = await axios.post(`https://api.mch.weixin.qq.com${url}`, body, {
        headers: {
          'Authorization': `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",nonce_str="${nonceStr}",signature="${sign}",timestamp="${timestamp}",serial_no="${证书序列号}"`,
          'Content-Type': 'application/json'
        }
      });
      return resp.data.prepay_id; // 返回 prepay_id
    }
    
  2. 前端调用支付
    通过 UniApp 的 uni.requestPayment 发起支付,需传入后端返回的支付参数(包括 prepay_id)。

    示例代码(UniApp 前端)

    // 从后端获取支付参数(包含 prepay_id、时间戳等)
    const payParams = await uni.request({
      url: 'https://yourbackend.com/createOrder',
      method: 'POST',
      data: { orderId: '123' }
    });
    
    // 调用支付接口
    uni.requestPayment({
      provider: 'wxpay',
      timeStamp: payParams.timestamp, // 时间戳(字符串)
      nonceStr: payParams.nonceStr,   // 随机字符串
      package: `prepay_id=${payParams.prepay_id}`, // 预支付 ID
      signType: 'RSA', // V3 固定为 RSA
      paySign: payParams.sign, // 后端计算的签名
      success: (res) => console.log('支付成功'),
      fail: (err) => console.error('支付失败', err)
    });
    
  3. 注意事项

    • 证书配置:后端需配置微信商户 API 证书(.pem 文件)。
    • 签名验证:V3 签名规则严格,需按微信要求拼接字符串。
    • 安全:敏感操作(如生成 prepay_id)需在后端完成,避免暴露密钥。

通过以上步骤,即可在 UniApp 中实现微信 V3 支付。如有更复杂需求(如分账、退款),需参考微信官方文档扩展后端逻辑。

回到顶部