Perbandingan · Terbit
Mode tes lebih dulu atau langsung live dengan nominal kecil: jatah sepuluh permintaan seumur akun yang tidak pernah reset, QR dan nomor Virtual Account mode tes yang memang sengaja dibuat tidak bisa dibayar, dan endpoint webhook live yang bukan endpoint yang sudah diuji
Sebuah integrasi baru punya dua titik mulai yang sama-sama masuk akal. Yang pertama: ambil kunci kp_test_, bangun seluruh alur di Sandbox, pindah ke live setelah semuanya berjalan. Yang kedua: ambil kunci live sejak awal, terbitkan tagihan Rp 1.000, bayar sendiri lewat dompet digital, lihat uangnya benar-benar masuk. Keduanya lazim, dan pilihannya hampir tidak pernah dibuat dengan sengaja, melainkan mengikuti kunci mana yang kebetulan tersalin lebih dulu.
Yang membuat pilihan ini layak dipikirkan sebentar adalah bahwa keduanya menyembunyikan hal yang berbeda. Mode tes tidak akan pernah menunjukkan pembayaran yang sungguhan berpindah. Live dengan nominal kecil menghabiskan sesuatu yang tidak bisa diisi ulang.
Yang benar-benar terpisah antara kedua mode
Pemisahannya lebih dalam daripada sekadar penanda pada objek. Mode kunci menentukan mode segala yang dibuatnya, tanpa satu field pun yang perlu diisi.
| Yang dipisah | Bentuk pemisahannya |
|---|---|
| Kunci API | Satu kunci aktif per mode, berawalan kp_test_ dan kp_live_, dirotasi dan dicabut sendiri-sendiri |
| Jangkauan baca | Kunci test tidak akan pernah bisa mengambil atau mendaftar objek live, dan sebaliknya |
| Endpoint webhook | Endpoint terpisah per mode, diatur di mode dasbor masing-masing |
| Signing secret | Secret sendiri per endpoint, jadi secret test tidak pernah dipakai di live |
| Ruang nama kunci idempotensi | Terpisah, sehingga kunci yang sudah terpakai di tes masih segar di live |
| Penanda pada objek | livemode pada setiap respons dan setiap webhook |
Pemisahan kunci idempotensi adalah satu-satunya baris di tabel itu yang bisa menggigit justru karena benar. Integrasi yang menurunkan kunci idempotensi dari nomor pesanan akan memakai ulang nomor yang sama setelah berpindah mode, dan hasilnya benar: pembayaran live yang baru, bukan replay dari pembayaran tes. Perilaku ini sengaja, dan perincian header-nya ada di dokumentasi idempotency.
Yang tidak akan pernah bisa ditunjukkan mode tes
Halaman checkout pembayaran mode tes membawa badge test, dan yang diberikannya ke pembeli sengaja dibuat mentah: QR yang ditolak semua dompet digital, dan nomor Virtual Account yang tidak bisa ditransfer. Itu keputusan yang benar, karena tidak ada satu pun bagian dari pembayaran tes yang boleh bisa dibayar. Tetapi akibatnya, tiga hal berikut tetap belum teruji setelah seluruh alur Sandbox hijau:
- Pengalaman pembeli yang sungguhan. Aplikasi dompet yang membaca QR, aplikasi bank yang menerima nomor Virtual Account, dan layar konfirmasi di sisi pembeli tidak pernah ikut dilewati.
- Jalur uangnya. Pembayaran tes dikecualikan dari pencairan, saldo, laporan pendapatan, dan rekonsiliasi. Angka yang muncul di halaman saldo setelah pembayaran pertama yang sungguhan karena itu belum pernah dilihat siapa pun.
- Pemberitahuan ke manusia. Pembayaran tes tidak pernah mengirim surel atau notifikasi ke pembeli maupun ke merchant. Hanya webhook developer yang terkirim, jadi rantai pemberitahuan yang dipakai staf belum pernah dibunyikan sekalipun.
Yang tidak bisa diulang kalau latihannya dikerjakan di live
Akun yang belum selesai verifikasi punya jatah seumur akun, bukan jatah harian, dan jatah itu tidak pernah reset. Dua macam, dan keduanya berperilaku berbeda terhadap tagihan yang tidak jadi dibayar:
| Jatah | Besarnya | Yang terjadi pada tagihan yang tidak dibayar |
|---|---|---|
| Jumlah permintaan | 10 permintaan | Yang canceled tidak dihitung; yang expired dan failed tetap dihitung |
| Total nominal | Rp 1.000.000 | Hanya pending dan succeeded yang dihitung, jadi yang kedaluwarsa atau dibatalkan melepaskan jatahnya kembali |
Baris pertama adalah biayanya. Sepuluh percobaan integrasi yang dibiarkan lewat jam menghabiskan seluruh jatah jumlah secara permanen, dan yang menabraknya kemudian adalah pembeli sungguhan yang pertama. Latihan yang dikerjakan di live karena itu sebaiknya ditutup dengan pembatalan, bukan dibiarkan kedaluwarsa, selama verifikasi belum beres. Perinciannya ada di dokumentasi batas dan jatah.
Biaya kedua lebih sunyi: setiap create di live adalah baris sungguhan yang ikut terbawa ke laporan penjualan dan ke rekonsiliasi. Uji coba Rp 1.000 yang berhasil adalah pendapatan Rp 1.000 yang harus dijelaskan pada penutupan bulan.
Yang hanya ada di mode tes
Sebagai gantinya, mode tes memberi dua hal yang tidak punya padanan di live. Yang pertama adalah kendali penuh atas hasil pembayaran. Pembayaran tes tidak pernah lunas sendiri: ambil token dari checkout_url, yaitu bagian setelah /p/, lalu kirim hasil yang diinginkan.
curl -X POST https://pay.kasera.id/api/v1/checkout/{token}/simulate-payment \
-H "Content-Type: application/json" \
-d '{ "outcome": "succeeded" }'Body kosong berarti succeeded, expired juga diterima, dan nilai lain ditolak 422 invalid_outcome. Endpoint ini diotorisasi oleh token checkout itu sendiri, tanpa kunci API, dan menjawab 404 kalau dipanggil pada pembayaran live. Artinya skenario yang di live harus ditunggu satu jam, yaitu tagihan kedaluwarsa, bisa dibuat dalam satu detik.
Yang kedua menyangkut pengembangan lokal: create di mode live mewajibkan return_url berskema https, sedangkan kunci test menerima http juga. Toko yang masih berjalan di http://localhost:3000 karena itu bisa mengembangkan alur kepulangan pembeli secara utuh tanpa menyiapkan sertifikat lebih dulu. Kelonggaran ini hanya berlaku untuk return_url pada create, dan URL endpoint webhook tidak ikut dilonggarkan, yang penanganannya dibahas di artikel tentang menguji webhook dari localhost.
Rekomendasi per keadaan
| Keadaan | Mulai dari | Sebabnya |
|---|---|---|
| Integrasi berwebhook, akun belum terverifikasi | Mode tes | Jatah sepuluh permintaan habis oleh percobaan, dan yang kedaluwarsa tidak mengembalikannya |
| Perlu menguji jalur kedaluwarsa dan penanganan gagal | Mode tes | Hasil pembayaran hanya bisa ditentukan di mode tes |
| Pengembangan di localhost tanpa sertifikat | Mode tes | return_url berskema http hanya diterima kunci test |
| Tanpa kode, hanya memakai tautan pembayaran | Live, nominal kecil | Tidak ada kode yang perlu diuji, dan yang ingin dilihat justru layar pembeli yang sungguhan |
| Sandbox sudah hijau, sebelum penjualan diumumkan | Live, satu transaksi, lalu dibatalkan atau dibayar sendiri | Pengalaman pembeli, jalur uang, dan rantai pemberitahuan hanya ada di live |
Jadi jawabannya untuk integrasi yang menulis kode bukan salah satu, melainkan urutan: mode tes sampai seluruh cabang kode pernah dijalankan, lalu tepat satu transaksi live sungguhan sebagai pemeriksaan terakhir. Daftar periksa lengkap sebelum penjualan diumumkan ada di panduan checklist sebelum go-live.
Perpindahannya sendiri, dan satu kejutan yang bentuknya selalu sama
Berpindah ke live berarti menukar kp_test_ dengan kp_live_, dan pada sisi pemanggilan API tidak ada lagi yang berubah. Yang berubah ada di luar kode, dan selalu berbentuk sama: endpoint webhook live adalah endpoint yang berbeda, dengan signing secret yang berbeda, dan URL-nya bukan lagi alamat tunnel yang dipakai selama pengujian. Integrasi yang lupa memasangnya akan melihat pembayaran live pertamanya berhasil di dasbor sementara sistemnya sendiri tidak pernah diberi tahu.
Satu kebiasaan yang menutup celah itu: sebelum kunci live dipakai, pasang endpoint mode live lebih dulu dan simpan secret-nya, meski URL-nya belum final. Endpoint boleh ditambahkan tanpa URL, dan secret-nya langsung bisa dibaca. Seluruh langkah mode tes ada di dokumentasi mode tes, dan perbandingan pemicu pemenuhan pesanan yang menentukan bentuk handler-nya ada di perbandingan webhook dan halaman kembali sebagai pemicu.
Pertanyaan yang sering muncul
Apakah pembayaran mode tes memakai jatah sebelum verifikasi?
Tidak. Create dengan kunci test tidak memakai jatah itu dan tidak juga ditolak olehnya. Pembayaran mode tes dikecualikan dari seluruh alur uang: pencairan, saldo, laporan pendapatan, dan rekonsiliasi. Itulah perbedaan biaya terbesar antara berlatih di Sandbox dan berlatih di live pada akun yang belum selesai verifikasi.
Apakah QR mode tes bisa dibayar kalau dipindai sungguhan?
Tidak, dan memang seharusnya begitu. Halaman checkout pembayaran mode tes menampilkan badge test, dan yang diberikan ke pembeli sengaja berupa data mentah yang tidak bisa dipakai: QR yang ditolak semua dompet digital, dan nomor Virtual Account yang tidak bisa ditransfer. Hasil pembayarannya ditentukan lewat endpoint simulasi, bukan lewat pembayaran sungguhan.
Apakah kunci idempotensi yang sudah dipakai selama pengujian jadi terbakar di live?
Tidak. Kedua mode tidak berbagi ruang nama pembayaran, termasuk kunci idempotensi, jadi kunci yang sudah dipakai di mode tes masih terhitung baru di mode live. Request live pertama membuat pembayaran live, bukan replay dari yang tes. Ini penting untuk integrasi yang menurunkan kunci idempotensi dari nomor pesanan, karena nomor pesanan yang sama akan muncul lagi setelah berpindah mode.
Apakah pindah ke live menuntut perubahan kode?
Awalan kunci ditukar dari kp_test_ menjadi kp_live_, dan selain itu tidak ada yang berubah pada pemanggilan API. Yang berubah di luar kode adalah konfigurasinya: endpoint webhook live adalah endpoint yang berbeda dengan signing secret yang berbeda, dan URL-nya bukan lagi alamat tunnel. Endpoint mode tes tidak ikut terbawa.
Apakah satu akun bisa punya kunci live dan kunci test bersamaan?
Bisa, satu kunci aktif per mode. Dasbor menampilkan satu environment dalam satu waktu, jadi kunci test terlihat saat mode dasbor diatur ke Sandbox dan kunci live saat diatur ke Live. Setiap kunci hanya melihat mode-nya sendiri: kunci test tidak akan pernah bisa mengambil atau mendaftar permintaan pembayaran live, dan sebaliknya.