Memiliki website yang mampu menerima pembayaran online adalah keharusan di era digital ini. Bayangkan betapa repotnya jika pelanggan Anda harus melakukan transfer manual dan mengkonfirmasi pembayaran satu per satu. Dengan mengintegrasikan payment gateway, proses pembayaran menjadi lebih cepat, aman, dan efisien. Salah satu payment gateway populer di Indonesia adalah Midtrans, dan di artikel ini, kita akan membahas secara mendalam tentang integrasi Payment Gateway Midtrans dengan Laravel, sebuah framework PHP yang powerfull dan populer untuk membangun website modern. Mari kita selami bagaimana Anda bisa mempermudah pembayaran online di website Anda dengan kombinasi ini.
1. Mengapa Memilih Midtrans untuk Website Laravel Anda? Keunggulan dan Fitur Utama
Sebelum kita membahas teknis integrasi Payment Gateway Midtrans dengan Laravel, mari kita pahami dulu mengapa Midtrans menjadi pilihan yang tepat. Midtrans menawarkan berbagai keunggulan dan fitur yang membuatnya unggul dibandingkan payment gateway lainnya, di antaranya:
- Beragam Metode Pembayaran: Midtrans mendukung berbagai metode pembayaran populer di Indonesia, mulai dari transfer bank (Virtual Account), kartu kredit/debit, e-wallet (GoPay, OVO, Dana, LinkAja), hingga pembayaran melalui gerai retail seperti Alfamart dan Indomaret. Hal ini memberikan fleksibilitas bagi pelanggan Anda untuk memilih metode pembayaran yang paling nyaman bagi mereka.
- Keamanan Tingkat Tinggi: Keamanan transaksi adalah prioritas utama. Midtrans menggunakan teknologi enkripsi terkini dan memenuhi standar keamanan PCI DSS, sehingga data sensitif pelanggan Anda terlindungi dengan baik.
- Dashboard yang Mudah Digunakan: Midtrans menyediakan dashboard yang intuitif dan mudah digunakan untuk memantau transaksi, mengelola laporan, dan melakukan konfigurasi lainnya.
- Integrasi yang Mudah: Midtrans menawarkan dokumentasi yang lengkap dan mudah dipahami, serta library dan SDK yang mempermudah proses integrasi dengan berbagai platform, termasuk Laravel.
- Harga yang Kompetitif: Midtrans menawarkan harga yang kompetitif dengan skema yang fleksibel, disesuaikan dengan kebutuhan bisnis Anda.
- Fitur Fraud Detection: Midtrans memiliki fitur pendeteksi fraud yang canggih untuk meminimalisir risiko penipuan pada transaksi online di website Anda.
- Customer Support yang Responsif: Midtrans menyediakan tim customer support yang responsif dan siap membantu Anda jika mengalami kendala dalam proses integrasi maupun penggunaan.
Dengan berbagai keunggulan ini, Midtrans menjadi solusi ideal untuk memproses pembayaran online di website Laravel Anda.
2. Persiapan Awal: Membuat Akun Midtrans dan Mendapatkan API Keys
Langkah pertama dalam integrasi Payment Gateway Midtrans dengan Laravel adalah membuat akun Midtrans dan mendapatkan API keys. API keys ini nantinya akan digunakan untuk menghubungkan website Laravel Anda dengan server Midtrans. Berikut langkah-langkahnya:
- Daftar Akun Midtrans: Kunjungi website Midtrans (https://midtrans.com/) dan daftarkan akun merchant Anda. Anda bisa memilih akun Sandbox untuk keperluan testing dan Production untuk transaksi yang sebenarnya.
- Verifikasi Akun: Lengkapi informasi bisnis Anda dan lakukan verifikasi akun sesuai dengan persyaratan Midtrans.
- Dapatkan API Keys: Setelah akun Anda aktif, login ke dashboard Midtrans. Pada menu “Settings”, cari bagian “API Keys”. Anda akan menemukan dua jenis API Keys:
- Server Key: Digunakan untuk memproses transaksi dari server Anda (Backend Laravel). Simpan kunci ini dengan aman dan jangan pernah membagikannya ke publik.
- Client Key: Digunakan untuk menampilkan form pembayaran Midtrans di halaman website Anda (Frontend).
Simpan kedua API Keys ini dengan baik karena akan kita gunakan pada langkah selanjutnya. Jangan pernah memasukkan Server Key langsung ke dalam kode Frontend Anda.
3. Instalasi Library Midtrans PHP di Proyek Laravel
Setelah memiliki API keys, langkah selanjutnya adalah menginstal library Midtrans PHP di proyek Laravel Anda. Library ini akan mempermudah interaksi dengan API Midtrans. Gunakan Composer, package manager untuk PHP, untuk melakukan instalasi. Buka terminal atau command prompt, lalu arahkan ke direktori proyek Laravel Anda dan jalankan perintah berikut:
composer require midtrans/midtrans
Perintah ini akan mengunduh dan menginstal library Midtrans PHP beserta dependensinya ke dalam proyek Laravel Anda. Setelah proses instalasi selesai, Anda siap untuk mengkonfigurasi library Midtrans.
4. Konfigurasi Library Midtrans di Laravel: Menyiapkan Credentials
Setelah library Midtrans terinstal, kita perlu mengkonfigurasinya dengan memasukkan API Keys yang telah kita dapatkan sebelumnya. Buat file konfigurasi baru untuk menyimpan credentials Midtrans Anda.
- Buat File Konfigurasi: Buat file baru bernama
midtrans.php
di dalam direktoriconfig/
proyek Laravel Anda. - Isi File Konfigurasi: Buka file
midtrans.php
dan masukkan 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),
];
- Atur Environment Variables: Perhatikan bahwa kita menggunakan
env()
untuk mengambil nilai konfigurasi dari environment variables. Buka file.env
di direktori proyek Anda dan tambahkan atau sesuaikan baris berikut:
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 # Ubah menjadi 'true' jika sudah di mode Production
MIDTRANS_IS_SANITIZED=true
MIDTRANS_IS_3DS=true
Ganti YOUR_MIDTRANS_MERCHANT_ID
, YOUR_MIDTRANS_CLIENT_KEY
, dan YOUR_MIDTRANS_SERVER_KEY
dengan nilai yang sesuai dengan akun Midtrans Anda. Pastikan juga untuk mengatur MIDTRANS_IS_PRODUCTION
ke true
jika Anda sudah siap untuk menerima pembayaran real.
Penjelasan Konfigurasi:
merchant_id
: ID Merchant Anda di Midtrans.client_key
: Client Key yang Anda dapatkan dari dashboard Midtrans.server_key
: Server Key yang Anda dapatkan dari dashboard Midtrans.is_production
: Menentukan apakah Anda menggunakan environment Production (true) atau Sandbox (false).is_sanitized
: Menentukan apakah data yang dikirim ke Midtrans perlu disanitasi.is_3ds
: Menentukan apakah transaksi perlu menggunakan 3D Secure (Verified by Visa, MasterCard SecureCode).
5. Membuat Controller untuk Memproses Pembayaran dengan Midtrans
Sekarang kita akan membuat sebuah controller untuk menangani logika pembayaran dengan Midtrans. Controller ini akan bertugas untuk membuat transaksi, mendapatkan token pembayaran, dan memproses notifikasi dari Midtrans.
- Buat Controller: Gunakan Artisan, command-line interface Laravel, untuk membuat controller baru. Jalankan perintah berikut di terminal:
php artisan make:controller PaymentController
- Edit Controller: Buka file
PaymentController.php
yang baru saja dibuat di direktoriapp/Http/Controllers/
dan masukkan kode berikut:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use MidtransConfig;
use MidtransSnap;
use MidtransNotification;
class PaymentController 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 dari request (misalnya, dari form)
$transactionDetails = [
'order_id' => 'ORDER-' . uniqid(), // Generate ID pesanan unik
'gross_amount' => $request->input('amount'), // Jumlah pembayaran
];
// Data customer (opsional)
$customerDetails = [
'first_name' => $request->input('first_name'),
'last_name' => $request->input('last_name'),
'email' => $request->input('email'),
'phone' => $request->input('phone'),
];
// Parameters untuk Snap API
$params = [
'transaction_details' => $transactionDetails,
'customer_details' => $customerDetails,
];
try {
// Dapatkan Snap Token dari Midtrans
$snapToken = Snap::getSnapToken($params);
// Kirim Snap Token ke View
return view('payment', ['snapToken' => $snapToken, 'clientKey' => config('midtrans.client_key')]);
} catch (Exception $e) {
// Tangani error
return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
}
}
public function handleNotification(Request $request)
{
$notification = new Notification();
$transaction = $notification->transaction_status;
$fraud = $notification->fraud_status;
$order_id = $notification->order_id;
// Sample logic to handle different transaction status
if ($transaction == 'capture') {
if ($fraud == 'challenge') {
// TODO set payment status in merchant's database to 'challenge'
} else if ($fraud == 'accept') {
// TODO set payment status in merchant's database to 'success'
}
} else if ($transaction == 'settlement') {
// TODO set payment status in merchant's database to 'success'
} else if ($transaction == 'pending') {
// TODO set payment status in merchant's database to 'pending'
} else if ($transaction == 'deny') {
// TODO set payment status in merchant's database to 'failed'
} else if ($transaction == 'expire') {
// TODO set payment status in merchant's database to 'expired'
} else if ($transaction == 'cancel') {
// TODO set payment status in merchant's database to 'failed'
}
// Log notification
Log::info('Midtrans Notification: ' . json_encode($request->all()));
return response('OK', 200);
}
}
Penjelasan Kode:
__construct()
: Konstruktor controller. Menginisialisasi konfigurasi Midtrans menggunakan nilai dari file konfigurasi yang telah kita buat sebelumnya.createTransaction(Request $request)
: Fungsi ini menerima data transaksi dari request (misalnya, dari form), membuat parameter yang dibutuhkan oleh Snap API Midtrans, mendapatkan Snap Token, dan mengirimkannya ke viewpayment.blade.php
. Snap Token ini akan digunakan untuk menampilkan form pembayaran Midtrans di halaman website Anda.handleNotification(Request $request)
: Fungsi ini menerima notifikasi dari Midtrans setelah transaksi selesai diproses. Anda perlu mengimplementasikan logika untuk memproses notifikasi ini dan memperbarui status pembayaran di database Anda.
Penting: Kode di atas adalah contoh dasar. Anda perlu menyesuaikannya dengan kebutuhan aplikasi Anda, terutama pada bagian handleNotification()
, di mana Anda perlu mengimplementasikan logika untuk memperbarui status pembayaran di database Anda berdasarkan status transaksi yang diterima dari Midtrans.
6. Membuat View untuk Menampilkan Form Pembayaran Midtrans (Snap)
Selanjutnya, kita akan membuat view untuk menampilkan form pembayaran Midtrans menggunakan Snap. Snap adalah solusi payment popup dari Midtrans yang memungkinkan pelanggan Anda untuk memilih metode pembayaran dan menyelesaikan transaksi dengan mudah di halaman website Anda.
- Buat File View: Buat file baru bernama
payment.blade.php
di dalam direktoriresources/views/
. - Masukkan Kode Berikut: Buka file
payment.blade.php
dan masukkan kode berikut:
<!DOCTYPE html>
<html>
<head>
<title>Pembayaran dengan Midtrans</title>
<script src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key="{{ $clientKey }}"></script>
</head>
<body>
<h1>Pembayaran</h1>
<p>Silakan selesaikan pembayaran Anda dengan Midtrans.</p>
<button id="pay-button">Bayar Sekarang</button>
<script type="text/javascript">
document.getElementById('pay-button').onclick = function(){
// SnapToken acquired from previous step
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 sebelum menyelesaikan pembayaran.');
}
});
};
</script>
</body>
</html>
Penjelasan Kode:
<script src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key="{{ $clientKey }}"></script>
: Kode ini menyertakan library Snap dari Midtrans dan mengatur Client Key yang telah kita konfigurasi sebelumnya. Perhatikan bahwa kita menggunakanapp.sandbox.midtrans.com
untuk environment Sandbox. Jika Anda menggunakan environment Production, ganti URL tersebut denganapp.midtrans.com
.<button id="pay-button">Bayar Sekarang</button>
: Tombol ini akan memicu fungsisnap.pay()
ketika diklik.snap.pay('{{ $snapToken }}', { ... })
: Fungsi ini menampilkan form pembayaran Midtrans (Snap) di halaman website Anda. Snap Token didapatkan dari controllerPaymentController.php
.onSuccess
,onPending
,onError
,onClose
: Fungsi-fungsi ini adalah callback yang akan dipanggil ketika pembayaran berhasil, menunggu pembayaran, gagal, atau jendela pembayaran ditutup. Anda dapat mengimplementasikan logika yang sesuai di dalam fungsi-fungsi ini, seperti menampilkan pesan sukses atau error, mengalihkan pengguna ke halaman lain, atau memperbarui status pembayaran di database Anda.
7. Menambahkan Routes untuk Mengakses Controller dan Menangani Notifikasi
Setelah membuat controller dan view, kita perlu menambahkan routes untuk mengakses controller dan menangani notifikasi dari Midtrans.
- Buka File
routes/web.php
: Buka fileroutes/web.php
di direktoriroutes/
. - Tambahkan Routes Berikut: Tambahkan baris kode berikut untuk mendefinisikan routes:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersPaymentController;
Route::get('/payment', function () {
return view('payment_form'); // Asumsi Anda memiliki form untuk input data pembayaran
});
Route::post('/payment/process', [PaymentController::class, 'createTransaction'])->name('payment.process');
Route::post('/payment/notification', [PaymentController::class, 'handleNotification'])->name('payment.notification');
Penjelasan Kode:
Route::get('/payment', function () { ... });
: Route ini menampilkan viewpayment_form
(kita akan membuat view ini di langkah selanjutnya) yang berisi form untuk menginput data pembayaran (jumlah pembayaran, nama, email, dll.).Route::post('/payment/process', [PaymentController::class, 'createTransaction'])->name('payment.process');
: Route ini menerima data pembayaran dari form dan mengirimkannya ke fungsicreateTransaction()
di controllerPaymentController
untuk memproses pembayaran dengan Midtrans.Route::post('/payment/notification', [PaymentController::class, 'handleNotification'])->name('payment.notification');
: Route ini menerima notifikasi dari Midtrans setelah transaksi selesai diproses. Penting untuk mengamankan endpoint ini, misalnya dengan memverifikasi signature dari Midtrans.
8. Membuat Form untuk Menginput Data Pembayaran
Sebelum memproses pembayaran, kita membutuhkan form untuk menginput data pembayaran, seperti jumlah pembayaran, nama, email, dan nomor telepon. Buat file view payment_form.blade.php
di dalam direktori resources/views/
dan masukkan kode berikut:
<!DOCTYPE html>
<html>
<head>
<title>Form Pembayaran</title>
</head>
<body>
<h1>Form Pembayaran</h1>
@if (session('error'))
<div style="color: red;">{{ session('error') }}</div>
@endif
<form action="{{ route('payment.process') }}" method="POST">
@csrf
<div>
<label for="amount">Jumlah Pembayaran:</label>
<input type="number" name="amount" id="amount" required>
</div>
<div>
<label for="first_name">Nama Depan:</label>
<input type="text" name="first_name" id="first_name" required>
</div>
<div>
<label for="last_name">Nama Belakang:</label>
<input type="text" name="last_name" id="last_name">
</div>
<div>
<label for="email">Email:</label>
<input type="email" name="email" id="email" required>
</div>
<div>
<label for="phone">Nomor Telepon:</label>
<input type="text" name="phone" id="phone" required>
</div>
<button type="submit">Bayar</button>
</form>
</body>
</html>
Form ini akan mengirimkan data ke route payment.process
yang kemudian akan diproses oleh controller PaymentController
.
9. Menguji Integrasi Midtrans dengan Laravel: Transaksi Sandbox
Setelah semua langkah di atas selesai, saatnya menguji integrasi Payment Gateway Midtrans dengan Laravel Anda. Karena kita masih berada dalam mode Sandbox, semua transaksi akan bersifat simulasi dan tidak melibatkan uang real.
- Buka Halaman Pembayaran: Buka halaman
/payment
di browser Anda. Anda akan melihat form pembayaran. - Isi Form dan Kirim: Isi form dengan data yang valid dan klik tombol “Bayar”.
- Periksa Halaman Pembayaran Midtrans: Anda akan dialihkan ke halaman pembayaran Midtrans (Snap). Pilih metode pembayaran yang Anda inginkan dan ikuti instruksi yang diberikan.
- Periksa Dashboard Midtrans: Setelah transaksi selesai, periksa dashboard Midtrans Anda. Anda akan melihat detail transaksi yang baru saja Anda lakukan.
- Periksa Log Notifikasi: Periksa log aplikasi Laravel Anda untuk memastikan notifikasi dari Midtrans diterima dan diproses dengan benar.
Jika semua berjalan lancar, selamat! Anda telah berhasil mengintegrasikan Midtrans dengan Laravel.
10. Pindah ke Mode Production: Menerima Pembayaran Real
Setelah Anda yakin bahwa integrasi Midtrans dengan Laravel Anda berfungsi dengan baik di mode Sandbox, Anda bisa pindah ke mode Production untuk mulai menerima pembayaran real.
- Pastikan Akun Midtrans Sudah Aktif: Pastikan akun Midtrans Anda sudah diverifikasi dan aktif untuk menerima pembayaran.
- Ubah
MIDTRANS_IS_PRODUCTION
: Ubah nilaiMIDTRANS_IS_PRODUCTION
di file.env
menjaditrue
. - Ganti URL Snap: Ganti URL Snap di file
payment.blade.php
darihttps://app.sandbox.midtrans.com/snap/snap.js
menjadihttps://app.midtrans.com/snap/snap.js
. - Uji Coba dengan Transaksi Kecil: Lakukan uji coba dengan transaksi kecil untuk memastikan semuanya berjalan dengan lancar di mode Production.
Peringatan: Pastikan Anda telah memahami semua persyaratan dan ketentuan Midtrans sebelum pindah ke mode Production.
11. Tips Tambahan untuk Optimasi dan Keamanan Integrasi Midtrans
Berikut beberapa tips tambahan untuk mengoptimalkan dan mengamankan integrasi Payment Gateway Midtrans dengan Laravel Anda:
- Amankan Endpoint Notifikasi: Verifikasi signature notifikasi dari Midtrans untuk memastikan notifikasi yang Anda terima benar-benar berasal dari Midtrans dan bukan dari pihak yang tidak berwenang.
- Gunakan HTTPS: Pastikan website Anda menggunakan HTTPS untuk mengenkripsi semua komunikasi antara browser dan server Anda, termasuk data pembayaran.
- Validasi Data Input: Validasi semua data input dari form pembayaran untuk mencegah serangan SQL injection dan cross-site scripting (XSS).
- Log Semua Transaksi: Log semua transaksi yang terjadi di website Anda untuk keperluan audit dan troubleshooting.
- Monitor Transaksi Secara Berkala: Monitor transaksi secara berkala untuk mendeteksi aktivitas mencurigakan dan mencegah fraud.
- Update Library Midtrans Secara Teratur: Selalu gunakan versi terbaru library Midtrans untuk mendapatkan perbaikan bug dan fitur keamanan terbaru.
12. Kesimpulan: Mempermudah Bisnis Anda dengan Integrasi Midtrans dan Laravel
Dengan mengintegrasikan Payment Gateway Midtrans dengan Laravel, Anda telah mengambil langkah besar untuk mempermudah pembayaran online di website Anda. Proses pembayaran menjadi lebih cepat, aman, dan efisien, sehingga meningkatkan kepuasan pelanggan dan potensi pertumbuhan bisnis Anda.
Artikel ini memberikan panduan langkah demi langkah, mulai dari persiapan awal hingga pengujian integrasi. Ingatlah untuk selalu mengutamakan keamanan dan mengikuti praktik terbaik dalam pengembangan website untuk memastikan pengalaman pembayaran yang aman dan nyaman bagi pelanggan Anda. Selamat mencoba dan semoga sukses!