小程序支付时返回签名失败,但测试环境正常,怎么办?

Mr-紫晨 阅读 41

我正在开发小程序的订单支付功能,用微信JSAPI支付时,线上环境一直报错“签名失败”,但同样的代码在沙箱环境能成功。我检查了nonceStr、timestamp这些参数,都跟后端返回的一致。

这是前端调支付的代码片段:


<template>
  <button @click="payOrder">去支付</button>
</template>

<script>
export default {
  methods: {
    async payOrder() {
      const res = await this.$api.getPayParams(); // 后端返回prepay_id等参数
      wx.requestPayment({
        timeStamp: res.timeStamp, // 13位毫秒时间戳
        nonceStr: res.nonceStr,
        package: <code>prepay_id=${res.prepayId}</code>,
        signType: 'MD5',
        paySign: res.paySign, // 前端重新计算的签名和后端返回的不一致?
        success() {},
        fail(err) {
          console.log(err); // {"errMsg":"requestPayment:fail 签名失败"}
        }
      })
    }
  }
}
</script>

已经尝试过把timestamp改成10位秒时间戳、调整参数排序重新生成sign,但线上环境还是失败。测试环境用的沙箱密钥没问题,生产环境的商户密钥有没有特殊要求?

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
夏侯艳玲
生产环境的商户密钥和沙箱环境不一样,你得确认后端用的是正式环境的商户密钥,不是沙箱密钥。还有,timeStamp必须是10位秒级时间戳,不是13位毫秒级的,改一下试试。前端别自己拼签名,直接用后端返回的paySign

如果还是不行,把参数打印出来,仔细核对大小写和空格,微信那边对这些特别敏感,差不多就行的日子早就过去了。
点赞 2
2026-02-15 07:02