Transaction lifecycle

Setiap order bergerak melalui status yang jelas. Pahami transisinya agar logika bisnis Anda (stok, email, refund) berjalan tepat.

Diagram status

text
Created ──► Success ──► (settlement) ──► isSettlement = true
   │
   ├──► Expired   (melewati expiredAt tanpa pembayaran)
   ├──► Invalid   (pembayaran tidak valid / dibatalkan sistem)
   └──► Underpaid (dana masuk kurang dari totalAmount)

Daftar status

StatusArtiTindakan yang disarankan
CreatedOrder dibuat, menunggu pembayaranTampilkan QR & nominal ke pelanggan
SuccessPembayaran terverifikasi on-chainTandai lunas, kirim barang, catat dari webhook
ExpiredBatas waktu expiredAt terlewatBatalkan pesanan atau minta pelanggan membuat order baru
InvalidPembayaran tidak dapat diprosesHubungi pelanggan; dana tidak dikreditkan
UnderpaidDana masuk kurang dari totalAmountHubungi pelanggan untuk melunasi selisih atau refund manual

Settlement

Settlement bukan status order, melainkan flag isSettlement:

  • false — dana masih di alamat deposit (menunggu sweep).
  • true — dana sudah dipindahkan ke wallet settlement Anda.

Lihat Settlement untuk jadwal dan cara memicu manual.

Menangani status di sistem Anda

Contoh handler webhook
switch (event.data.status) {
  case "Success":
    await markOrderPaid(event.data.order_no, {
      paid: event.data.final_amount,
      txHash: event.data.tx_hash,
    });
    break;
  default:
    // Underpaid/Invalid ditangani lewat polling getOrder bila perlu.
    break;
}

Order kedaluwarsa

  • QR memiliki expiredAt (umumnya 15 menit).
  • Bila lewat, minta pelanggan memulai order baru — kurs bisa berbeda.
  • Payment link dapat memiliki masa berlaku sendiri (date_expired).