Perbandingan · Terbit
Direct atau redirect: menggambar QR dan nomor Virtual Account di layar sendiri, melawan mengirim pembeli ke halaman checkout yang sudah jadi, dan jalan tengah yang jarang diketahui
Jawaban singkatnya: mulai dari redirect, dan pindah ke direct hanya kalau pembayaran memang harus terjadi di dalam layar yang dikendalikan sendiri, misalnya aplikasi ponsel, layar kasir, atau checkout toko yang sudah dirancang sampai ke piksel terakhir. Di Kasera Pay keduanya memakai endpoint, tarif, dan webhook yang sama. Yang berbeda hanya siapa yang membangun layar pembayarannya, dan pekerjaan itu lebih banyak daripada kelihatannya.
Istilah ini dibawa developer yang pindah dari gateway lain. Di Kasera Pay keduanya bukan dua produk, melainkan satu permintaan pembayaran yang dibaca dari sisi berbeda: redirect memakai checkout_url di respons, direct memakai object payment di respons yang sama.
Yang sama persis di kedua model
- Endpoint:
POST /v1/transactions, satu untuk semua metode. - Tarif per metode: QRIS 0,7% + Rp 250 dan Virtual Account Rp 5.000 per pembayaran berhasil, pencairan Rp 3.000 per pencairan, tanpa biaya bulanan. Mulai 26 Oktober 2026, pembayaran di atas Rp 1.000.000 kena 1% atas seluruh nominal untuk QRIS maupun Virtual Account, juga di kedua model.
- Pencegah tagihan ganda: hanya header
Idempotency-Key.external_idyang sama dikirim dua kali tetap menjadi dua permintaan. - Konfirmasi: webhook
payment.paidbertanda tangan di headerKasera-Signature-V1, dan statuspending,succeeded, atauexpiredyang bisa dibaca dari server. - Masa berlaku: 60 menit secara default, sampai 24 jam lewat
expires_in_minutes. - Metode yang aktif hari ini: QRIS dan Virtual Account di tujuh bank (BRI, BNI, Mandiri, Permata, CIMB Niaga, Danamon, Maybank), menurut daftar metode pembayaran.
Bentuk permintaannya
Direct meminta satu metode, lalu membaca payment.qr_string atau payment.payment_code dari respons:
curl https://pay.kasera.id/v1/transactions \
-H "Authorization: Bearer kp_live_..." \
-H "Idempotency-Key: order-1234" \
-H "Content-Type: application/json" \
-d '{
"amount": 150000,
"external_id": "ORD-1234",
"payment_methods": ["qris"]
}'
# Respons membawa object payment untuk digambar sendiri:
# "payment": { "type": "qr", "qr_string": "000201010212..." },
# "instructions": { "title": "Cara membayar dengan QRIS", "steps": [...] },
# "expires_at": "2026-08-27T13:00:00+07:00"Redirect tidak perlu tahu metodenya. Halaman checkout menawarkan semua metode yang aktif di akun, dan pembeli dibawa ke checkout_url:
curl https://pay.kasera.id/v1/transactions \
-H "Authorization: Bearer kp_live_..." \
-H "Idempotency-Key: order-1234" \
-H "Content-Type: application/json" \
-d '{
"amount": 150000,
"description": "Pesanan ORD-1234",
"external_id": "ORD-1234",
"return_url": "https://toko.example/selesai"
}'
# 201: arahkan pembeli ke checkout_url
# { "id": "payreq_9b2f...", "checkout_url": "https://pay.kasera.id/p/xK3f...", ... }Pekerjaan yang berpindah ke developer kalau memilih direct
| Urusan | Redirect (Checkout) | Direct API |
|---|---|---|
| Nama pembayar untuk Virtual Account | Ditanyakan di langkah customer kalau Virtual Account ditawarkan | Wajib dikirim di customer.name, atau create ditolak 422 customer_required |
| Pilihan metode | Semua metode aktif di akun, otomatis | Dibangun sendiri dari GET /v1/payment_methods |
| Bank yang dihentikan sementara atau diaktifkan | Halaman menyesuaikan tanpa deploy | Daftar yang di-hard-code menghasilkan 422 payment_method_unavailable |
| Hitung mundur dan kedaluwarsa | Sudah ada, sampai expires_at | Disembunyikan sendiri saat expires_at, lalu buat permintaan baru |
| Instruksi bayar | Sudah tampil per metode | Blok instructions dicetak apa adanya di bawah QR atau nomor VA |
| Layar sesudah bayar | Konfirmasi, lalu tombol kembali ke return_url dengan ?id=...&status=succeeded | Layar sendiri yang menanyakan status ke server sendiri |
| Nama di layar pembayaran | Nama usaha yang disetujui saat verifikasi | Merek dan domain sendiri |
Baris yang paling sering diremehkan adalah dua baris pertama. Integrasi direct yang menawarkan Virtual Account tanpa formulir nama akan gagal di create, bukan di layar pembeli. Nama itu juga dipersempit sebelum sampai ke bank: dialihaksarakan ke huruf Latin, tanda baca dibuang, dan dipotong pada 30 karakter, sesuai dokumentasi Virtual Account. Nama yang seluruhnya emoji ditolak dengan kode yang sama.
Nomor Virtual Account sebaiknya tampil sebagai teks besar yang bisa diseleksi dengan tombol salin, karena pembeli sering salah ketik. Halaman checkout sudah melakukannya; pada direct, itu tugas layar sendiri.
QR di ponsel yang sama
Masalah ini berlaku di kedua model, dan sering baru ketahuan setelah rilis: pembeli yang berbelanja dari ponsel tidak bisa memindai QR yang tampil di layar ponsel itu sendiri. Sebagian aplikasi pembayaran bisa membuka gambar QR dari galeri, sebagian tidak, dan langkah itu selalu menambah gesekan.
Pada direct, jawabannya ada di tangan sendiri: kenali perangkatnya, lalu tampilkan Virtual Account lebih dulu di ponsel dan QR lebih dulu di komputer. Pada redirect, kirim payment_methods dengan urutan yang diinginkan, misalnya ["va_bri", "qris"] untuk pembeli di ponsel, karena halaman checkout menawarkan metode sesuai urutan yang dikirim. Hitungan biayanya ikut berubah: untuk belanja Rp 150.000, QRIS kena Rp 1.300 dan Virtual Account Rp 5.000. Virtual Account baru lebih murah di atas sekitar Rp 678.600, dan mulai 26 Oktober 2026 keunggulan itu hanya berlaku sampai Rp 1.000.000.
Jalan tengah: tombol sendiri, layar bayar dari checkout
Yang jarang diketahui developer dari gateway lain: halaman checkout bisa dipangkas sampai tinggal satu layar. Aplikasi sendiri menampilkan tombol metode dan mengumpulkan nama pembeli, lalu create mengirim satu metode dan checkout.steps berisi payment saja:
{
"amount": 150000,
"external_id": "ORD-1234",
"payment_methods": ["va_bri"],
"customer": { "name": "Budi Santoso" },
"checkout": { "steps": ["payment"] }
}Pembeli langsung masuk ke layar nomor VA atau QR, lengkap dengan instruksi, hitung mundur, dan pembaruan status. Pilihan metodenya tetap milik aplikasi sendiri, tanpa membangun satu layar per metode. Dua aturannya ada di dokumentasi Checkout: tanpa langkah payment_method, payment_methods harus berisi tepat satu kode; dan membuang langkah customer padahal Virtual Account butuh nama yang belum diisi ditolak 422 customer_required saat create.
Kapan direct memang lebih tepat
- Aplikasi ponsel yang tidak ingin membuka peramban di tengah alur bayar.
- Layar kasir atau kios, tempat QR tampil di layar menghadap pembeli dan tidak ada peramban sama sekali. Bentuk lengkapnya ada di panduan QRIS di POS.
- Checkout yang sudah jadi dengan desain, bahasa, dan penanganan galatnya sendiri, dan tim yang siap merawatnya setiap kali daftar bank berubah.
Untuk toko online biasa, tautan tagihan lewat chat, dan integrasi pertama, redirect lebih cepat selesai dan lebih sedikit yang bisa rusak. Langkah memasang QR di halaman sendiri, kalau tetap memilih direct, ada di panduan memasang QRIS di website.
Yang tidak boleh berubah apa pun modelnya
Layar yang menampilkan “berhasil” bukan bukti pembayaran, baik layar sendiri maupun kepulangan ke return_url. Pesanan diproses dari webhook yang tanda tangannya sudah diverifikasi. Alasannya dibahas di perbandingan webhook dan halaman kembali sebagai pemicu. Mulai 26 Oktober 2026, pembayaran di atas Rp 1.000.000 juga wajib membawa delivery_date, delivery_terms_shown: true, nama dan kontak pembeli, serta deskripsi minimal 10 karakter. Field itu dikirim saat create, jadi berlaku sama di kedua model, dan tanggalnya ditampilkan di halaman penjual sebelum pembeli membayar.
Ringkasnya
- Satu endpoint, satu tarif per metode, satu webhook: modelnya tidak mengubah biaya.
- Redirect untuk integrasi pertama dan hampir semua toko online.
- Direct untuk aplikasi ponsel, layar kasir, dan checkout yang dirawat sendiri.
- Direct berarti nama pembayar VA, daftar metode, hitung mundur, dan instruksi jadi tugas sendiri.
- Checkout dengan langkah
paymentsaja adalah jalan tengah yang sah. - Di ponsel, tawarkan Virtual Account lebih dulu atau terima gesekan QR di layar sendiri.
Pertanyaan yang sering muncul
Apakah tarif direct dan redirect berbeda?
Tidak. Tarif ditentukan metode pembayarannya, bukan model integrasinya: QRIS 0,7% + Rp 250 dan Virtual Account Rp 5.000 per pembayaran berhasil, sama persis di kedua model. Tidak ada biaya tambahan untuk memakai halaman checkout, dan tidak ada potongan karena menggambar QR sendiri.
Bisakah satu integrasi memakai keduanya?
Bisa, karena keduanya permintaan pembayaran yang sama. Respons create tanpa object checkout tetap membawa checkout_url, jadi integrasi direct bisa menggambar QR di layar komputer dan menyerahkan checkout_url sebagai cadangan, misalnya saat object payment sesekali belum ada di respons atau saat pembeli ingin membayar dari perangkat lain.
Kalau memilih direct, apakah webhook masih wajib?
Wajib dengan alasan yang sama seperti pada redirect. Layar yang menggambar QR tidak tahu kapan bank pembeli selesai mendebit. Yang menyatakan pembayaran berhasil hanya webhook payment.paid yang tanda tangannya sudah diverifikasi, atau pembacaan GET /v1/transactions/:id dari server sendiri, paling sering sekali per detik per transaksi.
Gateway sebelumnya membedakan open dan closed payment. Di mana tempatnya di sini?
Itu sumbu yang lain. Direct dan redirect menjawab di mana pembeli membayar; open dan closed menjawab siapa yang menentukan nominal dan berapa kali kode bayarnya dipakai. Keempat kombinasinya sah, dan pemetaannya dibahas di artikel open payment dan closed payment.
Pemetaan direct dan redirect ke open dan closed payment ada di artikel open payment dan closed payment.