付款單
瞭解 StableOps 付款單如何繫結準確金額、穩定幣資產、區塊鏈和收款地址,以及訂單從建立、過期、檢測、確認到最終完成或回退的完整資源模型與生命週期。掌握支付指令、狀態欄位、過期規則和事件語義,確保業務只在正確狀態下履約、記帳或觸發異常處理。
付款單(payment order)表示「請客戶向某條鏈上的指定地址打一筆具體金額」。 StableOps 負責分配地址、監聽鏈上、追蹤確認數、並在每次狀態變化時發出簽名 Webhook。
生命週期
created -> detected -> confirmed -> finalized
| | |
expired reverted reverted
|
canceledcreated:地址已分配,等待入帳。detected:鏈上看到匹配的轉帳。confirmed:達到該鏈的確認閾值。finalized:達到 finality 閾值,履約最穩的節點。expired:超過過期時間仍未匹配到轉帳。canceled:仍處於created(尚未檢測到任何入帳)時被人工取消。reverted:receipt 失敗,或 block hash 不再與儲存的事件匹配。
建立訂單
const order = await client.paymentOrders.create(
{
merchantOrderId: 'order_123',
amount: '10.00',
amountMode: 'exact',
acceptedAssets: [
{ chain: 'base', asset: 'USDC' },
{ chain: 'ethereum', asset: 'USDC' },
],
expiresAt: new Date(Date.now() + 30 * 60 * 1000).toISOString(),
metadata: { customerId: 'cus_123' },
},
{ idempotencyKey: 'order_123:create-payment-order' },
)
console.log(order.paymentInstructions)
// [
// { chain: 'base', asset: 'USDC', address: '0x...' },
// { chain: 'ethereum', asset: 'USDC', address: '0x...' },
// ]amountMode 控制金額匹配模式。省略時預設為 exact:
exact(預設):客戶必須支付指定的精確金額。使用共享(shared)地址時需自行確保同一地址上的不同訂單金額不衝突,否則 StableOps 無法區分入帳歸屬。auto:伺服器端在共享地址上遇到金額衝突時自動微調訂單金額(在基準金額上小幅上調),保證每筆訂單金額唯一。原始請求金額存於requestedAmount,實際應付金額以返回的amount為準。
amount 是資產單位的十進位制字串。鏈上事件攜帶最小單位的整數字符串,StableOps 在
內部按代幣的 decimals 轉換後再做匹配。
地址分配
單地址(single)模式:每個未結訂單獨佔一個可用地址,直到 finalized / reverted / expired / canceled。 共享(shared)模式:一個地址可同時供多個未結訂單使用,按 鏈 + 資產 + 組織 + 環境 + 金額 精確匹配。
建立訂單時,StableOps 會按 acceptedAssets 裡的每條 (鏈, 資產) 組合各預分配一個
可用候選地址,寫進 paymentInstructions。訂單進入終態(finalized / reverted /
expired / canceled)時,仍未被使用的候選地址會被釋放回池子。
取消訂單
只有 created 狀態的訂單可以呼叫 cancel。一旦訂單進入 detected / confirmed /
finalized 就不能再取消。已經最終完成的付款必須使用獨立的退款流程,
不能改寫原訂單。取消會把訂單上仍佔用的候選地址釋放回 available。
冪等與唯一性
Idempotency-Key 控制請求重放;merchantOrderId 是獨立的業務引用,在組織 + 環境內必須
唯一。用同一個 merchantOrderId 配新的 idempotency key 再開單會得到衝突,而不是上一次的回應。
Webhook
訂單相關的事件型別:
payment_order.createdpayment.detectedpayment.confirmedpayment.finalizedpayment.expiredpayment.revertedpayment_order.canceled
除非業務明確接受 payment.confirmed 後還可能發生回滾的風險,否則請在
payment.finalized 完成履約。
完整事件清單與 payload 見 Webhooks。
這篇文件怎麼樣?
最後更新