日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

laravel 支付宝流程

發布時間:2024/3/24 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 laravel 支付宝流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 引入支付庫

yansongda/pay 這個庫封裝了支付寶和微信支付的接口,通過這個庫我們就不需要去關注不同支付平臺的接口差異,使用相同的方法、參數來完成支付功能,節省開發時間。

首先通過 composer 引入這個包:

$ composer require yansongda/pay

2. 配置參數

我們創建一個新的配置文件來保存支付所需的參數:

$ touch config/pay.php

config/pay.php

<?phpreturn ['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'),],], ];

現在這些參數先留空,后面的章節我們再填入具體的值。

3. 容器

容器是現代 PHP 開發的一個重要概念,Laravel 就是在容器的基礎上構建的。我們將支付操作類實例注入到容器中,在以后的代碼里就可以直接通過 app('alipay') 來取得對應的實例,而不需要每次都重新創建。

我們通常在 AppServiceProvider 的 register() 方法中往容器中注入實例:

app/Providers/AppServiceProvider.php

use Monolog\Logger; use Yansongda\Pay\Pay; . . .public function register(){// 往服務容器中注入一個名為 alipay 的單例對象$this->app->singleton('alipay', function () {$config = config('pay.alipay');// 判斷當前項目運行環境是否為線上環境if (app()->environment() !== 'production') {$config['mode'] = 'dev';$config['log']['level'] = Logger::DEBUG;} else {$config['log']['level'] = Logger::WARNING;}// 調用 Yansongda\Pay 來創建一個支付寶支付對象return Pay::alipay($config);});$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);});}

代碼解析:

  • $this->app->singleton() 往服務容器中注入一個單例對象,第一次從容器中取對象時會調用回調函數來生成對應的對象并保存到容器中,之后再去取的時候直接將容器中的對象返回。
  • app()->environment() 獲取當前運行的環境,線上環境會返回 production。對于支付寶,如果項目運行環境不是線上環境,則啟用開發模式,并且將日志級別設置為 DEBUG。由于微信支付沒有開發模式,所以僅僅將日志級別設置為 DEBUG。

4. 測試

接下來我們來測試一下剛剛注入到容器中的實例,進入 tinker:

$ php artisan tinker

然后分別輸入 app('alipay') 和 app('wechat_pay')

>>> app('alipay') >>> app('wechat_pay')

可以看到返回了 Yansongda\Pay\Gateways\Alipay 和 Yansongda\Pay\Gateways\Wechat 類型的對象,說明注入成功。

5 支付寶 支付配置

###配置參數

接下來將這些參數放到配置文件中:

config/pay.php

'app_id' => '你在支付寶沙箱看到的appid', 'ali_public_key' => '支付寶沙箱顯示的公鑰', 'private_key' => '剛剛生成的私鑰',

支付測試

接下來我們要試一下能否正常跳轉到支付寶的支付界面,在路由文件中新增一個臨時的路由:

routes/web.php

Route::get('alipay', function() {return app('alipay')->web(['out_trade_no' => time(),'total_amount' => '1','subject' => 'test subject - 測試',]); });

6. 支付回調

支付寶的支付回調分為 前端回調服務器回調

  • 前端回調 是指當用戶支付成功之后支付寶會讓用戶瀏覽器跳轉回項目頁面并帶上支付成功的參數,也就是說前端回調依賴于用戶瀏覽器,如果用戶在跳轉之前關閉瀏覽器,將無法收到前端回調。
  • 服務器回調 是指支付成功之后支付寶的服務器會用訂單相關數據作為參數請求項目的接口,不依賴用戶瀏覽器。

因此我們判斷支付是否成功要以服務器端回調為準。

我們需要在 PaymentController 中新增兩個方法,分別用于處理前端和服務器端回調。

app/Http/Controllers/PaymentController.php

. . .// 前端回調頁面public function alipayReturn(){// 校驗提交的參數是否合法$data = app('alipay')->verify();dd($data);}// 服務器端回調public function alipayNotify(){$data = app('alipay')->verify();\Log::debug('Alipay notify', $data->all());}

代碼解析:

  • app('alipay')->verify() 用于校驗提交的參數是否合法,支付寶的前端跳轉會帶有數據簽名,通過校驗數據簽名可以判斷參數是否被惡意用戶篡改。同時該方法還會返回解析后的參數。
  • dd($data); 輸出解析后的數據,我們要先看看會返回什么再決定如何處理。
  • \Log::debug('Alipay notify', $data->all()); 由于服務器端的請求我們無法看到返回值,使用 dd 就不行了,所以需要通過日志的方式來保存。

接下來將這兩個方法注冊到路由:

routes/web.php

. . . Route::group(['middleware' => 'auth'], function () {...Route::group(['middleware' => 'email_verified'], function () {...Route::get('payment/alipay/return', 'PaymentController@alipayReturn')->name('payment.alipay.return');}); }); Route::post('payment/alipay/notify', 'PaymentController@alipayNotify')->name('payment.alipay.notify');

服務器端回調的路由不能放到帶有 auth 中間件的路由組中,因為支付寶的服務器請求不會帶有認證信息。

接下來我們把這兩個回調地址配置到支付寶的支付實例里:

app/Providers/AppServiceProvider.php

. . .$this->app->singleton('alipay', function () {$config = config('pay.alipay');$config['notify_url'] = route('payment.alipay.notify');$config['return_url'] = route('payment.alipay.return');...}); . . .

notify_url 代表服務器端回調地址,return_url 代表前端回調地址。

注意:回調地址必須是完整的帶有域名的 URL,不可以是相對路徑。使用 route() 函數生成的 URL 默認就是帶有域名的完整地址。

總結

以上是生活随笔為你收集整理的laravel 支付宝流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。