Di era digital ini, memiliki toko online atau aplikasi yang menerima pembayaran online menjadi kebutuhan mutlak. Keamanan dan kemudahan transaksi adalah dua faktor penting yang memengaruhi kepercayaan pelanggan dan kesuksesan bisnis Anda. Nah, bagaimana caranya mengintegrasikan sistem pembayaran yang aman dan mudah ke dalam aplikasi Laravel Anda? Jawabannya adalah dengan Integrasi Payment Gateway Midtrans dengan Laravel!
Artikel ini akan memandu Anda langkah demi langkah dalam mengintegrasikan Midtrans, salah satu payment gateway terpopuler di Indonesia, ke dalam aplikasi Laravel Anda. Kita akan membahas mulai dari persiapan awal, instalasi, konfigurasi, hingga implementasi kode yang lengkap. Mari kita mulai!
1. Mengapa Memilih Integrasi Midtrans untuk Aplikasi Laravel Anda?
Sebelum kita membahas lebih dalam tentang cara integrasinya, mari kita pahami terlebih dahulu mengapa Midtrans menjadi pilihan yang tepat untuk aplikasi Laravel Anda. Ada beberapa alasan utama:
- Keamanan Terjamin: Midtrans telah tersertifikasi PCI DSS (Payment Card Industry Data Security Standard), standar keamanan tertinggi untuk industri pembayaran. Ini memastikan data pelanggan Anda aman dan terlindungi.
- 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, ShopeePay), hingga pembayaran di gerai retail (Indomaret, Alfamart). Hal ini memberikan fleksibilitas kepada pelanggan Anda dalam memilih metode pembayaran yang paling nyaman.
- Mudah Diintegrasikan: Midtrans menyediakan dokumentasi yang lengkap dan API (Application Programming Interface) yang mudah digunakan. Proses integrasi dengan Laravel pun relatif sederhana, apalagi dengan adanya library atau package yang tersedia.
- Dashboard yang Informatif: Midtrans menyediakan dashboard yang lengkap untuk memantau transaksi, melihat laporan keuangan, dan mengelola akun Anda.
- Reputasi Terpercaya: Midtrans telah dipercaya oleh ribuan bisnis di Indonesia, dari startup hingga perusahaan besar.
Dengan Integrasi Payment Gateway Midtrans dengan Laravel, Anda dapat memberikan pengalaman transaksi online yang aman, mudah, dan nyaman bagi pelanggan Anda.
2. Persiapan Awal: Membuat Akun Midtrans dan Mendapatkan API Keys
Sebelum memulai proses integrasi, Anda perlu memiliki akun Midtrans dan mendapatkan API keys. Berikut langkah-langkahnya:
- Daftar Akun Midtrans: Kunjungi website Midtrans (https://midtrans.com/) dan daftarkan akun bisnis Anda. Pilih paket yang sesuai dengan kebutuhan Anda. Biasanya terdapat opsi “Sandbox” untuk pengujian dan “Production” untuk lingkungan live.
- Aktivasi Akun: Ikuti instruksi verifikasi yang diberikan oleh Midtrans untuk mengaktifkan akun Anda.
- Dapatkan API Keys: Setelah akun aktif, login ke dashboard Midtrans Anda. Cari bagian “Settings” atau “Konfigurasi”. Di sana, Anda akan menemukan API keys Anda:
- Client Key: Digunakan untuk inisiasi transaksi dari sisi client (browser atau aplikasi mobile).
- Server Key: Digunakan untuk otorisasi dan verifikasi transaksi dari sisi server (aplikasi Laravel Anda).
Penting: Simpan API keys Anda dengan aman. Jangan pernah membagikannya kepada pihak yang tidak berwenang. Gunakan variabel lingkungan (.env) untuk menyimpan API keys dan jangan memasukkannya langsung ke dalam kode Anda.
3. Instalasi Library Midtrans untuk Laravel: Menggunakan Composer
Setelah memiliki API keys, langkah selanjutnya adalah menginstal library Midtrans untuk Laravel. Library ini akan memudahkan Anda dalam berinteraksi dengan API Midtrans.
Buka terminal atau command prompt Anda, navigasikan ke direktori proyek Laravel Anda, dan jalankan perintah berikut menggunakan Composer:
composer require midtrans/midtrans-php
Perintah ini akan mengunduh dan menginstal library Midtrans ke dalam proyek Laravel Anda. Tunggu hingga proses instalasi selesai.
4. Konfigurasi Midtrans di Laravel: Menggunakan Variabel Lingkungan (.env)
Setelah library Midtrans terinstal, Anda perlu mengkonfigurasi pengaturan Midtrans di aplikasi Laravel Anda. Gunakan file .env untuk menyimpan konfigurasi ini.
Buka file .env Anda dan tambahkan konfigurasi berikut:
MIDTRANS_CLIENT_KEY=YOUR_MIDTRANS_CLIENT_KEY
MIDTRANS_SERVER_KEY=YOUR_MIDTRANS_SERVER_KEY
MIDTRANS_IS_PRODUCTION=false # Ubah menjadi 'true' jika berada di environment production
Ganti YOUR_MIDTRANS_CLIENT_KEY dan YOUR_MIDTRANS_SERVER_KEY dengan API keys yang Anda dapatkan dari dashboard Midtrans. MIDTRANS_IS_PRODUCTION menunjukkan apakah aplikasi Anda berada di lingkungan production (live) atau development (sandbox). Atur ke true jika aplikasi Anda sudah live.
Selanjutnya, buat file konfigurasi config/midtrans.php:
<?php
return [
'client_key' => env('MIDTRANS_CLIENT_KEY'),
'server_key' => env('MIDTRANS_SERVER_KEY'),
'is_production' => env('MIDTRANS_IS_PRODUCTION', false),
'is_sanitized' => true,
'is_3ds' => true,
];
File konfigurasi ini akan membaca nilai konfigurasi dari file .env.
5. Membuat Model dan Migration untuk Transaksi: Menyimpan Data Pembayaran
Selanjutnya, kita perlu membuat model dan migration untuk menyimpan data transaksi. Ini akan memungkinkan kita untuk melacak status pembayaran, menyimpan informasi pelanggan, dan melakukan analisis transaksi.
Buat model Transaction menggunakan perintah berikut:
php artisan make:model Transaction
Kemudian, buat migration untuk model Transaction:
php artisan make:migration create_transactions_table
Buka file migration yang baru dibuat (biasanya terletak di database/migrations) dan definisikan skema tabel transaksi. Contoh:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreateTransactionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('transactions', function (Blueprint $table) {
$table->id();
$table->string('order_id')->unique();
$table->unsignedBigInteger('user_id')->nullable(); // Contoh jika ingin menghubungkan dengan user
$table->decimal('amount', 15, 2);
$table->string('payment_method')->nullable();
$table->string('transaction_status')->nullable();
$table->json('midtrans_response')->nullable(); // Menyimpan response lengkap dari Midtrans
$table->timestamps();
// Jika ingin menambahkan foreign key ke tabel users:
// $table->foreign('user_id')->references('id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('transactions');
}
}
Pastikan untuk menyesuaikan skema tabel dengan kebutuhan aplikasi Anda. Setelah selesai, jalankan migration:
php artisan migrate
Ini akan membuat tabel transactions di database Anda.
6. Implementasi Kode: Membuat Fungsi untuk Inisiasi Transaksi
Sekarang, mari kita implementasikan kode untuk melakukan inisiasi transaksi menggunakan library Midtrans. Buat sebuah controller (misalnya PaymentController) untuk menangani logika pembayaran.
php artisan make:controller PaymentController
Buka app/Http/Controllers/PaymentController.php dan tambahkan kode berikut:
<?php
namespace AppHttpControllers;
use AppModelsTransaction;
use IlluminateHttpRequest;
use MidtransConfig;
use MidtransSnap;
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 generateSnapToken(Request $request)
{
// Validasi data dari request
$request->validate([
'amount' => 'required|numeric|min:1',
'order_id' => 'required|string|unique:transactions,order_id', // Pastikan order_id unik
]);
$params = array(
'transaction_details' => array(
'order_id' => $request->order_id,
'gross_amount' => $request->amount,
),
'customer_details' => array( // Optional, sesuaikan dengan data customer Anda
'first_name' => 'John', // Ganti dengan data customer
'last_name' => 'Doe', // Ganti dengan data customer
'email' => '[email protected]', // Ganti dengan data customer
'phone' => '081234567890', // Ganti dengan data customer
),
);
try {
// Get Snap Token
$snapToken = Snap::getSnapToken($params);
// Simpan data transaksi ke database
$transaction = new Transaction();
$transaction->order_id = $request->order_id;
$transaction->amount = $request->amount;
// Tambahkan data lain sesuai kebutuhan
$transaction->save();
return response()->json(['snap_token' => $snapToken, 'order_id' => $request->order_id]);
} catch (Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
}
Kode di atas berfungsi untuk:
- Mengatur Konfigurasi Midtrans: Pada constructor, konfigurasi Midtrans diatur berdasarkan nilai dari file
config/midtrans.php. - Memvalidasi Data: Data yang diterima dari request (seperti
amountdanorder_id) divalidasi. - Membuat Parameter Transaksi: Parameter yang dibutuhkan oleh Midtrans (seperti
order_id,gross_amount, dancustomer_details) dibuat. - Mendapatkan Snap Token: Fungsi
Snap::getSnapToken()digunakan untuk mendapatkan Snap Token dari Midtrans. Snap Token ini akan digunakan di sisi client untuk menampilkan UI pembayaran Midtrans. - Menyimpan Data Transaksi: Data transaksi disimpan ke database menggunakan model
Transaction. - Mengembalikan Respons: Snap Token dan
order_iddikembalikan sebagai respons JSON.
Penjelasan Tambahan:
order_idharus unik untuk setiap transaksi. Anda bisa menggunakan UUID atau kombinasi timestamp dan user ID.customer_detailsbersifat opsional. Anda bisa menambahkan informasi pelanggan jika diperlukan.- Pastikan untuk menangani error dengan baik (menggunakan
try-catch) dan mengembalikan respons yang sesuai.
7. Implementasi di Sisi Client: Menampilkan UI Pembayaran Midtrans
Setelah mendapatkan Snap Token dari server, Anda perlu menampilkannya di sisi client (browser atau aplikasi mobile). Anda bisa menggunakan JavaScript untuk melakukan ini.
Berikut contoh implementasi menggunakan JavaScript:
<!DOCTYPE html>
<html>
<head>
<title>Pembayaran dengan Midtrans</title>
<script src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key="{{ config('midtrans.client_key') }}"></script>
</head>
<body>
<h1>Halaman Pembayaran</h1>
<button id="pay-button">Bayar Sekarang</button>
<script type="text/javascript">
document.getElementById('pay-button').onclick = function(){
// Snap Token dari server
var snapToken = "{{ $snapToken }}"; // Ambil snapToken dari blade template
snap.pay(snapToken, {
onSuccess: function(result){
/* You may add your own implementation here
* e.g. show success message */
alert("Pembayaran Berhasil!"); console.log(result);
},
onPending: function(result){
/* You may add your own implementation here
* e.g. show loading indicator */
alert("Menunggu Pembayaran!"); console.log(result);
},
onError: function(result){
/* You may add your own implementation here
* e.g. show error message */
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:
- Include Snap.js: Script
snap.jsdari Midtrans di-include untuk menampilkan UI pembayaran. Pastikan menggunakanapp.sandbox.midtrans.comuntuk sandbox environment danapp.midtrans.comuntuk production environment. Client Key dari config juga di-include disini. - Tombol Pembayaran: Sebuah tombol dengan id
pay-buttondigunakan untuk memicu pembayaran. - Inisialisasi Snap: Saat tombol diklik, fungsi
snap.pay()dipanggil dengan Snap Token yang diterima dari server. - Callback Functions: Fungsi-fungsi
onSuccess,onPending,onError, danonClosedigunakan untuk menangani berbagai skenario pembayaran. Anda bisa menyesuaikan implementasi di dalam fungsi-fungsi ini sesuai dengan kebutuhan Anda. Contohnya memperbarui status transaksi di database.
8. Menangani Webhook dari Midtrans: Verifikasi Pembayaran dan Update Status Transaksi
Setelah pembayaran berhasil, Midtrans akan mengirimkan webhook ke aplikasi Anda. Webhook ini berisi informasi tentang status pembayaran dan perlu Anda verifikasi untuk memastikan pembayaran valid.
Buat sebuah route untuk menerima webhook dari Midtrans (misalnya /midtrans/callback).
Route::post('/midtrans/callback', [PaymentController::class, 'handleMidtransCallback']);
Kemudian, tambahkan fungsi handleMidtransCallback ke PaymentController:
public function handleMidtransCallback(Request $request)
{
$notif = new MidtransNotification();
$transaction = $notif->transaction_status;
$fraud = $notif->fraud_status;
$order_id = $notif->order_id;
$transactionData = Transaction::where('order_id', $order_id)->first();
if ($transaction == 'capture') {
// For credit card transaction, we need to check whether transaction is challenge by FDS or not
if ($fraud == 'challenge') {
// TODO set payment status in merchant's database to 'Challenge by FDS'
// TODO merchant should decide whether this transaction is authorized or not.
$transactionData->transaction_status = 'challenge';
} else {
// TODO set payment status in merchant's database to 'Success'
$transactionData->transaction_status = 'success';
}
} else if ($transaction == 'settlement') {
// TODO set payment status in merchant's database to 'Settlement'
$transactionData->transaction_status = 'settlement';
} else if ($transaction == 'pending') {
// TODO set payment status in merchant's database to 'Pending'
$transactionData->transaction_status = 'pending';
} else if ($transaction == 'deny') {
// TODO set payment status in merchant's database to 'Denied'
$transactionData->transaction_status = 'deny';
} else if ($transaction == 'expire') {
// TODO set payment status in merchant's database to 'Expire'
$transactionData->transaction_status = 'expire';
} else if ($transaction == 'cancel') {
// TODO set payment status in merchant's database to 'Cancelled'
$transactionData->transaction_status = 'cancel';
}
$transactionData->midtrans_response = json_encode($request->all());
$transactionData->save();
return response('OK', 200);
}
Penjelasan:
- Inisialisasi
MidtransNotification: KelasMidtransNotificationdigunakan untuk memproses data yang diterima dari webhook. - Ekstraksi Data: Data penting seperti
transaction_status,fraud_status, danorder_iddiekstrak dari data notifikasi. - Verifikasi Order ID: Order ID digunakan untuk mencari data transaksi yang sesuai di database.
- Update Status Transaksi: Berdasarkan
transaction_status, status transaksi di database diupdate. - Simpan Response Lengkap: Seluruh response dari Midtrans disimpan ke dalam kolom
midtrans_response. - Kembalikan Respons “OK”: Penting untuk mengembalikan respons “OK” (status code 200) kepada Midtrans untuk mengonfirmasi bahwa webhook telah diterima.
9. Keamanan Tambahan: Verifikasi Signature Key
Untuk meningkatkan keamanan, Anda bisa memverifikasi signature key yang dikirimkan oleh Midtrans melalui webhook. Ini akan memastikan bahwa data yang Anda terima benar-benar berasal dari Midtrans dan bukan dari pihak yang tidak berwenang.
Untuk memverifikasi signature key, Anda bisa menggunakan kode berikut di dalam fungsi handleMidtransCallback:
$signature_key = $request->input('signature_key');
$order_id = $request->input('order_id');
$gross_amount = $request->input('gross_amount');
$server_key = config('midtrans.server_key');
$string = $order_id . $gross_amount . $server_key;
$signature = hash('sha512', $string);
if ($signature_key != $signature) {
return response('Signature Invalid', 400); // Jika signature tidak valid, kembalikan error
}
Pastikan untuk menambahkan kode verifikasi signature key ini sebelum melakukan update status transaksi.
10. Uji Coba dan Debugging: Memastikan Integrasi Berjalan Lancar
Setelah menyelesaikan semua langkah di atas, penting untuk melakukan uji coba dan debugging untuk memastikan integrasi Midtrans dengan Laravel Anda berjalan lancar.
- Gunakan Sandbox Environment: Pastikan Anda menggunakan sandbox environment Midtrans selama proses pengujian.
- Lakukan Transaksi Uji Coba: Lakukan beberapa transaksi uji coba dengan berbagai metode pembayaran untuk memastikan semuanya berfungsi dengan baik.
- Periksa Log: Periksa log aplikasi Anda untuk melihat apakah ada error atau warning.
- Gunakan Debugging Tools: Gunakan debugging tools seperti Xdebug untuk membantu Anda mengidentifikasi dan memperbaiki masalah.
- Periksa Dashboard Midtrans: Periksa dashboard Midtrans untuk memantau transaksi dan memastikan webhook berfungsi dengan baik.
11. Deploy ke Production: Go Live dengan Sistem Pembayaran yang Aman dan Mudah
Setelah yakin bahwa integrasi Midtrans berjalan lancar di sandbox environment, Anda bisa melakukan deploy ke production environment.
- Ubah
MIDTRANS_IS_PRODUCTIONmenjaditrue: Pastikan Anda mengubah nilaiMIDTRANS_IS_PRODUCTIONdi file.envmenjaditrue. - Gunakan Production API Keys: Pastikan Anda menggunakan production API keys yang Anda dapatkan dari dashboard Midtrans.
- Uji Coba di Production: Lakukan beberapa transaksi uji coba di production environment untuk memastikan semuanya berfungsi dengan baik.
- Monitor Transaksi: Pantau transaksi secara berkala untuk memastikan tidak ada masalah.
Dengan mengikuti panduan ini, Anda telah berhasil melakukan Integrasi Payment Gateway Midtrans dengan Laravel: Transaksi Online Aman dan Mudah. Sekarang, Anda dapat menerima pembayaran online dengan aman dan mudah di aplikasi Laravel Anda!
12. Tips Tambahan untuk Optimasi dan Pengembangan Lebih Lanjut
Berikut beberapa tips tambahan untuk mengoptimalkan integrasi Midtrans Anda dan mengembangkan fitur-fitur pembayaran lebih lanjut:
- Personalisasi UI Pembayaran: Sesuaikan UI pembayaran Midtrans dengan branding aplikasi Anda untuk memberikan pengalaman yang lebih konsisten kepada pengguna.
- Implementasikan Fitur Refund: Implementasikan fitur refund untuk memungkinkan Anda mengembalikan dana kepada pelanggan jika diperlukan.
- Gunakan Fitur Recurring Payment: Jika Anda menawarkan layanan berlangganan, gunakan fitur recurring payment dari Midtrans untuk mempermudah proses pembayaran bulanan.
- Integrasikan dengan Sistem Akuntansi: Integrasikan data transaksi Midtrans dengan sistem akuntansi Anda untuk mempermudah pelaporan keuangan.
- Optimalkan Performa: Optimalkan performa kode Anda untuk memastikan proses pembayaran berjalan cepat dan lancar.
Dengan terus mengembangkan dan mengoptimalkan integrasi Midtrans Anda, Anda dapat memberikan pengalaman pembayaran online yang terbaik bagi pelanggan Anda dan meningkatkan kesuksesan bisnis Anda. Selamat mencoba!





