收藏
回答

wx.requestCommonPayment接口报错fail invalid signature?

signData={"amount":{"currency":"CNY","freight":100,"order_amount":1100,"product_amount":1000},"description":"测试商品001","env":"1","mchid":"1706927495","out_trade_no":"APPLETRETAILPAY250217150346HJ22"}

paySig=91479d39210c305f3b27511dbb0d4a4e7a4192ee319b0118c779cab8f7912701

signature=1444f2fab44ee78ac46654d50e6f1dc76ad6305e4b7af86d37b84ae357bf83e4

用户态签名和支付签名用的都是HmacSHA256计算

回答关注问题邀请回答
收藏

1 个回答

  • 微盟
    微盟
    星期一 16:16

    wx.requestPayment 接口报错 fail invalid signature 通常是由于支付签名(signature)不正确导致的。微信支付需要对请求参数进行签名,以确保请求的安全性。如果签名错误,支付接口会拒绝请求并返回该错误。

    以下是可能的原因和解决方案:


    1. 检查签名算法是否正确

    微信支付的签名算法是基于 HMAC-SHA256 的。你需要确保以下几点:

    • 使用正确的签名算法(HMAC-SHA256)。
    • 签名的参数顺序必须按照微信支付文档要求的顺序排列。
    • 签名字符串中不能有多余的空格或换行符。

    签名步骤如下:

    1. 将所有请求参数(除 sign 外)按参数名的字典序排序。
    2. 将排序后的参数拼接成字符串 key1=value1&key2=value2...
    3. 使用商户密钥(API key)对拼接后的字符串进行 HMAC-SHA256 加密。
    4. 将加密结果转换为大写,作为最终的签名。

    示例代码(Node.js):

    javascript

    复制

    const crypto = require('crypto');
    
    function generateSignature(params, apiKey) {
      const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&');
      const signature = crypto.createHmac('sha256', apiKey).update(sortedParams).digest('hex').toUpperCase();
      return signature;
    }
    

    2. 检查请求参数是否正确

    确保传递给 wx.requestPayment 的参数完整且正确。以下是必填参数:

    • timeStamp:时间戳(字符串类型)。
    • nonceStr:随机字符串。
    • package:统一下单接口返回的 prepay_id,格式为 prepay_id=xxx
    • signType:签名类型,固定为 HMAC-SHA256
    • paySign:签名。

    示例:

    javascript

    复制

    wx.requestPayment({
      timeStamp: '1697011200',
      nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS',
      package: 'prepay_id=wx1234567890abcdef',
      signType: 'HMAC-SHA256',
      paySign: 'C380BEC2BFD727A4B6845133519F3AD6',
      success(res) {
        console.log('支付成功', res);
      },
      fail(err) {
        console.error('支付失败', err);
      }
    });
    



    星期一 16:16
    有用
    回复
登录 后发表内容