支付寶的文檔寫得讓人一頭霧水,初次使用者往往不知所雲。雖然在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'
]
]
]
];
在此,我們可以看一下支付寶的整個支付流程:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLigFWYhFWYhFWYhlRYRlYYhFWYZVTsd0NkFjQM9CXxk2LcB3b09CXt92Yu4GZjlGbh5yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
從圖中可以看出,用戶端向服務端擷取訂單後發起支付。是以,我們要建立訂單,并把訂單資訊傳回給用戶端。支付完成後,再異步接收支付寶的回調。
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('支付失敗!!!');
}
}
至此,整個支付流程完成。