Thinkphp微信支付开发坑

  • 介绍如何在ThinkPHP中引入微信支付,并成功记录附加信息。

    本文针对的是 微信支付V3

一、准备工作

首先得有一个已认证的服务号。还要去申请开通微信支付(当然如果只是想玩玩可以申请测试公众号)。记录各种 key 和 secret。配置好 JS SDK 的域名、授权域名(OAuth2)、支付测试目录、支付目录,如果是有第三方托管的还要对接服务器。具体自行 搜索。

二、库引入

下载官方的 DEMO ,整合到自己的项目中。我用的是 thinkphp 框架,一般把微信支付 SDK放到Vendor中。(也可以放项目根目录)。

三、微信支付发起

业务逻辑挺简单的,后台引入 SDK和配置文件。统一下单等等。这些 DEMO 里都有。不累赘了。

四、支付那些坑

有三种方式查询支付状态,1、异步通知:每次支付成功后会有通知返回,只有成功处理通知,微信才会停止发送,但不确保一定成功回调。这里的坑就是接受通知的地址一定要直接访问到。举个例子:开发过程中,我尝试把处理通知的文件放在 thinkphp 的控制器中,发现就是收不到通知,后来放到根目录,就行了。我不知道是不是一定要放在根目录,但我知道放在根目录一定可以。但如果开发过程需要带上其他参数,比如我这次的流程是先根据输入查询用户数据,接着微信支付,支付完需要加上之前查询到参数,一起发给充值平台。在一开始我一直想用 SESSION 和数据库存储充值参数,但由于支付完成后是一个异步操作,用 SESSION 会造成 SESSION 无效;用数据库存储会有很大开销或者有数据原子性的问题出现,所以就要好好研究统一下单时的那些参数,你会发现一个 attach 这个参数,先把参数发给微信,微信在支付通知返回时一起带回来,就避免上述的问题。
2、前端 JS 返回:在每次支付时或支付完成后,前端会有一个回调,来查询支付状态。但有一个问题就是,每次支付完成后,用户必须点击右上角“完成”按钮,才会回调,这样的体验很不好,这个只能作为非必须功能或者返回首页之类。
3、主动查询:用订单号无主动查询订单状态,这个应用场景不适合连贯性很强的支付操作过程。

五、总结

1、多看博文和社区的讨论;
2、每一步都要有日志,方便查 BUG
3、做好数据过滤,支付通知可能在成功处理后还是会发过来,那么就要做好忽略,避免加大开销。
4、安全方面,有表单的地方一定要做好数据过滤;防止 SQL 注入和 XSS 攻击等。
5、涉及到真金白银的程序一定要多做测试,毕竟上线后如果没支付就交易成功或者支付完又没交易;就 呵呵了。