Dokumentasi API & Webhook
Qris Pay
Dokumentasi REST API dan Webhook Qris Pay untuk integrasi cepat payment gateway QRIS otomatis.
Pengantar integrasi Qris Pay Payment API
Qris Pay menyediakan REST API untuk membuat transaksi QRIS dinamis, memantau status pembayaran, dan menerima notifikasi real-time ke server Anda melalui webhook.
REST API
Format JSON standar. Semua request gunakan header x-license-key.
HTTPS Only
Semua endpoint hanya bisa diakses lewat koneksi HTTPS.
Rate Limit
Batas 120 request per menit per License Key pada endpoint generate.
Production API: https://api.QrisPayapp.web.id
Semua request harus menyertakan header x-license-key: YOUR_LICENSE_KEY. License Key tersedia di halaman API Keys.
Ikuti tahapan berikut secara berurutan untuk menyiapkan akun, QRIS, kredensial API, dan aplikasi listener hingga siap menerima pembayaran.
- 1Buat akun di QrisPayapp.web.id — registrasi akun terlebih dahulu sebagai dasar seluruh layanan Qris Pay.
- 2Upload QRIS di halaman QRIS Saya — unggah QRIS statis Anda agar bisa diubah menjadi QRIS dinamis otomatis.
- 3Generate API Key (License Key & Webhook Secret) — generate KEDUANYA di halaman API Keys; listener app dan callback pembayaran membutuhkan keduanya.
- 4Download aplikasi Qris Pay di Play Store — cari "Qris Pay : Gateway Qris" di Google Play Store, lalu instal di HP Android Anda.
- 5Login akun di aplikasi Qris Pay — gunakan akun yang sama dengan yang Anda daftarkan di QrisPayapp.web.id.
- 6Masuk ke tab Setting di aplikasi Qris Pay — buka menu pengaturan di dalam aplikasi untuk konfigurasi listener.
- 7Nyalakan Listener App & lengkapi checklist hijau — pastikan semua item checklist berwarna HIJAU: izinkan akses notifikasi, dan isi sumber QRIS sesuai merchant yang Anda pakai. Jika merchant tidak ada di Aksi Cepat, silakan hubungi admin WhatsApp.
- 8Buat code untuk integrasi API — gunakan endpoint Generate QRIS v1/v2 di bawah ini pada backend Anda, lengkap dengan contoh request dan response.
Catatan: Pada langkah 7, pastikan semua item checklist berwarna hijau sebelum mulai membuat transaksi uji. Jika merchant yang Anda pakai tidak ada di daftar Aksi Cepat aplikasi, silakan hubungi admin melalui WhatsApp.
Video Tutorial Setup: Segera Hadir
Membuat transaksi QRIS dinamis
Endpoint utama untuk membuat transaksi QRIS dinamis. Sistem otomatis menyisipkan kode unik acak ke nominal untuk membedakan setiap transaksi.
/api/generate/qrisJika pengaturan Wajibkan Aplikasi Aktif di halaman Pengaturan Anda aktif, endpoint ini akan menolak request dengan 403 ketika tidak ada perangkat listener yang online.
Parameter
| 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. |
POST /api/generate/qris HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json
{
"id": "986b2a0a-5c95-4177-9800-02d84a35338e",
"amount": 10000,
"useUniqueCode": true,
"packageIds": ["id.dana"],
"expiredInMinutes": 15,
"prefix": "CSK"
}Versi API terbaru dengan parameter fleksibel
Mendukung parameter tambahan seperti qrType, paymentMethod, dan useQris untuk lebih banyak skenario pembayaran.
/api/generate/v2/qrisParameter
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
| qr_id | String | Wajib | ID QRIS Merchant (UUID). |
| amount | Number | Wajib | Nominal pembayaran dasar. |
| useUniqueCode | Boolean | Opsional | Aktifkan kode unik acak. |
| packageIds | Array[String] | Wajib | Package ID aplikasi yang diizinkan. |
| expiredInMinutes | Number | Opsional | Menit batas kedaluwarsa. |
| qrType | String | Wajib | "dynamic" atau "static". |
| paymentMethod | String | Wajib | "qris" (scan) atau "ewallet". |
| useQris | Boolean | Wajib | Sertakan qr_string di respons. |
| prefix | String | Opsional | Prefix ID Transaksi, maks 8 karakter. |
POST /api/generate/v2/qris HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json
{
"qr_id": "986b2a0a-5c95-4177-9800-02d84a35338e",
"amount": 15000,
"useUniqueCode": true,
"packageIds": ["id.dana", "com.shopee.id"],
"expiredInMinutes": 15,
"qrType": "dynamic",
"paymentMethod": "qris",
"useQris": true,
"prefix": "CSK"
}Polling status pembayaran secara real-time
/api/generate/check-statusParameter
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
| transactionId | String | Wajib | ID Transaksi unik dari hasil Generate API. |
Status: pending paid cancel expired
POST /api/generate/check-status HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json
{
"transactionId": "CSK-c39e25d2-0cb2-4a00-9941-863863486df8"
}Status perangkat aplikasi listener Android Anda
Gunakan endpoint ini untuk memeriksa apakah perangkat listener (aplikasi Qris Pay di HP Android) sedang online sebelum membuat transaksi.
/api/device/checkGET /api/device/check HTTP/1.1 Host: api.QrisPayapp.web.id x-license-key: YOUR_LICENSE_KEY
Tandai transaksi pending/expired sebagai lunas secara manual
Gunakan endpoint ini untuk menyelesaikan transaksi secara manual ketika pembayaran sudah diterima namun belum terdeteksi otomatis. Hanya transaksi berstatus pending atau expired yang dapat ditandai lunas.
/api/generate/mark-paidParameter
| Parameter | Type | Sifat | Deskripsi |
|---|---|---|---|
| transactionId | String | Wajib | ID Transaksi yang ingin ditandai lunas. |
| packageName | String | Opsional | Nama paket (default: "manual.approval"). |
| appName | String | Opsional | Nama aplikasi (default: "Manual Dashboard"). |
| title | String | Opsional | Judul notifikasi (default: "Persetujuan Manual"). |
| text | String | Opsional | Pesan tambahan (default: "Disetujui secara manual melalui Dashboard"). |
| packageIds | Array[String] | Opsional | Package ID aplikasi (default: ["manual"]). |
POST /api/generate/mark-paid HTTP/1.1
Host: api.QrisPayapp.web.id
x-license-key: YOUR_LICENSE_KEY
Content-Type: application/json
{
"transactionId": "CSK-c39e25d2-0cb2-4a00-9941-863863486df8",
"packageName": "manual.approval",
"appName": "Manual Dashboard",
"title": "Persetujuan Manual",
"text": "Disetujui secara manual melalui Dashboard",
"packageIds": ["manual"]
}Cancel, list, hapus riwayat, dan profile.
/api/generate/cancel-statusCancel Transaksi
Batalkan transaksi secara paksa sebelum expired.
/api/generate/listList Transaksi
Daftar semua transaksi dengan filter status, halaman, dan pencarian. Parameter: status (pending | paid | cancel | expired), page, limit, search, sort.
/api/generate/list-deleteHapus Riwayat Transaksi
Hapus log riwayat — satu, massal, atau semua sekaligus. Parameter: transactionId, transactionIds, clearAll.
/api/profileProfile
Mendapatkan data profil lisensi aktif (aman, mengecualikan kunci lisensi atau secret key).
Library integrasi dari komunitas
Library NPM qrispay ini dibuat dan dipelihara secara independen oleh salah satu pelanggan/developer aktif Qris Pay.
Instalasi
npm install qrispay
Inisialisasi & Penggunaan
import { QrisPay } from "qrispay";
const qrispay = new QrisPay({ licenseKey: "YOUR_LICENSE_KEY" });
const trx = await qrispay.generateQRISv2({
qr_id: "986b2a0a-5c95-4177-9800-02d84a35338e",
amount: 10000,
packageIds: ["id.dana"],
qrType: "dynamic",
paymentMethod: "qris",
useQris: true,
useUniqueCode: true,
});Notifikasi otomatis saat transaksi lunas
Qris Pay mengirim HTTP POST ke URL webhook Anda secara otomatis saat transaksi berubah menjadi paid.
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
| Field | Type | Deskripsi |
|---|---|---|
| transactionId | String | ID unik transaksi. |
| amount | Number | Nominal total transaksi. |
| packageName | String | Package ID aplikasi pengirim. |
| appName | String | Nama tampilan aplikasi pengirim. |
| status | String | "paid" — status transaksi terverifikasi lunas. |
| paidAt | String | Timestamp ISO 8601 saat pembayaran selesai. |
{
"transactionId": "TX987654321",
"amount": 55000,
"packageName": "com.company.paymentapp",
"appName": "Payment App Name",
"status": "paid",
"paidAt": "2026-06-04T03:38:35Z"
}Signature Verification — Verifikasi keaslian webhook dengan HMAC-SHA256
Setiap webhook request ditandatangani menggunakan Webhook Secret Anda. Tanda tangan dikirimkan melalui header X-QrisPay-Signature.
- Ambil header X-QrisPay-Signature dari request masuk.
- Gunakan raw body sebelum di-parse (parsing JSON mengubah urutan key sehingga signature tidak cocok).
- Hitung HMAC-SHA256 menggunakan raw body sebagai message dan Webhook Secret sebagai key.
- Bandingkan constant-time menggunakan timingSafeEqual / hash_equals.
Penting: Gunakan raw body (sebelum di-parse) sebagai input HMAC.
Retry Policy
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.
Render string data menjadi QR Code visual
Tool untuk mengonversi data string menjadi gambar QR Code. Berguna untuk debugging QRIS string yang di-generate API.
Opsi Desain
Classic, Block, Rounded
Resolusi
200×200, 300×300, 500×500
API URL
https://larabert-qrgen.hf.space/v1/create-qr-code?size=300x300&style=2&color=111111&data=https%3A%2F%2Fqrispayapp.web.id