赞
踩
有个微信小程序,新申请的商户号,新接入微信支付。自行处理小程序端和服务端(php)代码。
三年前有个小项目做过,当时也是踩了一遍这个坑,间隔久了这次又忘了,因为这个不太规律,遂记录一下。
总共遇到两个问题:
1、小程序端调起微信支付后提示调用支付JSAPI缺少参数:total_fee"
2、小程序端调起微信支付后提示签名验证失败
先说明一下,这里用的是微信支付的v2接口,v3版本接口可能并不遇到。
(因为用的easywechat扩展包,5.x仅支持v2接口,而6.x需要php8,线上环境版本不够,所以只能踩v2的坑了)
问题1,一般是少参数或某个参数要求的值的格式/类型不对。而错误提示并不对应,所以需要按照文档逐一检查即可。
不过类型不对的话,一般fail方法里能看到对应的错误提示,比如timestamp应该是字符型,如果用的是int,会提示类型不对。
我这边是因为package
参数的值格式应该是prepay_id=xxxx
,我只设置了xxxx
,漏掉了前边的prepay_id=
。
比如服务端请求预支付接口后,拿到了prepay_id=wx123456
,返回给小程序后,package参数应该是package=preay_id=wx123456
问题2,实际就是签名计算的不对,不过这里主要是文档有点不太友好。先说两点提醒:
1、服务端请求预支付接口返回的sign值,不能直接返回给小程序端来用,因为参与签名的内容不一致。
2、小程序调起支付API的开发指引里,写的appId是大写Id。
但如果你是进入到签名算法文档里看,是小写的appid。很容易按小写id处理(服务端预支付接口返回的也是appid),但又忽略了这个问题(我就栽了两次,确实顺序看下来,很容易在详细流程的阅读这里翻车)。
这里其实签名算法是以预支付接口为例的,所以流程一致,但参数内容不一致
ps:paySign建议在服务端生成,前端不存储支付key
而这里用签名校验工具是不好找到的,因为自己本身没有意识到参数名不一致
2019年第一次踩完这两个坑的时候,只是认为自己不熟悉微信支付,然后也有点马虎,连文档里写了的值格式和参数名都认不出,只觉得是自己的大意。
但时隔多年2023年又踩了一遍,感觉从正常阅读流程里很容易陷入到这个问题里来,所以感觉还是有必要记录下的。毕竟又白白花了我三四个小时排查这看似简单的失误…
同时我也注意到微信开发者社区有很多类似的问题,但都没有下文了,估计也都是解决完感觉自身原因占比较大,就没有同步结论。这里记录下,希望能够帮助到其他人~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。