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

5 回复

微信支付的规范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字段数据从哪里生成的?这个数据应该是微信的统一下单接口返回的哈。

从你描述的情况来看,这是一个典型的微信支付签名验证问题。以下是关键点分析:

  1. 签名机制问题:
  • 微信支付要求严格的32位MD5签名,但你的测试表明系统没有正确验证签名有效性
  • 任意31位字符串能通过验证,说明签名校验逻辑存在缺陷
  1. 可能原因:
  • 微信SDK版本兼容性问题
  • uni-app封装层对签名的处理可能存在bug
  • 参数传递过程中签名被截断或修改
  1. 建议解决方案:
  • 确保使用最新版uni-app和微信SDK
  • 检查签名生成算法是否符合微信官方要求
  • 完整传递32位签名,不要手动截断
  1. 临时解决方案: 可以尝试在传递签名前进行完整验证:
if(res.sign.length !== 32) {
    console.error('签名长度不正确');
    return;
}
回到顶部