负责的一个项目前端是微信小程序,用到了支付功能,后端使用的是yansongda/pay(Pay)这个支付框架,起初,版本用的是v2.3,最近,业务需要做分账功能,yansongda/pay框架只有3.x版本里面才有分账插件,实在不想自己再造一个轮子,只好选择版本升级,不可避免,开始了一次踩坑之旅。
yansongda/pay 的文档写得简洁明了,遇到问题可以借助日志进行分析,追踪日志,最后会到微信支付v3相关API上面。
微信支付v3相关得API又是特别神奇,看似文档写得非常全面,但是在一些新手特别容易出问题得地方又一笔带过,集成或升级时搞得一头雾水,最后不得不面向Google编程。
遇到的问题
Prepay Response Error: Missing PrepayId(yansongda 文档FAQ中有写)
解决方案:调微信支付接口时的参数有误,一般在日志中会有明确说明是哪个参数的问题,只要正确传递即可解决。
支付成功回调中验签时,总返回false,导致代码报错
TypeError: json_decode() expects parameter 1 to be string, bool given in /www/wwwroot/plus-php/vendor/yansongda/pay/src/Functions.php:330
解决方案:
找了很多参考资料,微信开放社区(微信支付API-V3,SIGN_ERROR,验签失败,请检查签名,仍未解决,请求大大们帮助,感谢? | 微信开放社区)
最终定位为 配置参数错误导致,统一支付接口中,应该使用apiv3密钥,我配置成了API密钥,将商户密钥配置改成 apiv3密钥即可解决问题。
至此,微信支付v3 集成到了项目当中。
工具:
- 获取微信平台证书
GitHub - wechatpay-apiv3/CertificateDownloader: Java 微信支付 APIv3 平台证书的命令行下载工具
这个工具可以从 https://api.mch.weixin.qq.com/v3/certificates
接口获取商户可用证书,并使用 APIv3 密钥 和 AES_256_GCM 算法进行解密,并把解密后证书下载到指定位置。
- 通过工具测试验签
微信支付API-V3,SIGN_ERROR,验签失败,请检查签名,仍未解决,请求大大们帮助,感谢? | 微信开放社区
- API证书下载工具
总结
- 先搞懂微信支付API v3中的几种证书、密钥(按提示规则设定,避免掉坑)、以及参数的含义
- 先将第三方支付框架的文档看几遍,分析一下当前项目升级需要动哪些点?(升级前做好版本管理,升级废了可以回滚)