移动端调起微信支付时如何防止参数被篡改?
我在做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. 签名参数和请求参数完全一致
2. 前端不改动任何参数
建议改成这样:
后端直接返回完整支付参数包,包括sign:
前端直接用这个对象调支付,千万别手贱去改任何一个字段:
重点:前端不要参与签名计算,那是后端的事。微信那边会用同样的算法验签,如果参数被改过支付就会失败。