收藏
回答

node接入v3微信支付接口报错:SIGN_ERROR,已反复核对文档

wxOrder(params, userAgent) {
    return new Promise(async resolve => {
      const buildMessage = (method, url, timestamp, nonceStr, body) => { // 生成签名字符串
        return `${method}\n
          ${url}\n
          ${timestamp}\n
          ${nonceStr}\n
          ${body}\n`
      }
      const sign = message => { // 签名
        const hash = crypto.createHmac('sha256', private_key)
          .update(message, 'utf8')
          .digest('hex')
        return new Buffer(hash).toString('base64')
      }
      const payParams = {
        appid: wxConfig.wxAppId,
        mchid: wxConfig.wxMchId,
        description: obj.description,
        out_trade_no: JSON.stringify(dayjs().valueOf()), // 订单号
        notify_url: obj.notify_url, // 微信付款后的回调地址
        amount: {
          total: 1,
        },
        payer: {
          openid: params.openid,
        },
      }
      const url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi' // 小程序统一下单接口
      const nonce_str = Math.random().toString(36).substr(215)
      const timestamp = dayjs().valueOf()
      const message = buildMessage('POST''/v3/pay/transactions/jsapi', timestamp, nonce_str, payParams)
      const signature = sign(message)
      const authorization = `WECHATPAY2-SHA256-RSA2048 mchid=${payParams.mchid},serial_no=${wxConfig.serial_no},nonce_str=${nonce_str},timestamp=${timestamp},signature=${signature}`
      console.log('authorization', authorization)
      request.post({
        url,
        body: payParams,
        json: true,
        headers: {
          Accept: '*/*',
          'Content-Type''application/json',
          'User-Agent': userAgent,
          Authorization: authorization,
        },
      }, (error, response, body) => {
        console.log('微信小程序下单接口返回数据')
        console.log('error', error)
        console.log('body', body)
        resolve(body)
      })
    })
  }

在官方提供的 微信支付API v3 Postman脚本 中签名能通过,可以正常调用支付接口

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

2 个回答

  • 老张
    老张
    2021-03-15

    谢邀。

    Authorization有问题啊。目测是少了引号。
    let authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${MCHID}",serial_no="${prv_serial_no}",nonce_str="${nonce_str}",timestamp="${timestamp}",signature="${signature}"`
    
    


    2021-03-15
    有用 1
    回复 1
    • 很奇妙
      很奇妙
      2021-03-16
      感谢老哥,没报上面那个错误了
      2021-03-16
      回复
  • Cico
    Cico
    2021-07-25

    博主你好,我跟你一样的问题,请问大佬你最后是怎么解决的?


    2021-07-25
    有用
    回复 1
    • 很奇妙
      很奇妙
      2021-07-28
      按上面老张的回复解决的
      2021-07-28
      回复
登录 后发表内容
问题标签