支付宝的文档写得让人一头雾水,初次使用者往往不知所云。虽然在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('支付失败!!!');
}
}
至此,整个支付流程完成。