Payment Gateway - Masalah POST Callback pada Laravel Route

Jika anda menggunakan Payment Gateway API, anda pasti akan menemui fungsi Callback dimana fungsi ini akan di trigger selepas sesuatu transaksi berlaku. Kita ambil contoh payment gateway Chip. Jika kita rujuk pada dokumentasi rasmi, API mereka akan return success_callback (https://docs.chip-in.asia/chip-collect/api-reference/purchases/create).

Sebagai contoh kita tetapkan success_callback url adalah https://websiteanda.com/success_callback?id=1 dan secara lazimnya akan menggunakan POST request. Di Route laravel iaitu web.php kita menggunakan code seperti dibawah

 Route::post('/success_callback', function () {  
   $bookingId = request()->query('id') ?? null;  
   Log::info('success_callback trigger. Booking ID: ' . $bookingId);  
 });  

Ini adalah route yang normal kita gunakan untuk memanggil URL dan jika sekali imbas kelihatan tiada masalah. Namum terdapat masalah yang akan terjadi dimana panggilan ke /success_callback mempunyai masalah

Masalah CSRF Token

Route tidak di "trigger" akibat page expired tetapi ini tidak dapat dilihat secara mata kasar. Jadi kita perlu uji menggunakan CURL pada Command Prompt Windows (Saya menggunakan windows). Gunakan command berikut: 

 curl -X POST https://websiteanda.com/success_callback -d "key1=value1&key2=value2" -H "Content-Type: application/x-www-form-urlencoded"  

disini anda mungkin akan dapat respon dalam bentuk code html dan disini anda akan menemui errornya.

Bagi kes page expired besar kemungkinan berpunca daripada CSRF token. Jadi bagi mengatasi masalah ini, anda perlu exclude route "/success_callback" dari middleware VerifyCsrfToken dan berikut adalah caranya.

 Route::post('/success_callback', function () {  
   $bookingId = request()->query('id') ?? null;  
   Log::info('success_callback trigger. Booking ID: ' . $bookingId);  
 })->withoutMiddleware([VerifyCsrfToken::class]);  

xxSeperti yang kita dapat lihat, kita hanya perlu tambahkan ->withoutMiddleware([VerifyCsrfToken::class]) pada route berkenaan

Post a Comment

Previous Post Next Post