帳號生命週期
一個帳號帶有三個彼此獨立的狀態:status(由你掌控的業務開關)、GET /v1/accounts/{id}/auth 回傳的認證狀態,以及 runtime_status(即時連線狀態)。webhook 載荷以 auth_status 與 runtime_status 暴露後兩者——注意 REST 帳號物件本身並沒有名為 auth_status 的欄位。
認證狀態機
pending_auth帳號建立後的初始狀態;尚未啟動任何流程。
awaiting_qr_scanQR 流程進行中;auth_payload 帶有要顯示的 QR 內容。
awaiting_code驗證碼流程進行中;WhatsApp 場景下把 auth_payload 裡的 verify_code 輸入到手機上。
awaiting_password渠道在驗證碼之後還要求二階段驗證密碼。
authorized認證完成。執行環境會自動啟動。
failed流程失敗;last_error 帶有原因。重新發起流程即可重試。
pending_auth→awaiting_qr_scanPOST /auth/qr/start 開始 QR 流程。
pending_auth→awaiting_codePOST /auth/start 開始驗證碼流程。
awaiting_code→awaiting_password渠道要求二階段驗證密碼。
awaiting_qr_scan→authorized渠道確認掃碼完成。
awaiting_code→authorized驗證碼(或 WhatsApp 配對)被接受。
awaiting_password→authorized密碼被接受。
authorized→pending_auth渠道使會話失效——觸發 account.auth.required 事件,需要重新發起流程。
awaiting_*→failed渠道在任一等待步驟回報失敗(account.auth.failed 事件)。
awaiting_*→pending_authPOST /auth/cancel 放棄進行中的流程。
執行環境狀態機
unknown帳號建立後的初始狀態;平台缺少來自渠道的最新回報時也會處於此狀態——呼叫 /runtime/refresh 重新同步。
starting啟動進行中;渠道正在把會話帶上線。
running已連線,可正常收發訊息。
reconnecting連線中斷,自動或手動重連進行中。
disconnected渠道回報會話離線;重連或重新啟動即可恢復。
stopping停止進行中。
stopped未連線。停止完成後的狀態。
error執行環境遇到無法復原的錯誤;last_error 帶有原因。
unknown→starting授權成功後自動啟動。
stopped→starting顯式呼叫 POST /runtime/start。
starting→running渠道會話上線(account.started 事件)。
running→reconnecting連線中斷,或呼叫了 POST /runtime/reconnect。
reconnecting→running連線重新建立。
running→disconnected渠道回報會話離線(account.status.updated 事件)。
disconnected→runningPOST /runtime/reconnect 或 /runtime/start 將其帶回線上。
running→stoppingPOST /runtime/stop 開始優雅停止。
stopping→stopped停止完成。
*→error任意時點發生無法復原的渠道錯誤。
*→unknown缺少渠道的最新回報;POST /runtime/refresh 重新同步狀態值。
備註
- 帳號的 status 由你掌控(建立時或透過 PATCH 設定的業務開關)。另外兩個狀態由平台持有且唯讀:認證狀態透過 GET /v1/accounts/{id}/auth 讀取(看其 status 欄位),runtime_status 直接掛在帳號物件上。
- 授權成功會自動啟動執行環境——之後再呼叫 POST /runtime/start 也無害,等同 no-op。
- 處於 authorized 狀態時,POST /auth/start、/auth/qr/start 與 /auth/session 會被以 409 account_already_authorized 拒絕。確實需要重走流程時,請先呼叫 POST /auth/cancel。
- account.auth.required 事件表示渠道已使會話失效:認證狀態脫離 authorized,auth_payload 帶有重新認證所需的材料(例如新的 QR)。
- 每次執行環境變化都會以 account.status.updated 事件推送,同時攜帶 auth_status 與 runtime_status——請透過 webhook 同步本地副本,而不是輪詢。