1 分类说明
- 1.1 模式一
- 1.2 模式二
总结:根据官方文档配合现有网站业务,选择模式二来作为微信扫码支付方式。原因是:
流程更加简单 2. 支付二维码有效期控制在2小时 3. 支付请求更加主动
2 业务流程
- 2.1 选择充值金额
- 2.2 调用微信统一下单方法,同时网站内部产生支付订单
- 2.3 获取微信统一支付方法返回的支付链接
- 2.4 将支付链接作为内容生成支付二维码
- 2.5 支付二维码展示给用户
- 2.6 手机端用户长按二维码,微信调用支付功能
- 2.7 网站主动发起订单查询方法
- 2.8 对微信异步通知结果进行处理
3 功能实现
3.1 微信充值接口
url: http://api.xx/wxpay/recharge
method: POST
params:
u 用户有效token
quantity 充值数量
openid 用户在微信公众号下唯一识别编号
type 微信支付类型,JSAPI(公众号支付)、NATIVE(扫码支付)3.2 微信支付下单组件
Core\Unlity\WxPay\WxPayCoreAPI::unifiedorder()-
3.3 bacon-qr-code composer package 生成二维码
composer.json 添加 bacon/bacon-qr-code使用:$renderer = new \BaconQrCode\Renderer\Image\Png(); $renderer->setHeight(256); $renderer->setWidth(256); $writer = new \BaconQrCode\Writer($renderer); $writer->writeFile('Hello World!', 'qr.png');
3.4 展示支付二维码
因为需要在模板中显示,所以在生成二维码时将图片保存在服务器静态域下通过 http 或 https 访问显示支付二维码。3.5 调用支付功能(微信自身调用)
微信客户端中长按二维码微信会自动识别支付链接然后调用支付功能插件。3.6 订单查询(网站主动查询)
因为微信扫码支付未提供有效的同步通知结果,所以最后想到的办法就是手动向微信服务器查询订单处理结果,然后配合网站业务完成支付操作所有步骤。3.7 异步通知结果处理
微信异步通知是直接对服务器响应处理结果,内网无法获取。所以做好日志记录操作,然后根据响应结果和现有网站记录信息来验证订单,验证通过后内部订单状态更新并对微信响应处理结果。因为微信通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知。
4 Q&A
- 4.1 微信扫码支付方式选择
微信提供 2 种扫码支付方式,从开发时间和业务实际考虑上,选择模式二更有优点。 - 4.2 支付二维码生成
微信官方提供的 SDK 中有提供生成二维码的工具类文件,但是因为和现有框架不能很好兼容,调整时间较长所以最后解决办法是在composer中找到一个被很多人使用的包来作为生成二维码的工具。 - 4.3 下单帐号和支付帐号不一致问题
个人在开发环境中调试不存在这个问题,当多人同时验证支付功能时候就会出现,原因是在早期生成支付二维码时只生成一张图片但是被多人使用,这样就会存在下单帐号和支付帐号不一致问题并且有时候会出现本人充值的金额前后不一致问题,原因都是因为支付二维码不存在唯一性。 - 4.4 二维码在微信客户端页面显示问题
目前在微信客户端中存在微信支付二维码无法显示内容,从生成二维码方法中未检查到原因,所以这个问题在后期优化中需要继续研究。