Integrasi Midtrans Snap: Bagian yang Tidak Ada di Dokumentasi
Membuat Snap token itu bagian mudahnya. Masalah muncul setelah pembayaran masuk.
1. Verifikasi signature itu wajib, bukan opsional
Endpoint webhook Anda terbuka ke internet. Tanpa verifikasi, siapa pun bisa mengirim POST berisi "status: settlement" dan mendapatkan produk gratis.
$expected = hash('sha512',
$payload['order_id']
. $payload['status_code']
. $payload['gross_amount']
. config('midtrans.server_key')
);
if (! hash_equals($expected, $payload['signature_key'])) {
abort(403);
}
Gunakan hash_equals, bukan ===, agar perbandingan berjalan dalam waktu konstan.
2. Cocokkan nominal dengan data Anda sendiri
Signature valid membuktikan payload datang dari Midtrans, tapi tetap bandingkan gross_amount dengan total order di database Anda sebelum meluluskan pesanan.
3. capture belum tentu lunas
Untuk kartu kredit, status capture harus dibaca bersama fraud_status. Hanya accept yang berarti lunas; challenge harus tetap pending sampai Anda memutuskan secara manual.
4. Webhook bisa datang berkali-kali
Midtrans mengirim ulang notifikasi kalau server Anda lambat merespons. Handler Anda harus idempoten: kalau order sudah berstatus lunas, langsung kembalikan 200 tanpa menerbitkan lisensi kedua.
5. Siapkan jaring pengaman rekonsiliasi
Webhook bisa gagal — server restart, deploy, atau jaringan. Jadwalkan perintah berkala yang memeriksa ulang status order pending langsung ke API Midtrans. Ini menyelamatkan pesanan yang kalau tidak akan hilang begitu saja.
Butuh implementasinya di bisnis Anda?
Kami bantu dari analisa sampai deployment.