微信JSAPI支付踩坑总结

1. 不同的支付场景

https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml
在这里插入图片描述
我们做的是在公众号内嵌网页内,调用微信支付。所以选择的是JSAPI

2. signType 不一致的问题

在一开始查询资料的时候,产品发的文档里面signType是md5。但是我从官网看见的signType是RSA。 这是因为的微信的2个版本:v2和v3

https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay-1.shtml
在这里插入图片描述
v2 支持HMAC-SHA256和MD5, 下面的v2 JSAPI的文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

v3 支持RSA, 下面的v3 JSAPI的文档
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml

我们因为之前做过app微信支付,为了接口兼容,所以JSAPI使用的也是v2版本

3. Angular调用WeixinJSBridge

Angular调用WeixinJSBridge,提示找不到名称,编译通不过?
https://developers.weixin.qq.com/community/develop/doc/000e062d098200b9d549cad3d51c00
在这里插入图片描述

4. 支付场景非法

在这里插入图片描述
由于一开始做的只是app的微信支付,所以需要增加支持JSAPI的交易type (trade_type

https://blog.csdn.net/SEA_mihu/article/details/107684206
在这里插入图片描述

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2
在这里插入图片描述

5. 多微信号的处理

由于一开始app调用微信支付的时候,用来收款的一个微信公众号
现在又是一个新的微信号。处理办法是把2个微信号都弄到一个 微信支付商户号上面

6. 支付验证签名失败

6.1 常规解决

微信官方有一个支付验证签名失败的帖子:https://developers.weixin.qq.com/community/develop/doc/000cc4ffa2c2083e565b4dabe5fc09

支付验证签名失败,大部分人的问题一般是 前后签名不一致,参数大小写问题等等。但是我们这边统一都是md5,参数是我从文档直接复制的,书写肯定没有 什么问题。

还有的人,需要重置key,因为我们这边重置的话,可能导致app的支付出现问题,所以对于这个没有轻易尝试。

6.2 二次签名

后来又查了很多资料。 发现很多人在说 二次签名 ,因为我这边是后台直接返回了sign { "package": "Sign=WXPay", "appid": "wx666", "sign": "7E9360EE36", "partnerid": "1116401", "prepayid": "wx66000", "noncestr": "345332", "timestamp": "1625620895" }我当时的做法是拿着后台返回的这些参数 格式化后直接去调用微信支付
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
在这里插入图片描述

所以没有太在意二次签名这个问题。但是一直提示签名失败,后来发现了这3篇文章里面说的 https://www.cnblogs.com/6324/p/10281798.html
在这里插入图片描述
https://developers.weixin.qq.com/community/develop/article/doc/00088264e006f0cc423c1732d5b413
在这里插入图片描述
https://developers.weixin.qq.com/community/develop/doc/000ca273cf0ef8348f6c868c55b800?highLine=%25E6%2594%25AF%25E4%25BB%2598%25E9%25AA%258C%25E8%25AF%2581%25E7%25AD%25BE%25E5%2590%258D%25E5%25A4%25B1%25E8%25B4%25A5
在这里插入图片描述

联想之前和后台沟通的,然后才明白过来。这个sign 是 需要把appId , timeStamp, nonceStr,package, signType 5个参数拼接key 以后 再使用md5加密的。 而之前接口返回的sign因为是专供app调用微信支付使用的,所以sign的加密方式和JSAPI不不一样。所以一直验证失败
在这里插入图片描述

6.3 沙雕文档

回过头来看,v2 JSAPI支付文档 里面的确写了,对5个参数进行加密,而且标注了注意大小写
在这里插入图片描述
但是在从该文档跳转过去的签名算法那里, https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 签名算法demo里面都是一些别的参数,而且appid还小写。
在这里插入图片描述
且在签名验证工具那里,https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1 appid还是小写
在这里插入图片描述
从签名算法的文档和验证签名工具这里,基本上和 JSAPI调起支付那句" 参数需要重新进行签名计算" 对应不起来。

6.4 调试小技巧

① 使用签名验证工具(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1) 快速生成sign

② 新建一个index.html 把JSAPI的demo code copy进去。
同时需要把 ① 里面的参数和 从 ① 得到的sign 在这里进行替换。

③ 直接上线index.html 进行测试即可

④ 测试支付的时候,可以让后台把产品后台设置为0.01 元。方便测试,毕竟这也是“公费”支付嘛

7. 0元支付问题

1、 微信支付的单位是分,最小金额是0.01元
图片来源
在这里插入图片描述
2. 不过因为公司业务的问题,我们会有0元商品。微信支付是不支持这样的,所以需要根据金额判断是否应该调用微信支付。

有人在社区提出了这种问题,微信支付 | 0元支付的问题。 但是想想也合理,不付钱调用支付让人家输密码干嘛。又不是逛商场,只逛逛和试,不买。

猜你喜欢

转载自blog.csdn.net/weixin_44050791/article/details/123101516