支付是很多网站必不可少的一个功能,用得最多的支付平台就是支付宝和微信,在 laravel学院
中推荐使用omnipay
中的omnipay-alipay
插件来进行支付,上个月我已经将项目中的支付宝扫码支付和微信的扫码支付和 js 支付彻底做完了,学习到了很多。在laravel学院
中的支付宝支付篇的留言中发现了很多遇到的一些问题,这些问题我也遇到过,可能有一部分人就放弃了使用这个插件转原生 sdk 开发去了。总结了一下,基本上这些留言遇到的问题基本有一条, does not have a method 'gateway'
,没有这个 gateway,其实这个问题很好解决,你点开这个项目的 github 地址打开文档就会发现,官方文档已经没用 gateway 这个方法了,而是使用 create。其他如果找 laravel学院
的还没做好的话,你可以看一下你的vender
里面有没有一个叫omnipay
的文件和一个叫lokielse
的文件夹,没有的话说明你的composer
还没跑成功继续跑吧。
我对于这个插件的理解是omnipay
相当于一个平台,omnipay-laravel
是基于这个平台做的一个插件,还有下一篇要讲的微信支付也是,这个平台要求插件将所有复杂的处理不用通过程序员来处理,程序员只需要将参数填入配置文件再做下单和回调操作即可完成,各种插件的数据验证要求使用ominpay
的验证要求,所以我们会看到不管是微信还是支付宝,下单和回调的各种获取配置和验证的代码几乎一样。比如下单的create
方法获取网管配置和其他操作,比如回调中的数据验证是否通过 $response->isSuccessful() && $response->isTradeStatusOk()
,都是一样的。我们只用处理最重要的业务逻辑即可。
不管是原生 sdk 还是插件还是各种平台,基本上步骤分为两步,第一步就是下订单,传配置,第二步就是回调。使用omnipay-alipay
完成支付很简单,看 laravel学院
的介绍即可。下面说说与插件无关的,下单方法中我们需要做什么操作,回调中我们需要怎么处理自己的业务逻辑。支付一般有两张表,一张表给用户看,一张表对账用,下单成功后我们需要在用户的充值记录表中填充一条状态为未支付的数据,异步回调成功后需要在对账表中添加一条数据,添加成功后再将用户的充值记录中的那条记录的支付状态改为已支付成功。
支付宝中的回调有两种方式,一种是同步回调,一种是异步回调,同步回调支付宝会向你的服务器发起 get 请求,异步回调支付宝会向你的服务器发起 post 请求,同步回调不确保会成功,异步回调保证百分之九十九点九的成功率,经测试可以同时使用两种回调。我的同步回调地址直接是返回一个用户支付完成后的页面,没有任何数据操作。
支付宝做得很好,直接在手机端中的浏览器打开,支付宝会自动调起你的支付宝 app 进行支付,没有 app,则会调到支付宝页面的支付宝登录页面进行支付,若是调起手机 app 支付支付成功后,并不会自动跳转到你的项目中,而是还会停留在支付宝 app 中,退出 app 会返回到你的项目当中,若要完成调起 app 支付完成后自动跳转则需要另外一个网关,手机网站支付,流程还是一样,但是会多了许多步骤各种验证,所以也没太大必要做这个手机网站支付,手机网站支付仅仅比 pc 的多一个跳转而已,也能支付。使用 omnipay-alipay
支付相对比微信扫码支付模式二,简直简单得不要不要的了。
(这个插件于现在来说,应该不是最佳实践了。——2020.8.20)
网友评论