小程序支付时返回签名失败,但测试环境正常,怎么办?
我正在开发小程序的订单支付功能,用微信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,但线上环境还是失败。测试环境用的沙箱密钥没问题,生产环境的商户密钥有没有特殊要求?
timeStamp必须是10位秒级时间戳,不是13位毫秒级的,改一下试试。前端别自己拼签名,直接用后端返回的paySign。如果还是不行,把参数打印出来,仔细核对大小写和空格,微信那边对这些特别敏感,差不多就行的日子早就过去了。