Implementasi Payment Gateway Xendit pada Laravel


By Muhammad Satria Rajendra

Tingginya kebutuhan akan pembayaran digital yang efisien dan aman membuat payment gateway menjadi solusi dalam menyediakan pembayaran. Salah satu payment gateway yang populer di Indonesia adalah Xendit, yang menawarkan beragam fitur untuk memudahkan proses transaksi. Artikel ini akan membahas bagaimana mengimplementasikan Xendit dalam aplikasi berbasis back-end menggunakan Laravel.

  1. Persiapan Xendit

Langkah pertama yang perlu dilakukan adalah mendaftar dan mendapatkan akun Xendit. Proses pendaftaran ini sangat sederhana dan cepat, kamu hanya perlu mengikuti beberapa langkah mudah di situs resmi Xendit. Setelah itu, login ke akun Xendit dan klik Manage API Keys.

Lalu klik generate secret key dan sesuaikan permission nya dengan kebutuhan. Pada tutorial kali ini saya mengatur semua permission nya menjadi WRITE.

Setelah itu, kamu akan mendapatkan public key dan secret key yang kelak akan digunakan untuk melakukan dan menerima request.

  1. Instalasi dan Konfigurasi .env

Langkah selanjutnya adalah instalasi Xendit pada proyek laravel. Instalasi Xendit dapat dilakukan dengan composer

composer require xendit/xendit-php

Setelah Xendit berhasil diinstall, buka file .env lalu masukan public key dan secret key

XENDIT_SECRET_KEY=your-secret-key
XENDIT_PUBLIC_KEY=your-public-key
  1. Membuat PaymentController

Untuk melakukan request payment, pertama kita akan membuat PaymentController dengan menjalankan perintah:

php artisan make:controller PaymentController

Lalu import class Configuration,InvoiceApi dan CreateInvoiceRequest dari Xendit

use Xendit\Configuration;
use Xendit\Invoice\CreateInvoiceRequest;
use Xendit\Invoice\InvoiceApi;

Setelah itu, kita perlu membuat variabel _construct untuk mendapatkan Xendit API key yang sudah kita letakkan pada file .env sebelumnya


   public function __construct()
   {
       Configuration::setXenditKey(env('XENDIT_SECRET_KEY'));
   }

Lalu kita akan membuat function createInvoice yang berfungsi untuk mengirimkan request invoice ke Xendit

public function createInvoice(Request $request)
   {
       try {
           $order = new Payment;
           $order->user_id = $request->input('user_id');
           $order->external_id = (string) Str::uuid();
           $order->amount = $request->input('amount');
           $order->payer_email = $request->input('payer_email');
           $order->description = $request->input('description');
           $createInvoice = new CreateInvoiceRequest([
               'external_id' => $order->external_id,
               'amount' => $request->input('amount'),
               'payer_email' => $request->input('payer_email'),
               'description' => $request->input('description'),
               'invoice_duration' => 172800,
           ]);


         $apiInstance = new InvoiceApi();
         $generateInvoice = $apiInstance->createInvoice($createInvoice);
         $order->checkout_link = $generateInvoice['invoice_url'];
         $order->save();
         return response()->json([
             'message' => 'Invoice created',
             'checkout_link' => $order->checkout_link,
         ]);


       } catch (\Throwable $th) {
           throw $th;
       }
   }

  Response dari request tersebut berisi link pembayaran dan message. Selanjutnya kita akan membuat function untuk menerima callback dari request dan pembayaran.

   public function handleWebhook(Request $request)

   public function handleWebhook(Request $request)
   {
       $data = $request->all();
       $external_id = $data['external_id'];
       $status = strtolower($data['status']);
       $payment_method = $data['payment_method'];


       $order = Payment::where('external_id', $external_id)->first();
       $order->status = $status;
       $order->payment_method = $payment_method;
       $order->save();


       return response()->json([
           'message' => 'Webhook received',
           'status' => $status,
           'payment_method' => $payment_method,
       ]);
   }
  1. Menyiapkan url sebagai penerima callback dari Xendit

Kita perlu menjadikan function handleWebhook menjadi sebuah API yang nantinya API tersebut akan dikirim callback oleh Xendit. Buat rute di api.php seperti di bawah ini 

Route::post('/payments/webhook',[PaymentController::class,'handleWebhook']);

Lalu simpan alamat API tersebut di bagian callback Xendit

  1. Testing

Pada testing kali ini saya akan menggunakan POSTMAN dengan contoh request sebagai berikut

Request pembayaran berhasil dilakukan, lalu buka checkout_link di dalam browser dan lakukan simulasi pembayaran

Apabila request pembayaran berhasil dibayar, maka status transaksi akan berubah menjadi Successful

Dan apabila callback dari Xendit berhasil dikirim ke /api/payments/webhook maka seharusnya status request dari request tersebut berubah menjadi PAID

KESIMPULAN

Melalui langkah-langkah di atas, Kamu bisa dengan mudah mengintegrasikan Xendit di Laravel untuk menyediakan pembayaran dan penagihan di dalam aplikasi web dengan mudah. Xendit menyediakan berbagai fitur dan dukungan yang bisa membantumu dalam menyederhanakan proses pembayaran dan meningkatkan kepuasan pelanggan

Writer : Muhammad Satria Rajendra, Back-end Developer