常見問題
結算狀態未知時應該怎麼辦?
當付費請求超時、網路中斷或結算證據不可靠時,理解 Agent Payments 的結算狀態未知意味著什麼。使用原付款 Intent、授權和回執安全對帳,等待鏈上確認或人工處理,避免透過建立付款、重新簽名或盲目重試造成重複支付。
停止付款重試,核對原 Intent。settlement_unknown 表示一筆已經授權的付款可能到達了 x402 結算服務,但目前回應和鏈上證據還不足以確認它是否已經結算。
它不表示“尚未付款”,更不允許建立替代 Intent、授權、冪等鍵或隨機數。
何時會進入該狀態
控制面簽發授權後,客戶簽名器生成準確的付款簽名,Agent SDK 再傳送付費請求。以下情況可能導致結算狀態未知:
- 付費請求離開 Agent 執行時後超時;
- 連線在可靠回應返回前關閉;
- 資源回應缺少結算證據,或包含無法解析的結算證據;
- 結算服務、資源伺服器、RPC 服務或鏈暫時提供不完整或互相沖突的證據。
此時付款可能已經成功,但 Agent 沒有收到資源回應。
恢復步驟
- 儲存
SettlementUnknownError中的intentId和authorizationId。 - 停止該業務購買的自動付款重試,不要輪換冪等鍵。
- 使用
agent.getPayment(intentId)或management.payments.get(intentId)查詢原 Intent。 - 訂閱簽名的
agent_payment.settlement.*和agent_payment.resource.*Webhook,並按事件 ID 去重。 - 在原 Intent 得到明確結果前,讓業務任務保持待處理或對帳狀態。
- 狀態超過營運時限仍然未知時,應升級人工調查,不能把告警轉成自動重付。
Agent SDK 會透過錯誤物件提供關聯標識:
import { SettlementUnknownError } from '@stableops/agent-payments-sdk'
try {
await agent.x402Fetch(resourceUrl, {
idempotencyKey: 'research-task-284:market-report:v1',
})
} catch (error) {
if (error instanceof SettlementUnknownError) {
await saveForReconciliation({
intentId: error.intentId,
authorizationId: error.authorizationId,
})
const payment = await agent.getPayment(error.intentId)
console.error({
intentId: payment.intentId,
paymentStatus: payment.status,
resourceStatus: payment.resourceStatus,
})
}
throw error
}查詢記錄是安全的。換一個冪等鍵呼叫 x402Fetch 發起新購買則不安全。
狀態如何得到最終結果
| 最終證據 | 支付結果 | 應用應該怎麼做 |
|---|---|---|
| 授權隨機數已經使用,匹配轉帳得到確認 | settled | 只記錄一次付款;另外檢查資源狀態,再判斷業務任務是否完成 |
| 對帳證明結算已經回滾 | reverted | 記錄付款失敗;任何新購買都必須經過明確的營運或業務決定 |
| 執行授權和付款授權均已過期,隨機數未使用,充分掃描後沒有匹配轉帳 | expired | 可以釋放已經提交的預算;後續購買必須作為新的明確嘗試 |
| 鏈或服務商證據仍不可用 | settlement_unknown | 繼續對帳,並保持預算已提交狀態 |
StableOps 不會僅因牆上時鐘超時就釋放已經提交的預算。系統必須先確認授權已經過期且未使用,也不存在待確認的匹配轉帳。這條保守規則可以避免第一筆付款仍可能結算時,同一筆資金又被計為可用。
支付結果與資源結果彼此獨立
即使支付結算已經明確,資源結果仍可能是 unknown 或 failed:
settled加response_received表示付款和付費 HTTP 交換都有可靠證據。settled加unknown表示資金已經轉移,但 Agent 可能沒有收到資源。- StableOps 確認鏈上狀態為
settled前,資源回應也可能已經返回。
資源交付問題應透過賣方的重放、支援或業務補償流程解決。絕不能把資源缺失解釋為付款沒有發生。
相關內容
這篇文件怎麼樣?
最後更新