# Laravel 串接綠界金流記錄 1. 先到 [綠界科技 全方位(All In One)金流介接 PHP版](https://github.com/ECPay/ECPayAIO_PHP/tree/master/AioSDK) 下載 sdk (ECPay.Payment.Integration.php) 存放至 `app/` 底下建立的 `ECPaySDK` 資料夾中。 2. 打開 `composer.json`,在 `autoload.files` 中打上`"app/ECPaySDK/ECPay.Payment.Integration.php"` 來引入 SDK,再執行 `php artisan dump-autoload` 載入。 3. 在 Controller (例如 `PaymentController`) 中 `use \ECPay_PaymentMethod as ECPayMethod;` 4. 找到 SDK/Example 中的[信用卡範例](https://github.com/ECPay/ECPayAIO_PHP/blob/master/AioSDK/example/sample_Credit_CreateOrder.php)複製 `try {` 以下的程式碼到 `PaymentController` 中的 `payByECPay()` 方法中。 *app/Http/Controllers/PaymentController.php* ```php= public function payByECPay(Order $order) { // 判斷訂單是否屬於當前用戶 $this->authorize('own', $order); // 訂單已支付或關閉 if ($order->paid_at || $order->closed) { throw new InvalidRequestException('訂單狀態錯誤'); } // 調用綠界的網頁支付 try { $obj = new \ECPay_AllInOne(); //服務參數 $obj->ServiceURL = "https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5"; //服務位置 $obj->HashKey = '5294y06JbISpM5x9'; //測試用Hashkey,請自行帶入ECPay提供的HashKey,可存放至 .env 變數中 $obj->HashIV = 'v77hoKGq4kWxNNIS'; //測試用HashIV,請自行帶入ECPay提供的HashIV,可存放至 .env 變數中 $obj->MerchantID = '2000132'; //測試用MerchantID,請自行帶入ECPay提供的MerchantID,可存放至 .env 變數中 $obj->EncryptType = '1'; //CheckMacValue加密類型,請固定填入1,使用SHA256加密 //基本參數(請依系統規劃自行調整) $MerchantTradeNo = $order->no; $obj->Send['ReturnURL'] = "https://shop.mrhanji.com/callback"; //消費者付款完成後,綠界科技會以 Server POST (背景接收)方式傳送付款結果參數到商家的Server $obj->Send['ClientBackURL'] = "https://shop.mrhanji.com/success"; //若使用Server端接收參數,付款完成、取號完成頁面上會出現「返回商店」按鈕 ,用來返回您的商店網站的 $obj->Send['MerchantTradeNo'] = $MerchantTradeNo; //訂單編號 $obj->Send['MerchantTradeDate'] = date('Y/m/d H:i:s'); //交易時間 $obj->Send['TotalAmount'] = $order->total_amount; //交易金額 $obj->Send['TradeDesc'] = "good to drink"; //交易描述 $obj->Send['ChoosePayment'] = ECPayMethod::Credit; //付款方式:Credit $obj->Send['IgnorePayment'] = ECPayMethod::GooglePay; //不使用付款方式:GooglePay //訂單的商品資料 foreach ($order->items as $item) { array_push($obj->Send['Items'], array('Name' => $item->product->title, 'Price' => (int)$item->price, 'Currency' => "元", 'Quantity' => $item->amount, 'URL' => "dedwed")); } //產生訂單(auto submit至ECPay) $obj->CheckOut(); } catch (Exception $e) { echo $e->getMessage(); } } ``` 5. 接下來處理結帳完成後,用綠界回傳給 Server 的參數來更新結帳時間、方式、編號。 *app/Http/Controllers/PaymentController.php* ```php= public function callback() { // dd(request()); $order = Order::where('no', '=', request('MerchantTradeNo'))->firstOrFail(); // 正常來說不太可能出現支付了一筆不存在的訂單,這個判斷只是增加系統健壯性 if (!$order) { return 'fail'; } // 如果這筆訂單的狀態已經是已支付 if ($order->paid_at) { return 'success'; } if (request('RtnCode') == '1') { // RtnCode=1表示付款成功 $order->update([ 'paid_at' => Carbon::now(), // 支付時間 'payment_method' => 'ecpay', // 支付方式 'payment_no' => request('MerchantTradeNo'), // 綠界訂單編號 ]); echo '1|OK'; // 系統收到綠界回傳結果,正確回應1|OK } } ``` 同時也需要設定從 CSRF 保護中排除 URI,讓綠界回傳給 Server 的 POST 參數能夠傳進來。 *app/Http/Middleware/VerifyCsrfToken.php* ```php= class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'callback', // 因為 $obj->Send['ReturnURL'] = "https://shop.mrhanji.com/callback"; ]; } ``` 6. 設定返回商店的網址,讓使用者在綠界結完帳後可以方便地點擊按鈕回到我們的網站,這邊我們是設定回到訂單列表。 *app/Http/Controllers/PaymentController.php* ```php= public function redirectFromECPay() { return redirect('/orders'); // 返回訂單列表 } ``` 7. 設定路由 *routes/web.php* ```php= Route::group(['middleware' => ['auth', 'verified']], function () { . . . Route::get('success', [PaymentController::class, 'redirectFromECPay']); }); Route::post('callback', [PaymentController::class, 'callback']); // 經測試後無法通過 middleware 驗證成功 ``` 8. 剩下的工作就是在訂單詳情頁增加結帳按鈕,結帳成功後,訂單狀態就會從未支付變成已支付囉! 信用卡測試卡號等資訊請到綠界的[信用卡API技術文件](https://www.ecpay.com.tw/Service/API_Dwnld)中取得。 ###### tags: `Laravel` `payment` `ecpay`