Cara Menghubungkan Laravel dengan Payment Gateway Midtrans
Salah satu Payment Gateway paling populer di Indonesia adalah Midtrans. Midtrans menyediakan API yang mudah diintegrasikan dengan berbagai framework, termasuk Laravel. Pada artikel ini Anda akan mempelajari cara menghubungkan Laravel dengan Midtrans mulai dari proses instalasi, konfigurasi, pembuatan transaksi, hingga menerima notifikasi pembayaran secara otomatis.
Apa Itu Midtrans?
Midtrans merupakan layanan Payment Gateway asal Indonesia yang memudahkan developer maupun perusahaan dalam menerima pembayaran secara online.
Beberapa metode pembayaran yang didukung antara lain:
QRIS
GoPay
ShopeePay
Virtual Account (BCA, BNI, BRI, Mandiri, CIMB, Permata, dll.)
Transfer Bank
Credit Card
Indomaret
Alfamart
Akulaku
Kredivo
Dengan satu integrasi, aplikasi Laravel Anda sudah dapat menerima berbagai jenis pembayaran.
Persiapan Sebelum Integrasi
Sebelum memulai, pastikan Anda telah memiliki:
Laravel 10, 11, 12, atau versi terbaru
PHP 8.1 atau lebih tinggi
Composer
Akun Midtrans Sandbox
Database MySQL atau PostgreSQL
SSL untuk mode Production
Untuk tahap pengembangan, gunakan terlebih dahulu akun Sandbox sehingga transaksi tidak menggunakan uang asli.
Membuat Akun Midtrans
Daftarkan akun pada dashboard Midtrans.
Setelah login, buka menu:
Settings → Access Keys
Di sana Anda akan mendapatkan:
Merchant ID
Server Key
Client Key
Ketiga informasi tersebut akan digunakan pada aplikasi Laravel.
Install Library Midtrans
Masuk ke folder project Laravel kemudian jalankan:
composer require midtrans/midtrans-php
Setelah proses selesai, library Midtrans siap digunakan.
Menambahkan Konfigurasi pada File .env
Tambahkan konfigurasi berikut:
MIDTRANS_SERVER_KEY=SB-Mid-server-xxxxxxxxxxxx
MIDTRANS_CLIENT_KEY=SB-Mid-client-xxxxxxxxxxxx
MIDTRANS_IS_PRODUCTION=false
MIDTRANS_IS_SANITIZED=true
MIDTRANS_IS_3DS=true
Saat aplikasi sudah live, ubah:
MIDTRANS_IS_PRODUCTION=true
dan gunakan Server Key Production.
Membuat File Konfigurasi Midtrans
Buat file:
config/midtrans.php
Isi dengan konfigurasi berikut:
return [
'server_key' => env('MIDTRANS_SERVER_KEY'),
'client_key' => env('MIDTRANS_CLIENT_KEY'),
'is_production' => env('MIDTRANS_IS_PRODUCTION', false),
'is_sanitized' => env('MIDTRANS_IS_SANITIZED', true),
'is_3ds' => env('MIDTRANS_IS_3DS', true),
];
Dengan cara ini konfigurasi akan lebih rapi dan mudah dikelola.
Membuat Controller Pembayaran
Misalnya membuat controller:
php artisan make:controller PaymentController
Kemudian pada constructor lakukan konfigurasi Midtrans.
Config::$serverKey = config('midtrans.server_key');
Config::$isProduction = config('midtrans.is_production');
Config::$isSanitized = config('midtrans.is_sanitized');
Config::$is3ds = config('midtrans.is_3ds');
Konfigurasi ini hanya perlu dilakukan satu kali.
Membuat Data Transaksi
Misalkan pelanggan membeli produk.
$params = [
'transaction_details' => [
'order_id' => 'INV-10001',
'gross_amount' => 250000,
],
'customer_details' => [
'first_name' => 'Budi',
'email' => 'budi@email.com',
'phone' => '08123456789',
]
];
Data tersebut nantinya dikirim ke Midtrans untuk membuat transaksi.
Membuat Snap Token
Selanjutnya buat Snap Token.
$snapToken = Snap::getSnapToken($params);
Token ini nantinya dikirim ke halaman pembayaran.
Menampilkan Halaman Pembayaran
Pada Blade cukup tambahkan JavaScript Midtrans.
<script src="https://app.sandbox.midtrans.com/snap/snap.js"
data-client-key="{{ config('midtrans.client_key') }}">
</script>
Kemudian jalankan popup pembayaran.
snap.pay(token);
Setelah tombol pembayaran diklik, pelanggan akan diarahkan ke halaman pembayaran Midtrans.
Menyimpan Data Order Terlebih Dahulu
Sebelum membuat Snap Token, sebaiknya simpan data pesanan ke database.
Contoh struktur tabel:
id
invoice_number
user_id
total
payment_status
payment_method
transaction_id
created_at
Status awal dapat berupa:
Pending
Jangan langsung mengubah status menjadi "Paid" sebelum menerima notifikasi dari Midtrans.
Membuat Callback Notification
Midtrans akan mengirimkan notifikasi setiap kali pembayaran berubah.
Misalnya:
Pending
Settlement
Capture
Deny
Expire
Cancel
Buat route:
Route::post('/midtrans/callback', [PaymentController::class,'callback']);
Kemudian lakukan pengecekan status transaksi.
Jika status:
settlement
maka ubah pembayaran menjadi:
Paid
Jika:
expire
ubah menjadi:
Expired
Jika:
cancel
ubah menjadi:
Cancelled
Dengan sistem callback, data pembayaran akan selalu sinkron secara otomatis.
Mengubah Status Pesanan Otomatis
Contoh alur bisnis:
Pelanggan membuat pesanan.
Status pesanan menjadi Menunggu Pembayaran.
Midtrans mengirim notifikasi pembayaran berhasil.
Laravel mengubah status menjadi Lunas.
Admin memproses pengiriman.
Barang dikirim ke pelanggan.
Alur seperti ini jauh lebih aman dibanding hanya mengandalkan redirect setelah pembayaran selesai.
Mode Sandbox dan Production
Midtrans menyediakan dua mode.
Sandbox
Digunakan untuk testing.
Semua pembayaran hanyalah simulasi.
Production
Digunakan ketika website sudah online.
Transaksi menggunakan uang asli.
Pastikan sebelum berpindah ke Production Anda mengganti:
Server Key
Client Key
URL JavaScript
Endpoint Callback
Tips Keamanan
Agar integrasi berjalan aman, lakukan beberapa hal berikut:
Jangan menyimpan Server Key di dalam source code.
Gunakan file
.env.Selalu aktifkan HTTPS.
Verifikasi Signature Key pada callback.
Validasi nominal pembayaran.
Gunakan Order ID yang unik.
Simpan seluruh log transaksi.
Langkah-langkah tersebut akan membantu mencegah manipulasi data pembayaran.
Integrasi dengan Laravel E-Commerce
Midtrans sangat cocok digunakan pada berbagai jenis aplikasi Laravel seperti:
Website Toko Online
Marketplace
Sistem Booking Hotel
Booking Klinik
Aplikasi Rental
Sistem Membership
Aplikasi Kursus Online
SaaS (Software as a Service)
Point of Sale (POS)
ERP
CRM
Sistem Donasi
Sistem Pembayaran Tagihan
Karena mendukung banyak metode pembayaran, pengguna tidak perlu berpindah ke layanan lain untuk menyelesaikan transaksi.
Kesimpulan
Menghubungkan Laravel dengan Payment Gateway Midtrans merupakan langkah penting dalam membangun aplikasi yang profesional dan siap digunakan secara komersial. Proses integrasinya relatif mudah berkat SDK resmi yang disediakan Midtrans, serta dukungan dokumentasi yang lengkap.
Dengan menerapkan konfigurasi yang benar, membuat Snap Token, menyimpan data transaksi, serta memanfaatkan callback notification, Anda dapat membangun sistem pembayaran yang aman, otomatis, dan mudah dikelola. Pendekatan ini cocok diterapkan pada berbagai jenis aplikasi, mulai dari toko online, marketplace, hingga platform SaaS yang membutuhkan proses pembayaran digital secara real-time.
Artikel Terkait
Cara Menjalankan Queue Worker Laravel di cPanel Tanpa Supervisor
Queue Worker Laravel digunakan untuk memproses pekerjaan di belakang layar, seperti pengiriman email, notifikasi, pembuatan laporan, sinkronisasi API, dan pemrosesan data. Pada VPS, worker biasanya dijaga menggunakan Supervisor. Namun, pada shared hosting cPanel yang tidak menyediakan Supervisor, queue tetap dapat dijalankan menggunakan Cron Job dan perintah queue:work --stop-when-empty.
Cara Integrasi WhatsApp Cloud API dengan Laravel
WhatsApp Cloud API memungkinkan aplikasi Laravel mengirim pesan, notifikasi, dan template WhatsApp melalui layanan resmi Meta. Integrasi ini dapat digunakan untuk konfirmasi pesanan, invoice, pengingat pembayaran, customer service, hingga chatbot. Artikel ini membahas konfigurasi token, pengiriman pesan, serta penerimaan webhook menggunakan Laravel.
Cara Membuat Role dan Permission Laravel Tanpa Package
Role dan permission digunakan untuk membatasi akses pengguna berdasarkan tugas dan kewenangannya. Tanpa memasang package tambahan, Laravel dapat membuat sistem hak akses menggunakan migration, relasi Eloquent, middleware, Gate, Policy, dan Blade Directive. Artikel ini membahas pembuatan role dan permission dari awal, mulai dari struktur database, model, seeder, middleware, hingga penerapannya pada route dan tampilan.