记一次微信h5支付前端的bug: 商户传入的appid 参数不正确,请联系商户处理

源于一次分公众号支付的需求:

项目默认有一个appidA用来强制授权作为用户身份的,如果url上存在另一个appidB,则用appidB再次去静默授权获取用户openid,这个openid是用来区分用户在哪一个公众号支付的

需求做好之后,去测试,发现支付的时候(就是前端调用微信jssdk支付api)微信报错:商户传入的appid 参数不正确,请联系商户处理

去官网查找说可能两个原因导致的:
1、统一下单接口中上传的appid与调起微信客户端进行支付的appid不一致
2、调起微信客户端进行支付的必要参数prepayid有误或者prepayid已经过期(有效期2小时)

首先经过前后端排查,排除了第二个原因,因为下发预订单之后接着支付,肯定没有过期,而且后端查日志prepayid也是正确的木有问题
第一个原因先排查了前半部分 "统一下单接口中上传的appid" 后端查日志确认没问题,然后下一句 "与调起微信客户端进行支付的appid不一致", 我先想到的是前端调用微信支付的sdk:wx.chooseWXPay 但是传给微信的参数里面并没有用到appid呀,并且后端生成预订单也成功了,说明前端wx.chooseWXPay里面传给微信的参数也是没问题的
最后检查到一个地方,之前没有想到 是因为这个地方如果有错后面的支付就不会执行了,结果真是这个原因, 什么原因呢,我们知道调用微信jssdk是需要后端生成一些校验的参数的,前端通过config接口注入权限验证配置,这个地方前端需要传入appid和这些参数,没错,就是这个appid的问题,我是用的是appidA,应该使用appidB,即统一下单接口中上传的appid与调起微信客户端进行支付的appid不一致,这个微信客户端进行支付的appid指的不是调用前端调用微信支付sdk的appid,指的是前端初始化微信jssdk的appid!!

--------------------------分割线-------------------------------------
结论: 上面写的可能只有本人能看懂----- 所以总结一下遇到这个报错的排查方案吧:
1.前端检查初始化微信jssdk的appid是否对应,以及是否可以正常初始化微信jssdk
2.前端检查调用微信支付sdk传参是否正确
3.后端检查下单接口中上传的appid是否对应
4.后端检查prepayid是否有误或者prepayid是否已经过期
5.后面发现的一个bug,前端传入的数据类型一定要和微信文档上说的对应起来,否则会调用jssdk会报错

--------------------------分割线-------------------------------------
一般h5支付流程:
1.调用后端接口“发起预订单”,接口返回当前支付的appid,还有客户端微信支付所需的签名等信息
2.调用后端接口获取前端jssdk验签参数,init sdk传入appid的为1返回的appid
3.客户端调用微信支付api,传入1返回的签名等信息
4.客户端在支付成功回调中调用后端接口“查询订单”,获取最终支付结果

posted @ 2021-12-16 19:18  zoo-x  阅读(2305)  评论(0编辑  收藏  举报