Generate QRIS

Generate QRIS dinamis dengan nominal + kode unik otomatis dari QRIS statis Anda.

v1 vs v2

Featurev1 (/qris)v2 (/v2/qris)
QR stringSelalu adaConditional (useQris)
QR typedynamic (fixed)dynamic | static
Payment methodqris (fixed)qris | ewallet
Status fieldpending
Expired in minutes

Gunakan v2 untuk production. v1 retained untuk backward compatibility.

Unique Code

Qrisy menambahkan kode unik 1-999 ke nominal asli untuk membedakan transaksi dengan nominal sama. Contoh:

Amount:          15000
Unique nominal:    450
Total bayar:     15450  ← customer scan QR ini

Kode unik increment atomic per merchant (1, 2, 3, ..., 999, 1, 2, ...). Tidak akan collision antar transaksi concurrent.

Wallet Shortcuts

SDK menyediakan shortcut per wallet:

// Node.js
const trx = await qrisy.wallets.generateQRDana(15000, { qr_id: 'uuid' });
const trx = await qrisy.wallets.generateQRGoPay(25000, { qr_id: 'uuid' });
const trx = await qrisy.wallets.generateQRShopee(50000, { qr_id: 'uuid' });
# Python
trx = qrisy.wallets.generate_qr_dana(15000, qr_id="uuid")
trx = qrisy.wallets.generate_qr_gopay(25000, qr_id="uuid")
trx = qrisy.wallets.generate_qr_shopee(50000, qr_id="uuid")
// PHP
$trx = $qrisy->wallets->generateQRDana(15000, ['qr_id' => 'uuid']);

Atau generic via packageName:

const trx = await qrisy.wallets.generateQRWallet('com.shopee.id', 50000, { qr_id: 'uuid' });

Expiry

Default: 15 menit. Max: 60 menit. Saat expired, status berubah expired dan webhook expired dikirim.

Check Status

// Polling (manual)
const status = await qrisy.checkStatus('txn_01ABC...');

// Polling (auto, recommended)
const paid = await qrisy.waitForPayment('txn_01ABC...', {
  interval: 3000,  // 3 seconds
  timeout: 900000, // 15 minutes
});

Cancel Transaction

await qrisy.cancelTransaction('txn_01ABC...');

Hanya bisa cancel transaksi dengan status pending. Status terminal (paid/cancel/expired) tidak bisa di-cancel.

Response Shape (v2)

{
  "transactionId": "txn_01ABCDEF...",
  "originalAmount": 15000,
  "totalAmount": 15450,
  "uniqueNominal": 450,
  "useUniqueCode": true,
  "packageIds": ["id.dana"],
  "expiredInMinutes": 15,
  "qrType": "dynamic",
  "paymentMethod": "qris",
  "useQris": true,
  "status": "pending",
  "qr_string": "00020101021226...",
  "expiredAt": "2026-08-02T10:15:00.000Z"
}