移动端调起微信支付时如何防止参数被篡改?

司徒子晴 阅读 5

我在做H5页面集成微信JSAPI支付,后端生成prepay_id后返回给前端,但担心中间人篡改timestamp或nonceStr这些参数。试过加签但不知道前端要不要参与验签,文档看得有点晕。

目前后端返回的签名是这样生成的:

const sign = crypto.createHash('md5')
  .update(appId=${appId}&nonceStr=${nonceStr}&package=prepay_id=${prepayId}&signType=MD5&timeStamp=${timestamp}&key=${apiKey})
  .digest('hex')
  .toUpperCase();

前端直接用这个sign调WeixinJSBridge.invoke('getBrandWCPayRequest', ...),但总感觉不安全,是不是应该在前端也做点什么验证?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
公孙一然
关键点就一个:所有参数必须在后端生成并签名,前端只负责原样传参,不要在前端做任何修改。

你的做法其实没问题,问题出在理解上。微信支付的签名就是用来防篡改的,只要确保:
1. 签名参数和请求参数完全一致
2. 前端不改动任何参数

建议改成这样:
后端直接返回完整支付参数包,包括sign:

// 后端返回的完整参数
{
"appId": "wx123...",
"timeStamp": "1688888888",
"nonceStr": "5K8264...",
"package": "prepay_id=wx123...",
"signType": "MD5",
"paySign": "C380BEC2BF..."
}


前端直接用这个对象调支付,千万别手贱去改任何一个字段:

WeixinJSBridge.invoke(
'getBrandWCPayRequest',
{
appId: res.appId,
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: res.signType,
paySign: res.paySign
},
function(res){ ... }
);


重点:前端不要参与签名计算,那是后端的事。微信那边会用同样的算法验签,如果参数被改过支付就会失败。
点赞
2026-03-08 20:35