Laravel 支付解决方案之如何使用支付宝进行支付


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中添加如下依赖:

  1. "ignited/laravel-omnipay": "2.*",
  2. "lokielse/omnipay-alipay": "dev-master"

运行composer update安装这些依赖。

安装完成后在config/app.php中注册服务提供者:

  1. Ignited\LaravelOmnipay\LaravelOmnipayServiceProvider::class

同时添加OmniPay门面到门面数组:

  1. 'Omnipay' => Ignited\LaravelOmnipay\Facades\OmnipayFacade::class

最后,通过php artisan vendor:publish发布配置文件。

此外OmniPay for Laravel 5 & Lumen还支持Lumen。在bootstrap/app.php中注册服务提供者:

  1. $app->register(Ignited\LaravelOmnipay\LumenOmnipayServiceProvider::class);

laravel-omnipay.php文件复制到config/laravel-omnipay.php,然后在bootstrap/app.php中添加如下代码:

  1. $app->configure('laravel-omnipay');

创建支付宝应用

使用支付宝SDK进行支付的前提是先要去支付宝开放平台(open.alipay.com)入驻成为开发者并创建网站/移动应用,等待审核通过。

然后在个人中心获取应用的APPID和PID:

支付宝开放平台获取APPID

支付宝开放平台获取PID

然后在项目中编辑配置文件config/laravel-omnipay.php

  1. <?php
  2.  
  3. return [
  4.  
  5. // 默认支付网关
  6. 'default' => 'alipay',
  7.  
  8. // 各个支付网关配置
  9. 'gateways' => [
  10. 'paypal' => [
  11. 'driver' => 'PayPal_Express',
  12. 'options' => [
  13. 'solutionType' => '',
  14. 'landingPage' => '',
  15. 'headerImageUrl' => ''
  16. ]
  17. ],
  18.  
  19. 'alipay' => [
  20. 'driver' => 'Alipay_Express',
  21. 'options' => [
  22. 'partner' => 'your pid here',
  23. 'key' => 'your appid here',
  24. 'sellerEmail' =>'your alipay account here',
  25. 'returnUrl' => 'your returnUrl here',
  26. 'notifyUrl' => 'your notifyUrl here'
  27. ]
  28. ]
  29. ]
  30.  
  31. ];

基本使用

1)定义相关路由

  1. //支付宝支付处理
  2. Route::get('alipay/pay','AlipayController@pay');
  3. //支付后跳转页面
  4. Route::post('alipay/return','AlipayController@result');

2)支付

支付宝SDK支持如下接口:

  • Alipay_Express 支付宝即时到账接口
  • Alipay_Secured 支付宝担保交易接口
  • Alipay_Dual 支付宝双功能交易接口
  • Alipay_WapExpress 支付宝WAP客户端接口
  • Alipay_MobileExpress 支付宝无线支付接口
  • Alipay_Bank 支付宝网银快捷接口

这里我们使用支付宝即时到账接口(目前即时到账接口需要商户签约才能使用,个人账户不能使用)。

新建控制器AlipayController,定义其pay方法如下:

  1. public function pay(){
  2.  
  3. $gateway = Omnipay::gateway();
  4.  
  5. $options = [
  6. 'out_trade_no' => date('YmdHis') . mt_rand(1000,9999),
  7. 'subject' => 'Alipay Test',
  8. 'total_fee' => '0.01',
  9. ];
  10.  
  11. $response = $gateway->purchase($options)->send();
  12. $response->redirect();
  13. }

3)回调

接下来我们定义支付后跳转页面对应的result方法:

  1. public function result(){
  2.  
  3. $gateway = Omnipay::gateway();
  4.  
  5. $options = [
  6. 'request_params'=> $_REQUEST,
  7. ];
  8.  
  9. $response = $gateway->completePurchase($options)->send();
  10.  
  11. if ($response->isSuccessful() && $response->isTradeStatusOk()) {
  12. //支付成功后操作
  13. exit('支付成功');
  14. } else {
  15. //支付失败通知.
  16. exit('支付失败');
  17. }
  18.  
  19. }

此外,由于该回调请求来自第三方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上说的很清楚明白,这里就不在赘述了。