账号生命周期
一个账号携带三个相互独立的状态:status(由你设置的业务开关)、GET /v1/accounts/{id}/auth 返回的认证状态,以及 runtime_status(实时连接状态)。webhook 载荷以 auth_status 和 runtime_status 暴露后两者——注意 REST 账号对象本身没有名为 auth_status 的字段。
认证状态机
pending_auth账号创建后的初始状态;尚未发起任何流程。
awaiting_qr_scan二维码流程进行中;auth_payload 携带待渲染的二维码内容。
awaiting_code验证码流程进行中;WhatsApp 场景下需在手机上输入 auth_payload 中的 verify_code。
awaiting_password验证码之后,渠道要求输入两步验证密码。
authorized认证完成,运行时已自动启动。
failed流程失败;last_error 携带原因。发起新流程即可重试。
pending_auth→awaiting_qr_scanPOST /auth/qr/start 发起二维码流程。
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渠道上报会话已离线;通过 reconnect 或 start 恢复。
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 是无害的空操作。
- 处于 authorized 状态时,POST /auth/start、/auth/qr/start 和 /auth/session 会被拒绝并返回 409 account_already_authorized。确实需要重新走流程时,请先调用 POST /auth/cancel。
- account.auth.required 事件表示渠道使会话失效:认证状态脱离 authorized,auth_payload 携带重新认证所需的材料(例如新的二维码)。
- 每次运行时变化都会推送 account.status.updated 事件,同时携带 auth_status 和 runtime_status——请通过 webhook 维护本地副本,而不是轮询。