Bisnis online Anda sedang berkembang pesat? Selamat! Tapi, apakah Anda sudah memberikan kemudahan bagi pelanggan dalam melakukan pembayaran? Jika belum, Anda mungkin kehilangan potensi penjualan. Salah satu solusi terbaik untuk meningkatkan konversi adalah dengan mengintegrasikan payment gateway terpercaya seperti Midtrans ke dalam aplikasi Laravel Anda. Artikel ini akan memandu Anda langkah demi langkah dalam integrasi payment gateway Midtrans dengan Laravel agar Anda bisa terima pembayaran online mudah.
Mengapa Memilih Midtrans untuk Laravel Anda?
Sebelum kita membahas proses integrasi, mari kita pahami dulu mengapa Midtrans menjadi pilihan populer bagi bisnis online yang menggunakan Laravel:
- Keamanan Terjamin: Midtrans sudah teruji dan memenuhi standar keamanan industri, termasuk PCI DSS. Ini penting untuk membangun kepercayaan pelanggan terhadap bisnis Anda.
- Beragam Metode Pembayaran: Midtrans mendukung berbagai metode pembayaran populer di Indonesia, mulai dari transfer bank, kartu kredit/debit, e-wallet (GoPay, OVO, Dana, LinkAja), hingga pembayaran melalui gerai retail (Indomaret, Alfamart).
- Kemudahan Integrasi: Midtrans menyediakan dokumentasi yang lengkap dan API yang mudah digunakan, sehingga proses integrasi dengan Laravel menjadi lebih sederhana.
- Dasbor yang Informatif: Anda dapat memantau semua transaksi, menganalisis performa penjualan, dan mengelola pengaturan dengan mudah melalui dasbor Midtrans.
- Dukungan Teknis yang Responsif: Jika Anda mengalami kendala, tim dukungan teknis Midtrans siap membantu Anda.
- Meningkatkan Konversi Penjualan: Dengan menyediakan berbagai opsi pembayaran, Anda memberikan fleksibilitas kepada pelanggan, yang pada akhirnya dapat meningkatkan konversi penjualan.
Persiapan Sebelum Memulai Integrasi Midtrans dengan Laravel
Sebelum terjun ke kode, pastikan Anda telah menyiapkan beberapa hal berikut:
- Akun Midtrans: Daftar dan buat akun di Midtrans. Anda bisa mulai dengan akun sandbox (uji coba) sebelum beralih ke akun production (live).
- Client Key dan Server Key: Dapatkan client key dan server key dari dasbor Midtrans Anda. Keduanya akan digunakan untuk otentikasi saat berinteraksi dengan API Midtrans. Client key digunakan di sisi client (browser) untuk menampilkan payment popup, sementara server key digunakan di sisi server (Laravel) untuk memproses transaksi.
- Composer: Pastikan Composer sudah terpasang di sistem Anda. Composer adalah dependency manager untuk PHP yang akan membantu Anda mengunduh package yang dibutuhkan.
- Aplikasi Laravel: Pastikan Anda sudah memiliki aplikasi Laravel yang siap diintegrasikan. Jika belum, buat proyek Laravel baru menggunakan perintah
composer create-project laravel/laravel nama-proyek.
Langkah-Langkah Integrasi Payment Gateway Midtrans dengan Laravel
Berikut adalah langkah-langkah detail untuk mengintegrasikan Midtrans dengan Laravel Anda:
1. Instalasi Package Midtrans PHP di Laravel
Buka terminal atau command prompt Anda, lalu arahkan ke direktori proyek Laravel Anda. Kemudian, jalankan perintah berikut untuk mengunduh package Midtrans PHP menggunakan Composer:
composer require midtrans/midtrans-php
Perintah ini akan mengunduh dan memasang package Midtrans PHP ke dalam proyek Laravel Anda.
2. Konfigurasi Midtrans di Laravel
Setelah package terpasang, Anda perlu mengkonfigurasi Midtrans di Laravel Anda. Buat file konfigurasi baru bernama midtrans.php di direktori config. Isi file tersebut dengan kode berikut:
<?php
return [
'merchant_id' => env('MIDTRANS_MERCHANT_ID'),
'client_key' => env('MIDTRANS_CLIENT_KEY'),
'server_key' => env('MIDTRANS_SERVER_KEY'),
'is_production' => env('MIDTRANS_IS_PRODUCTION', false),
'is_sanitized' => env('MIDTRANS_IS_SANITIZED', true),
'is_3ds' => env('MIDTRANS_IS_3DS', true),
];
Kemudian, tambahkan variabel-variabel lingkungan (environment variables) di file .env Anda. Anda bisa menemukan merchant ID, client key, dan server key di dasbor Midtrans Anda.
MIDTRANS_MERCHANT_ID=YOUR_MIDTRANS_MERCHANT_ID
MIDTRANS_CLIENT_KEY=YOUR_MIDTRANS_CLIENT_KEY
MIDTRANS_SERVER_KEY=YOUR_MIDTRANS_SERVER_KEY
MIDTRANS_IS_PRODUCTION=false # Set to 'true' for production environment
MIDTRANS_IS_SANITIZED=true
MIDTRANS_IS_3DS=true
Pastikan untuk mengganti YOUR_MIDTRANS_MERCHANT_ID, YOUR_MIDTRANS_CLIENT_KEY, dan YOUR_MIDTRANS_SERVER_KEY dengan nilai yang sesuai dari akun Midtrans Anda. Atur MIDTRANS_IS_PRODUCTION menjadi true jika Anda sudah siap untuk menerima pembayaran secara live.
Terakhir, publikasikan file konfigurasi agar dapat diakses oleh Laravel:
php artisan vendor:publish --tag=config
3. Membuat Controller untuk Mengelola Transaksi Midtrans
Buat controller baru untuk menangani logika yang berkaitan dengan transaksi Midtrans. Misalnya, kita bisa membuat controller bernama TransactionController.
php artisan make:controller TransactionController
Buka file app/Http/Controllers/TransactionController.php dan tambahkan method untuk membuat request transaksi ke Midtrans:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use MidtransConfig;
use MidtransSnap;
class TransactionController extends Controller
{
public function __construct()
{
// Set 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');
}
public function createTransaction(Request $request)
{
// Data transaksi
$orderId = uniqid(); // Generate order ID unik
$grossAmount = $request->gross_amount; // Ambil jumlah pembayaran dari request
// Parameter transaksi yang akan dikirim ke Midtrans
$params = [
'transaction_details' => [
'order_id' => $orderId,
'gross_amount' => $grossAmount,
],
'customer_details' => [
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'email' => $request->email,
'phone' => $request->phone,
],
];
try {
// Dapatkan snap token dari Midtrans
$snapToken = Snap::getSnapToken($params);
// Simpan data transaksi ke database (opsional)
// Misalnya: Transaction::create(['order_id' => $orderId, 'snap_token' => $snapToken, ...]);
// Kirim snap token ke view
return view('checkout', ['snapToken' => $snapToken, 'orderId' => $orderId]);
} catch (Exception $e) {
// Tangani error
return response()->json(['error' => $e->getMessage()], 500);
}
}
public function callback(Request $request)
{
// Terima callback dari Midtrans
$serverKey = config('midtrans.server_key');
$hashedSignature = hash("sha512", $request->order_id . $request->status_code . $request->gross_amount . $serverKey);
if ($hashedSignature == $request->signature_key) {
if ($request->transaction_status == 'capture') {
if ($request->fraud_status == 'challenge') {
// TODO Set payment status in merchant's database to 'challenge'
// Misalnya: Update status transaksi di database menjadi 'challenge'
} else if ($request->fraud_status == 'accept') {
// TODO Set payment status in merchant's database to 'success'
// Misalnya: Update status transaksi di database menjadi 'success'
}
} else if ($request->transaction_status == 'settlement') {
// TODO set payment status in merchant's database to 'Settlement'
// Misalnya: Update status transaksi di database menjadi 'settlement'
} else if ($request->transaction_status == 'deny') {
// TODO set payment status in merchant's database to 'deny'
// Misalnya: Update status transaksi di database menjadi 'deny'
} else if ($request->transaction_status == 'cancel' || $request->transaction_status == 'expire') {
// TODO set payment status in merchant's database to 'failure'
// Misalnya: Update status transaksi di database menjadi 'failure'
} else if ($request->transaction_status == 'pending') {
// TODO set payment status in merchant's database to 'pending'
// Misalnya: Update status transaksi di database menjadi 'pending'
}
}
// Berikan respons ke Midtrans (harus kode 200)
return response('OK', 200);
}
}
Penjelasan Kode:
__construct(): Konstruktor controller ini menginisialisasi konfigurasi Midtrans dari fileconfig/midtrans.php.createTransaction(Request $request): Method ini menerima data transaksi dari request, membuat parameter transaksi yang sesuai dengan format Midtrans, dan kemudian mendapatkan snap token menggunakan methodSnap::getSnapToken(). Snap token ini kemudian dikirim ke view untuk menampilkan payment popup.callback(Request $request): Method ini menerima callback dari Midtrans setelah transaksi selesai. Callback berisi informasi tentang status transaksi. Anda perlu memverifikasi tanda tangan (signature key) untuk memastikan bahwa callback berasal dari Midtrans yang sah. Berdasarkan status transaksi, Anda perlu memperbarui status transaksi di database Anda.
4. Membuat View untuk Menampilkan Payment Popup
Buat view untuk menampilkan payment popup dari Midtrans. Misalnya, buat file bernama resources/views/checkout.blade.php.
<!DOCTYPE html>
<html>
<head>
<title>Checkout</title>
<script src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key="{{ config('midtrans.client_key') }}"></script>
</head>
<body>
<h1>Checkout</h1>
<p>Order ID: {{ $orderId }}</p>
<button id="pay-button">Bayar Sekarang</button>
<script type="text/javascript">
document.getElementById('pay-button').onclick = function(){
// SnapToken acquired from the controller.
snap.pay('{{ $snapToken }}', {
// Optional
onSuccess: function(result){
// /* You may add your own implementation here */
alert("Pembayaran berhasil!"); console.log(result);
},
// Optional
onPending: function(result){
// /* You may add your own implementation here */
alert("Menunggu pembayaran!"); console.log(result);
},
// Optional
onError: function(result){
// /* You may add your own implementation here */
alert("Pembayaran gagal!"); console.log(result);
},
onClose: function() {
/* You may add your own implementation here */
alert('Anda menutup jendela pembayaran tanpa menyelesaikan pembayaran.');
}
});
};
</script>
</body>
</html>
Penjelasan Kode:
data-client-key="{{ config('midtrans.client_key') }}": Atribut ini menyertakan client key dari Midtrans yang digunakan untuk inisialisasi Snap.js.snap.pay('{{ $snapToken }}', { ... }): Kode ini menggunakan snap token yang diterima dari controller untuk memunculkan payment popup.onSuccess,onPending,onError: Fungsi-fungsi ini adalah callback yang akan dipanggil setelah transaksi berhasil, pending, atau gagal. Anda dapat menambahkan implementasi Anda sendiri di dalam fungsi-fungsi ini, seperti menampilkan pesan sukses atau gagal, atau memperbarui status transaksi di database Anda.
5. Menambahkan Route
Tambahkan route ke file routes/web.php untuk mengakses controller dan view yang telah dibuat.
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersTransactionController;
Route::get('/', function () {
return view('welcome'); // Ganti dengan halaman utama aplikasi Anda
});
Route::post('/transaction/create', [TransactionController::class, 'createTransaction'])->name('transaction.create');
Route::post('/midtrans/callback', [TransactionController::class, 'callback'])->name('midtrans.callback');
Penjelasan Kode:
Route::post('/transaction/create', [TransactionController::class, 'createTransaction'])->name('transaction.create'): Route ini menangani request POST ke/transaction/createdan memanggil methodcreateTransactiondiTransactionController.Route::post('/midtrans/callback', [TransactionController::class, 'callback'])->name('midtrans.callback'): Route ini menangani callback dari Midtrans.
6. Membuat Form untuk Input Data Transaksi
Buat form HTML yang memungkinkan pengguna memasukkan data transaksi, seperti nama, email, nomor telepon, dan jumlah pembayaran. Form ini akan mengirimkan data ke route /transaction/create. Contoh:
<form action="{{ route('transaction.create') }}" method="POST">
@csrf
<label for="first_name">Nama Depan:</label><br>
<input type="text" id="first_name" name="first_name"><br>
<label for="last_name">Nama Belakang:</label><br>
<input type="text" id="last_name" name="last_name"><br>
<label for="email">Email:</label><br>
<input type="email" id="email" name="email"><br>
<label for="phone">Nomor Telepon:</label><br>
<input type="tel" id="phone" name="phone"><br>
<label for="gross_amount">Jumlah Pembayaran:</label><br>
<input type="number" id="gross_amount" name="gross_amount"><br><br>
<input type="submit" value="Submit">
</form>
7. Uji Coba Integrasi
Setelah semua langkah di atas selesai, Anda dapat menguji coba integrasi Anda. Buka aplikasi Laravel Anda di browser, lalu akses halaman yang berisi form transaksi. Isi data transaksi dan klik tombol “Submit”. Payment popup dari Midtrans seharusnya muncul. Ikuti instruksi di payment popup untuk menyelesaikan pembayaran.
8. Menangani Callback dari Midtrans Secara Tepat
Penanganan callback adalah bagian penting dari integrasi Midtrans. Pastikan Anda memverifikasi tanda tangan (signature key) dari callback untuk memastikan keasliannya. Berdasarkan status transaksi yang diterima dari callback, perbarui status transaksi di database Anda dengan tepat. Ini akan membantu Anda melacak pembayaran dan memberikan notifikasi yang sesuai kepada pelanggan Anda.
Praktik Terbaik dalam Integrasi Midtrans dengan Laravel
- Keamanan Data: Selalu jaga keamanan client key dan server key Anda. Jangan pernah menyimpan server key di sisi client (browser).
- Penanganan Error: Tangani semua kemungkinan error dengan baik. Misalnya, jika gagal mendapatkan snap token dari Midtrans, tampilkan pesan error yang informatif kepada pengguna.
- Penggunaan Library yang Update: Selalu gunakan versi terbaru dari package Midtrans PHP untuk memastikan Anda mendapatkan bug fixes dan fitur-fitur terbaru.
- Dokumentasi: Baca dan pahami dokumentasi Midtrans dengan seksama. Dokumentasi tersebut berisi informasi lengkap tentang API Midtrans dan cara penggunaannya.
- Uji Coba yang Menyeluruh: Lakukan uji coba yang menyeluruh di lingkungan sandbox sebelum beralih ke lingkungan production. Pastikan semua alur pembayaran berfungsi dengan baik.
- Implementasi Fitur Tambahan: Midtrans menawarkan berbagai fitur tambahan, seperti recurring payments, split payments, dan discounts. Pertimbangkan untuk mengimplementasikan fitur-fitur ini jika sesuai dengan kebutuhan bisnis Anda.
Meningkatkan Konversi Pembayaran Online dengan Integrasi Midtrans di Laravel
Dengan mengintegrasikan Midtrans ke dalam aplikasi Laravel Anda, Anda tidak hanya memberikan kemudahan bagi pelanggan dalam melakukan pembayaran, tetapi juga meningkatkan potensi konversi penjualan. Berikut adalah beberapa cara untuk memaksimalkan manfaat dari integrasi Midtrans:
- Tawarkan Berbagai Metode Pembayaran: Semakin banyak metode pembayaran yang Anda tawarkan, semakin besar kemungkinan pelanggan untuk menyelesaikan pembelian.
- Sederhanakan Proses Checkout: Pastikan proses checkout di aplikasi Anda sederhana dan mudah diikuti. Minimalkan jumlah langkah yang diperlukan untuk menyelesaikan pembayaran.
- Berikan Kepercayaan: Tampilkan logo Midtrans dan sertifikasi keamanan lainnya di halaman checkout untuk membangun kepercayaan pelanggan.
- Optimalkan Halaman Checkout: Optimalkan halaman checkout Anda untuk mobile. Pastikan halaman tersebut responsif dan mudah digunakan di perangkat mobile.
- Pantau dan Analisis Data: Gunakan dasbor Midtrans untuk memantau dan menganalisis data transaksi. Identifikasi tren dan peluang untuk meningkatkan konversi pembayaran.
Dengan mengikuti panduan dan praktik terbaik yang telah dijelaskan dalam artikel ini, Anda dapat dengan mudah mengintegrasikan payment gateway Midtrans dengan aplikasi Laravel Anda dan mulai menerima pembayaran online dengan mudah. Selamat mencoba!

