Laravel 支付解决方案之如何使用支付宝进行支付
通过前两节的介绍,我想大家对Laravel Cashier已经有了一个大致的了解,Laravel Cashier实际上使用Stripe提供的API接口进行支付,且应用场景多是使用信用卡进行分期支付,比如订阅会员服务,每月支付一定费用享受会员特殊服务,还有云服务,比如我们购买阿里云和Linode的VPS,每月要支付一定费用,但是这种信用卡支付感觉国外更流行,估计老外都没有存钱的习惯~,国内的话我们看到更多的是支付宝、银联支付、微信支付等,在1024这个特殊的日子里,学院君准备开讲这一系列。
首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,这里我们介绍其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Laravel AliPay。
1、使用 OmniPay For Laravel 5 & Lumen
引言&简介
在开始之前,我们先来了解下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支持如下接口:
- Alipay_Express 支付宝即时到账接口
- Alipay_Secured 支付宝担保交易接口
- Alipay_Dual 支付宝双功能交易接口
- Alipay_WapExpress 支付宝WAP客户端接口
- Alipay_MobileExpress 支付宝无线支付接口
- Alipay_Bank 支付宝网银快捷接口
新建控制器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
。
2、使用Laravel AliPay
以上是OmniPay for Laravel 5 & Lumen这个包的使用简介,接下来我们来看另外一个封装支付宝SDK的Laravel包 —— AliPay。其GitHub项目地址是:https://github.com/Latrell/Alipay。该项目是中文版,使用说明GitHub上说的很清楚明白,这里就不在赘述了。
54 Comments
执行 composer require signited/laravel-omnipay 与现有的包冲突 提示 remove symfony/event-dispatcher v4.1.7 这个怎么处理啊兄弟们