# 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`