Perbandingan · Terbit · Diperbarui

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

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

UrusanRedirect (Checkout)Direct API
Nama pembayar untuk Virtual AccountDitanyakan di langkah customer kalau Virtual Account ditawarkanWajib dikirim di customer.name, atau create ditolak 422 customer_required
Pilihan metodeSemua metode aktif di akun, otomatisDibangun sendiri dari GET /v1/payment_methods
Bank yang dihentikan sementara atau diaktifkanHalaman menyesuaikan tanpa deployDaftar yang di-hard-code menghasilkan 422 payment_method_unavailable
Hitung mundur dan kedaluwarsaSudah ada, sampai expires_atDisembunyikan sendiri saat expires_at, lalu buat permintaan baru
Instruksi bayarSudah tampil per metodeBlok instructions dicetak apa adanya di bawah QR atau nomor VA
Layar sesudah bayarKonfirmasi, lalu tombol kembali ke return_url dengan ?id=...&status=succeededLayar sendiri yang menanyakan status ke server sendiri
Nama di layar pembayaranNama usaha yang disetujui saat verifikasiMerek 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 sejak 26 Oktober 2026 keunggulan itu hanya berlaku sampai Rp 1.000.000; di atasnya keduanya kena 1% dari seluruh nominal.

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

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

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.

Mulai sekarang

Terima pembayaran pertama minggu ini.

Daftar gratis, buat payment link atau pakai API, dan lihat statusnya berubah otomatis. Tanpa biaya bulanan, biaya transaksi hanya untuk pembayaran yang berhasil.

Dapatkan di Google PlayDownload di App Store