Permintaan pembayaran
QRIS headless
Tampilkan QR di halaman Anda sendiri — tanpa redirect ke checkout kami.
1. Buat permintaan pembayaran
Respons create dan retrieve membawa qris_string — payload EMV QRIS mentah. Tersedia setelah QRIS dibuat; jika sesekali tidak ada (gangguan upstream yang jarang), ambil ulang permintaannya dan field itu akan muncul. Tidak pernah berupa placeholder.
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" }'
# 201 — qris_string is the raw EMV payload:
# {
# "id": "payreq_9b2f...",
# "status": "pending",
# "qris_string": "00020101021226670016COM.KASERA.WWW...6304A1B2",
# "expires_at": "2026-08-13T13:00:00+07:00",
# ...
# }2. Tampilkan QR di sisi klien
Encode qris_string menjadi gambar QR di browser. Kami sengaja mengembalikan string, bukan gambar — halaman Anda yang mengatur ukuran, tampilan, dan cache.
// Any QR library works — the payload is a plain string.
// npm install qrcode
import QRCode from "qrcode";
QRCode.toCanvas(
document.getElementById("qr"),
paymentRequest.qris_string
);3. Konfirmasi pembayaran
Dengarkan webhook payment.paid, atau poll GET /v1/transactions/:id sampai status menjadi paid. Keduanya sama persis dengan alur checkout hosted.
QR mati pada expires_at — payload kedaluwarsa bersama permintaannya dan scan setelah itu akan gagal. Sembunyikan QR pada expires_at, dan buat permintaan pembayaran baru jika pembeli masih ingin membayar.