laravel 5.5 支付宝支付
2018年9月9日1.安装支付宝支付扩展包
1 |
composer require yansongda/pay |
2.配置参数创建配置文件
1 |
touch config/pay.php |
3.编写配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php return [ 'alipay' => [ 'app_id' => '', 'ali_public_key' => '', 'private_key' => '', 'log' => [ 'file' => storage_path('logs/alipay.log'), ], ], 'wechat' => [ 'app_id' => '', 'mch_id' => '', 'key' => '', 'cert_client' => '', 'cert_key' => '', 'log' => [ 'file' => storage_path('logs/wechat_pay.log'), ], ], ]; |
4.容器注入
打开编辑app\Providers\AppServiceProvider.php,为了在任何地方都可以使用支付方法,所以容器注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public function register() { /** * 往容器里注入一个支付宝的的单例对象 */ $this->app->singleton('alipay', function () { $config = config('pay.alipay'); #获取配置文件 //$config['notify_url'] = route('payment.alipay.notify'); #支付宝服务器回调地址配置 $config['notify_url'] = 'http://requestbin.fullcontact.com/1leabnw1'; #支付宝服务器回调地址配置 $config['return_url'] = route('payment.alipay.return'); #支付宝前端回调地址配置 if (app()->environment() !== 'production') { #判断当前项目运行环境是否为线上环境 $config['mode'] = 'dev'; $config['log']['level'] = Logger::DEBUG; } else { $config['log']['level'] = Logger::WARNING; } return Pay::alipay($config); #调用 Yansongda\Pay 来创建一个支付宝支付对象 }); /** * 往容器里注入一个微信的容器 */ $this->app->singleton('wechat_pay', function () { $config = config('pay.wechat'); #获取配置文件 if (app()->environment() !== 'production') { #判断当前环境是否是上线环境 $config['log']['level'] = Logger::DEBUG; } else { $config['log']['level'] = Logger::WARNING; } // 调用 Yansongda\Pay 来创建一个微信支付对象 return Pay::wechat($config); }); } |
5.编写支付方法,前端回调方法,服务回调方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Order; use App\Exceptions\InvalidRequestException; use Carbon\Carbon; class PaymentController extends Controller { /** * 支付宝支付的方法 * @param Order $order * @param Request $request * @return mixed * @throws \Illuminate\Auth\Access\AuthorizationException */ public function payByAlipay(Order $order, Request $request) { $this->authorize('own', $order); #判断订单是否属于当前用户 if ($order->paid_at || $order->closed) { #订单已支付或者已关闭 throw new InvalidRequestException('订单状态不正确'); } return app('alipay')->web([ #调用支付宝的网页支付 'out_trade_no' => $order->no, #订单编号,需保证在商户端不重复 'total_amount' => $order->total_amount, #订单金额,单位元,支持小数点后两位 'subject' => '支付 Laravel Shop 的订单:'.$order->no, #订单标题 ]); } /** * 前端回调也买你 */ public function alipayReturn() { try { app('alipay')->verify(); } catch (\Exception $e) { return view('pages.error', ['msg' => '数据不正确']); } return view('pages.success', ['msg' => '付款成功']); } /** * 服务器回调 */ public function alipayNotify() { $data = app('alipay')->verify(); #校验输入参数 $order = Order::where('no', $data->out_trade_no)->first(); #$data->out_trade_no 拿到订单流水号,并在数据库中查询 if (!$order) { #正常来说不太可能出现支付了一笔不存在的订单,这个判断只是加强系统健壮性。 return 'fail'; } if ($order->paid_at) { #如果这笔订单的状态已经是已支付 return app('alipay')->success(); #返回数据给支付宝 } $order->update([ 'paid_at' => Carbon::now(), #支付时间 'payment_method' => 'alipay', #支付方式 'payment_no' => $data->trade_no, #支付宝订单号 ]); return app('alipay')->success(); } } |
6编写路由开始测试
如果服务器没有上线请使用https://requestbin.fullcontact.com/
它会记录请求支付宝请求参数,然后你在复制参数模拟请求就可以了
1 2 3 |
Route::get('payment/{order}/alipay', 'PaymentController@payByAlipay') ->name('payment.alipay'); #订单支付的方法 Route::get('payment/alipay/return', 'PaymentController@alipayReturn') ->name('payment.alipay.return'); #支付宝前端回调方法 Route::post('/payment/alipay/notify', 'PaymentController@alipayNotify') ->name('payment.alipay.notify'); #支付宝服务器回调方法 |