天天看点

如何在laravel/lumen中集成支付宝支付

支付宝的文档写得让人一头雾水,初次使用者往往不知所云。虽然在github也可搜出一些封装好的库,但要么就是文档不大齐全,要么就是年代久远,接口不再适用。

重新造轮子需要一定的时间,我们采用github上的两个库来完成支付宝的支付。

1.安装ignited/laravel-omnipay

composer require ignited/laravel-omnipay
           

这时如果有报event-dispatcher的错误,可尝试安装一下

composer require symfony/event-dispatcher:^
           

再执行上面的命令

2.安装lokielse/omnipay-alipay

composer require lokielse/omnipay-alipay
           

3.1 laravel的使用

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

添加门面:

发布配置文件:

php artisan vendor:publish
           

3.2 lumen的使用

在bootstrap/app.php中注册服务提供者:

找到lumen-framework中的Application.php添加门面

class_alias('Ignited\LaravelOmnipay\Facades\OmnipayFacade','Omnipay');
           

拷贝vendor下面的ignited/laravel-omnipay/src/config中的config.php到config目录下,重命名为laravel-omnipay.php

在bootstrap/app.php中添加

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

4.在laravel-omnipay.php配置文件中添加alipay

<?php

return [

    // The default gateway to use
    'default' => 'alipay',

    // Add in each gateway here
    'gateways' => [
        'paypal' => [
            'driver'  => 'PayPal_Express',
            'options' => [
                'solutionType'   => '',
                'landingPage'    => '',
                'headerImageUrl' => ''
            ]
        ],
        'alipay' => [
            'driver' => 'Alipay_AopApp',
            'options' => [
                'appId' => 'your appId',
                'alipayPublicKey' => 'your public key',
                'notifyUrl' => 'your notify url'
            ]
        ]
    ]

];
           

在此,我们可以看一下支付宝的整个支付流程:

如何在laravel/lumen中集成支付宝支付

从图中可以看出,客户端向服务端获取订单后发起支付。因此,我们要创建订单,并把订单信息返回给客户端。支付完成后,再异步接收支付宝的回调。

5.创建订单

$gateway = Omnipay::gateway();
    $gateway->setPrivateKey('your private key'); //这里注意区分是安卓还是ios,两者的key不一样
    $request = $gateway->purchase();
    $request->setBizContent([
        'subject'      => 'test',
        'out_trade_no' => date('YmdHis') . mt_rand(, ),
        'total_amount' => '0.01',
        'product_code' => 'QUICK_MSECURITY_PAY',
    ]);
    $response = $request->send();
    return $response->getOrderString();
           

6.异步通知处理

public function result(Request $request){
    $gateway = Omnipay::gateway();

    $req = $gateway->completePurchase();
    $req->setParams($request->all());

    try{
        $response = $request->send();
        if($response->isPaid()) {
            Log::info('支付成功');
        } else{
            Log::info('支付失败!!');
        }
    }catch (Exception $e){
        Log::info('支付失败!!!');
    }
}
           

至此,整个支付流程完成。