Polling — waitForPayment

Selain webhook, Qrisy SDK menyediakan polling helper untuk cek status transaksi secara otomatis.

waitForPayment (Promise-based)

Block sampai transaksi paid/cancel/expired/timeout. Resolve saat paid, reject bila cancel/expired.

Node.js

try {
  const paid = await qrisy.waitForPayment(trx.transactionId, {
    interval: 3000,  // 3 seconds
    timeout: 900000, // 15 minutes
  });
  console.log('Paid at:', paid.paidAt);
} catch (err) {
  console.error('Failed:', err.message);
}

Python

try:
    paid = qrisy.wait_for_payment(trx.transaction_id, interval=3.0, timeout=900.0)
    print(f"Paid at: {paid.paid_at}")
except Exception as e:
    print(f"Failed: {e}")

# Async (asyncio)
async def main():
    paid = await qrisy.async_wait_for_payment(trx.transaction_id)

import asyncio
asyncio.run(main())

PHP

try {
    $paid = $qrisy->waitForPayment(
        $trx->transactionId,
        intervalMs: 3000,
        timeoutMs: 900000,
    );
    echo "Paid at: {$paid->paidAt}";
} catch (\Qrisy\Exception\QrisyException $e) {
    echo "Failed: {$e->getMessage()}";
}

watchPayment (Callback-based)

Poll dengan callback yang dipanggil setiap status berubah. Return stop function.

Node.js

const stop = qrisy.watchPayment(trx.transactionId, {
  interval: 3000,
  timeout: 900000,
  onStatusChange: (status, response) => {
    console.log(`Status: ${status}`, response.data);
  },
  onError: (err) => console.error(err),
});

// Stop manual
stop();

Python

stop = qrisy.watch_payment(
    trx.transaction_id,
    interval=3.0,
    on_status_change=lambda status, data: print(f"Status: {status}"),
    on_error=lambda err: print(f"Error: {err}"),
)

# Stop manual
stop()

Behavior

  • Tick tidak numpuk: bila tick sebelumnya masih berjalan, tick baru diskip.
  • Callback hanya pada status change: bila status sama dengan sebelumnya, callback tidak dipanggil.
  • Auto-stop pada terminal status (paid, cancel, expired).
  • Max errors: 5 consecutive error → stop (default, configurable).

Webhook vs Polling

AspectWebhookPolling
Latency<3 seconds (push)3-5 seconds (interval)
Server requiredYa (public URL)Tidak
Reliability5x retry + DLQMaks errors 5
Best forBackend integrationScripts, CLI, testing

Untuk production, gunakan webhook (push-based). Polling cocok untuk testing atau script satu-shot.