Mulai
Test mode
Test integrasi Anda tanpa memindahkan uang sungguhan.
API key test membuat permintaan pembayaran yang tampilan dan perilakunya sama seperti yang asli — field sama, biaya sama, webhook sama — tapi tidak ada uang sungguhan yang berpindah.
Test key
Selain key live, Anda bisa punya satu test key, berawalan kp_test_. Rotasi dan cabut di Pengaturan → Developer, persis seperti key live — satu key aktif per mode. Dashboard menampilkan satu environment dalam satu waktu: pindah ke Sandbox untuk melihat test key, Live untuk key live. Dipakai di header yang sama:
Authorization: Bearer kp_test_...
Mode key menentukan mode semua yang dibuatnya. Tidak ada field yang perlu diisi atau dikonfigurasi — create dengan kp_test_ menghasilkan objek test; create dengan kp_live_ menghasilkan objek live. Setiap key hanya bisa melihat mode-nya sendiri: test key tidak akan pernah bisa retrieve atau list permintaan pembayaran live, dan sebaliknya.
Objek test
Setiap response /v1 dan setiap webhook membawa livemode — false untuk objek test, true untuk yang live. Halaman checkout pembayaran test menampilkan badge test yang jelas, dan yang diberikan ke pembeli sengaja dibuat dummy yang tidak bisa dipakai: QR yang ditolak semua e-wallet, dan nomor Virtual Account yang tidak bisa ditransfer. Memang begitu seharusnya — pembayaran test tidak boleh bisa dibayar sungguhan.
curl https://pay.kasera.id/v1/transactions \
-H "Authorization: Bearer kp_test_..." \
-H "Idempotency-Key: test-order-1234" \
-H "Content-Type: application/json" \
-d '{ "amount": 150000, "description": "Kaos komunitas" }'Mengatur hasil pembayaran
Pembayaran test tidak pernah terkonfirmasi sendiri — Anda yang menentukan hasilnya. Ambil token dari checkout_url di response create (bagian setelah /p/) lalu kirim hasil yang Anda mau:
curl -X POST https://pay.kasera.id/api/v1/checkout/{token}/simulate-payment \
-H "Content-Type: application/json" \
-d '{ "outcome": "succeeded" }'curl -X POST https://pay.kasera.id/api/v1/checkout/{token}/simulate-payment \
-H "Content-Type: application/json" \
-d '{ "outcome": "expired" }'Body kosong berarti succeeded. Nilai lain ditolak 422 invalid_outcome. Endpoint ini diotorisasi oleh token checkout itu sendiri — tanpa API key. Kalau dipanggil untuk pembayaran live, jawabannya 404, sama seperti token yang tidak ada.
Kartu di test mode
Pembayaran kartu live me-redirect pembeli ke halaman kartu (payment.redirect_url), tempat mereka mengisi data kartu dan melewati 3-D Secure, lalu mengembalikannya ke Anda. Di test mode tidak ada yang sampai ke processor kartu, jadi redirect_url adalah halaman Kasera Pay Checkout untuk pembayaran itu, dan langkah kartunya berupa form kartu test: nomor, masa berlaku, CVV, nama — divalidasi di browser dan tidak pernah dikirim ke mana pun. Hanya test card di bawah yang diterima; tiap nomor menghasilkan satu hasil tertentu, jadi semua skenario bisa dicoba.
| Hasil | Mastercard | VISA |
|---|---|---|
| Lunas (3DS) | 5573 3810 1111 1101 | 4617 0069 1111 1106 |
| Lunas (tanpa 3DS) | 5573 3810 1111 1135 | 4617 0069 1111 1130 |
| Ditolak processor (3DS) | 5573 3810 1111 1119 | 4617 0069 1111 1114 |
| Ditolak processor (tanpa 3DS) | 5573 3810 1111 1200 | 4617 0069 1111 1213 |
| Ditolak bank (3DS) | 5573 3810 1111 1127 | 4617 0069 1111 1122 |
| Ditolak bank (tanpa 3DS) | 5573 3810 1111 1226 | 4617 0069 1111 1221 |
Masa berlaku 01/31 (bulan mana pun di masa depan bisa), CVV 123 (tiga digit apa pun), nama bebas. Kartu bertanda 3DS menampilkan langkah OTP dulu; kodenya tertulis di langkah itu (123456) dan hanya kode itu yang lolos. Kartu yang ditolak membuat pembayaran tetap pending dan pembeli boleh coba kartu lain — kartu yang ditolak bukan berarti pembayarannya gagal, baik di test mode maupun live.
Test card yang lunas memicu webhook payment.paid yang sama seperti kartu sungguhan, pembeli diteruskan ke return_url Anda, dan refund test lewat POST /v1/refunds berhasil tanpa menyentuh processor.
Webhook
Hasil succeeded memicu pengiriman payment.paid yang nyata dan ber-signature — ke endpoint test, dengan signing secret test. Endpoint live dan test terpisah dan diatur di mode dashboard masing-masing, jadi siapkan dulu endpoint test di mode Sandbox sebelum menunggu kiriman. Verifikasi signature-nya persis seperti event live.
Cek livemode sebelum memproses pesanan. Selain itu, event test sama persis dengan event live — dan memang itu tujuannya.
Yang tidak tersentuh test mode
Pembayaran test dikecualikan dari semua alur uang: pencairan, saldo Anda, laporan pendapatan, rekonsiliasi, dan jatah sebelum verifikasi — create test tidak memakai jatah itu dan tidak juga ditolak olehnya. Pembayaran test juga tidak pernah mengirim email atau push notification ke pembeli maupun merchant; hanya webhook developer yang terkirim.
Go live
Ganti kp_test_ dengan kp_live_. Tidak ada lagi yang berubah. Kedua mode tidak berbagi data pembayaran — termasuk idempotency key — jadi key yang dipakai integrasi Anda di test mode masih terhitung baru di mode live: request live pertama Anda membuat pembayaran live, bukan replay dari yang tes.