App调用微信支付使用uni-app的uni.requestPayment这个api sign可以任意填写<32位数的字符串 正确的32位签名却显示验签失败
App调用微信支付使用uni-app的uni.requestPayment这个api sign可以任意填写<32位数的字符串 正确的32位签名却显示验签失败
测试过的手机
Vivo se和 IPhone 15 pro
示例代码:
let orderInfo = {
appid: res.appId,
noncestr: res.nonceStr,
package: res.package,
partnerid: res.partnerId,
prepayid: res.prepayId,
timestamp: res.timestamp,
sign: res.sign.slice(0,31)
}
console.warn('查看orderInfo',orderInfo)
uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo,
success: res1 => {},
fail: res1 => {},
})
操作步骤:
- 使用后端正常二次加密的32位长度的sign调用uni.requestPayment接口
预期结果:
- 能正常拉起微信支付
实际结果:
- 报错:支付验证签名失败
bug描述:
App调用微信支付,使用uni.requestPayment这个api,sign可以任意填写<32位数的字符串,正确的32位签名却显示验签失败,sign可以填写任意的字符,只要不超过31位数即可掉起微信支付,并且sign不能为空,sign的意义不知道是啥
| 信息类别 | 信息内容 |
|------------------|------------------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC开发环境版本 | Window 10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 3.99 |
| 手机系统 | 全部 |
| 手机厂商 | 华为 |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |
| App下载地址 | [https://ios.u-area.com/m/pages/Common/AppDownload](https://ios.u-area.com/m/pages/Common/AppDownload) |
更多关于App调用微信支付使用uni-app的uni.requestPayment这个api sign可以任意填写<32位数的字符串 正确的32位签名却显示验签失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html
微信支付的规范sign就是32位的,api自身不会校验sign的长度,会将数据提交给微信支付SDK处理的。
如果显示眼前失败,说明生成的订单不正确。请查看微信支付的后台文档:统一下单。推荐使用 uni-pay管理后台订单。
更多关于App调用微信支付使用uni-app的uni.requestPayment这个api sign可以任意填写<32位数的字符串 正确的32位签名却显示验签失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可是实测32位长度的sign,会显示验签失败,反而截取一下之后才能成功,并且也找到几篇帖子,看到也遇到了这种情况,例如这篇文章:https://www.pimspeak.com/uni-app-using-wechat-app-pay.html
并且使用微信的验签工具,查看了一下,和我们生成的签名是一致的,说明我们的签名是没有问题的
回复 拂晓2024: 你的sign字段数据从哪里生成的?这个数据应该是微信的统一下单接口返回的哈。
从你描述的情况来看,这是一个典型的微信支付签名验证问题。以下是关键点分析:
- 签名机制问题:
- 微信支付要求严格的32位MD5签名,但你的测试表明系统没有正确验证签名有效性
- 任意31位字符串能通过验证,说明签名校验逻辑存在缺陷
- 可能原因:
- 微信SDK版本兼容性问题
- uni-app封装层对签名的处理可能存在bug
- 参数传递过程中签名被截断或修改
- 建议解决方案:
- 确保使用最新版uni-app和微信SDK
- 检查签名生成算法是否符合微信官方要求
- 完整传递32位签名,不要手动截断
- 临时解决方案: 可以尝试在传递签名前进行完整验证:
if(res.sign.length !== 32) {
console.error('签名长度不正确');
return;
}