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.