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

"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:

支付宝开放平台获取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上说的很清楚明白,这里就不在赘述了。