Overview
Pengantar integrasi SetQris Payment API
SetQris menyediakan REST API untuk membuat transaksi QRIS dinamis, memantau status pembayaran, dan menerima notifikasi real-time ke server Anda melalui webhook. Semua endpoint memerlukan autentikasi menggunakan header x-api-key.
REST API
Format JSON standar. Semua request gunakan header x-api-key.
HTTPS Only
Semua endpoint hanya bisa diakses lewat koneksi HTTPS.
Rate Limit
Batas 120 request per menit per API Key pada endpoint generate.
Semua request harus menyertakan header x-license-key: YOUR_LICENSE_KEY. API Key tersedia di halaman API Keys.
Generate QRIS
Membuat transaksi QRIS dinamis
Endpoint utama untuk membuat transaksi QRIS dinamis. Sistem otomatis menyisipkan kode unik acak ke nominal untuk membedakan setiap transaksi.
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
id | string | WAJIB | ID QRIS Merchant (UUID) yang terdaftar. |
amount | number | WAJIB | Nominal dasar transaksi sebelum kode unik. |
useUniqueCode | boolean | OPSIONAL | Sematkan kode acak 1-999 di belakang nominal. |
packageIds | Array[string] | WAJIB | Package ID aplikasi (cth: ["id.dana"]). |
expiredInMinutes | number | OPSIONAL | Kedaluwarsa dalam menit (default: 15). |
prefix | string | OPSIONAL | Prefix ID Transaksi, maks 8 karakter. |
qrType | string | OPSIONAL | "dynamic" atau "static". |
paymentMethod | string | OPSIONAL | "qris" (scan) atau "ewallet". |
useQris | boolean | OPSIONAL | Sertakan qr_string di respons. |
Cek Status Transaksi
Polling status pembayaran secara real-time
Gunakan endpoint ini untuk memeriksa apakah transaksi sudah lunas, masih pending, dibatalkan, atau expired.
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
transactionId | String | WAJIB | ID Transaksi unik dari hasil Generate API. |
Endpoint Lainnya
Cancel, list transaksi, dan hapus riwayat
Batalkan transaksi secara paksa sebelum expired.
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
transactionId | String | WAJIB | ID Transaksi yang ingin dibatalkan. |
Daftar semua transaksi dengan filter status, halaman, dan pencarian.
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
status | String | OPSIONAL | pending | paid | cancel | expired |
page | Number | OPSIONAL | Nomor halaman (default: 1). |
limit | Number | OPSIONAL | Jumlah per halaman (default: 5). |
search | String | OPSIONAL | Cari nominal atau ID transaksi. |
sort | String | OPSIONAL | "newest" atau "oldest". |
Hapus log riwayat — satu, massal, atau semua sekaligus.
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
transactionId | String | OPSIONAL | ID tunggal yang ingin dihapus. |
transactionIds | Array[String] | OPSIONAL | Array ID untuk hapus massal. |
clearAll | Boolean | OPSIONAL | true = hapus seluruh log merchant. |
Mendapatkan data profil lisensi aktif (aman, mengecualikan kunci lisensi atau secret key).
Webhook Callback
Notifikasi otomatis saat transaksi lunas
SetQris mengirim HTTP POST ke URL webhook Anda secara otomatis saat transaksi berubah menjadi paid. Konfigurasi URL webhook di halaman Webhook Developer.
Notifikasi Instan
Dikirim dalam hitungan detik setelah transaksi terverifikasi lunas.
HMAC-SHA256
Setiap payload ditandatangani untuk menjamin keaslian data.
Auto Retry 3x
Retry otomatis hingga 3 kali jika server tidak merespons 10 detik.
Struktur Payload
Format JSON yang dikirim ke server Anda
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
transactionId | String | WAJIB | ID unik transaksi. |
amount | Number | WAJIB | Nominal total transaksi. |
packageName | String | WAJIB | Package ID aplikasi pengirim. |
appName | String | WAJIB | Nama tampilan aplikasi pengirim. |
status | String | WAJIB | "paid" — status transaksi terverifikasi lunas. |
paidAt | String | WAJIB | Timestamp ISO 8601 saat pembayaran selesai. |
Signature Verification
Verifikasi keaslian webhook dengan HMAC-SHA256
Setiap webhook request ditandatangani menggunakan Webhook Secret Anda. Tanda tangan dikirimkan melalui header x-setqris-signature.
Ambil header signature
Baca nilai header X-SetQris-Signature dari request masuk.
Gunakan raw body
Ambil body sebelum di-parse. Parsing JSON mengubah urutan key sehingga signature tidak cocok.
Hitung HMAC-SHA256
Kalkulasikan HMAC-SHA256 menggunakan raw body sebagai message dan Webhook Secret sebagai key.
Bandingkan constant-time
Gunakan timingSafeEqual / hash_equals. Jangan gunakan == biasa (rentan timing attack).
Penting: Gunakan raw body (sebelum di-parse) sebagai input HMAC. Parsing JSON mengubah urutan key sehingga signature tidak cocok.
Gunakan crypto.timingSafeEqual (Node.js) atau hash_equals (PHP) untuk perbandingan. String comparison biasa rentan terhadap timing attack.
Retry Policy
Jaminan pengiriman dengan retry otomatis
Sistem retry pengiriman webhook jika server Anda tidak merespons dengan HTTP 2xx dalam waktu 10 detik.
Percobaan 1 — Segera setelah transaksi lunas terdeteksi
Retry ke-1 — 30 detik setelah gagal pertama
Retry ke-2 — 2 menit setelah retry pertama gagal
Berhenti — Tidak ada retry selanjutnya
Setelah 3 kali gagal, webhook tidak dikirim ulang. Balas dengan 200 segera, lalu proses payload secara asynchronous di background.
