通过前两节的介绍,我想大家对Laravel Cashier已经有了一个大致的了解,Laravel Cashier实际上使用Stripe提供的API接口进行支付,且应用场景多是使用信用卡进行分期支付,比如订阅会员服务,每月支付一定费用享受会员特殊服务,还有云服务,比如我们购买阿里云和Linode的VPS,每月要支付一定费用,但是这种信用卡支付感觉国外更流行,估计老外都没有存钱的习惯~,国内的话我们看到更多的是支付宝、银联支付、微信支付等,在1024这个特殊的日子里,学院君准备开讲这一系列。
首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,这里我们介绍其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Laravel AliPay。
在开始之前,我们先来了解下OmniPay这个GitHub项目。
OmniPay是一个独立于框架的、对多种网关支付处理提供支持的PHP库。其介绍网站是http://omnipay.thephpleague.com/,GitHub项目地址是https://github.com/thephpleague/omnipay。目前支持的支付网关包括支付宝、银联支付、Stripe、PayPal等,更多支付网关可查看其GitHub项目了解。
顾名思义,OmniPay for Laravel 5 & Lumen 是基于Laravel 5,通过一个服务提供者集成PHP OmniPay库,从而轻松实现对多种支付网关的支持。这里我们配置支付方式为支付宝。
在composer.json
中添加如下依赖:
"ignited/laravel-omnipay": "2.*", "lokielse/omnipay-alipay": "dev-master"
运行composer update
安装这些依赖。
安装完成后在config/app.php
中注册服务提供者:
Ignited\LaravelOmnipay\LaravelOmnipayServiceProvider::class
同时添加OmniPay
门面到门面数组:
'Omnipay' => Ignited\LaravelOmnipay\Facades\OmnipayFacade::class
最后,通过php artisan vendor:publish
发布配置文件。
此外OmniPay for Laravel 5 & Lumen还支持Lumen。在bootstrap/app.php
中注册服务提供者:
$app->register(Ignited\LaravelOmnipay\LumenOmnipayServiceProvider::class);
将laravel-omnipay.php
文件复制到config/laravel-omnipay.php
,然后在bootstrap/app.php
中添加如下代码:
$app->configure('laravel-omnipay');
使用支付宝SDK进行支付的前提是先要去支付宝开放平台(open.alipay.com)入驻成为开发者并创建网站/移动应用,等待审核通过。
然后在个人中心获取应用的APPID和PID:
然后在项目中编辑配置文件config/laravel-omnipay.php
:
<?php return [ // 默认支付网关 'default' => 'alipay', // 各个支付网关配置 'gateways' => [ 'paypal' => [ 'driver' => 'PayPal_Express', 'options' => [ 'solutionType' => '', 'landingPage' => '', 'headerImageUrl' => '' ] ], 'alipay' => [ 'driver' => 'Alipay_Express', 'options' => [ 'partner' => 'your pid here', 'key' => 'your appid here', 'sellerEmail' =>'your alipay account here', 'returnUrl' => 'your returnUrl here', 'notifyUrl' => 'your notifyUrl here' ] ] ] ];
1)定义相关路由
//支付宝支付处理 Route::get('alipay/pay','AlipayController@pay'); //支付后跳转页面 Route::post('alipay/return','AlipayController@result');
2)支付
支付宝SDK支持如下接口:
这里我们使用支付宝即时到账接口(目前即时到账接口需要商户签约才能使用,个人账户不能使用)。
新建控制器AlipayController
,定义其pay
方法如下:
public function pay(){ $gateway = Omnipay::gateway(); $options = [ 'out_trade_no' => date('YmdHis') . mt_rand(1000,9999), 'subject' => 'Alipay Test', 'total_fee' => '0.01', ]; $response = $gateway->purchase($options)->send(); $response->redirect(); }
3)回调
接下来我们定义支付后跳转页面对应的result
方法:
public function result(){ $gateway = Omnipay::gateway(); $options = [ 'request_params'=> $_REQUEST, ]; $response = $gateway->completePurchase($options)->send(); if ($response->isSuccessful() && $response->isTradeStatusOk()) { //支付成功后操作 exit('支付成功'); } else { //支付失败通知. exit('支付失败'); } }
此外,由于该回调请求来自第三方API,无法通过CSRF验证,所以需要在CSRF验证中排除该URL,否则会抛出TokenMismatchException异常,具体排除方法可参考CSRF攻击原理及其防护这篇教程,这里我们要排除的URL是alipay/return
。
以上是OmniPay for Laravel 5 & Lumen这个包的使用简介,接下来我们来看另外一个封装支付宝SDK的Laravel包 —— AliPay。其GitHub项目地址是:https://github.com/Latrell/Alipay。该项目是中文版,使用说明GitHub上说的很清楚明白,这里就不在赘述了。