天天看點

如何在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('支付失敗!!!');
    }
}
           

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