小程序支付签名失败,参数都检查过了还是报错?

Air-瑞瑞 阅读 19

用微信小程序支付时,签名一直失败返回”签名错误”。已经确认参数(appid、timestamp等)正确,也按文档排序了参数,但依然报错。签名算法用的是HMAC-SHA1,生成的sign和后端返回的一致吗?

代码示例:


const signStr = Object.keys(params).sort().map(k => <code>${k}=${params[k]}</code>).join('&');
const sign = crypto.createHmac('SHA1', '密钥').update(signStr).digest('hex');

后端返回的prepay_id存在,但wx.requestPayment执行时提示”fail sign error”。是不是时间戳或随机字符串格式有问题?或者参数排序需要排除某些字段?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
一树萱
一树萱 Lv1
微信小程序支付的签名算法要用MD5,不是HMAC-SHA1,你得改一下。还有,参数排序时要把空值的字段去掉,timestamp是秒级时间戳,确保格式对了。试试这个代码:

const filterParams = Object.keys(params).reduce((obj, key) => {
if (params[key] !== '' && params[key] != null) {
obj[key] = params[key];
}
return obj;
}, {});
const signStr = Object.keys(filterParams).sort().map(k => ${k}=${filterParams[k]}).join('&') + '&key=你的密钥';
const sign = require('crypto').createHash('md5').update(signStr).digest('hex').toUpperCase();


检查下timestamp是不是秒级的,不是的话除以1000转成秒。再不行就睡一觉明天再调吧,太累了容易出错。
点赞 1
2026-02-15 06:01