ENGINEERING NOTE 01 / 50 · SMS

接码订单为什么不能只有一个成功标记

OPEN RAMBO ·

号码分配、收到短信和目标应用接受验证码,是三个不同的结果。分别建模,客服与退款判断才能使用同一套证据。

本文由 OPEN RAMBO 发布。工程方案和伪代码用于说明设计,不是现有产品 API 文档;示例数字均为演示。

拆分生命周期

从请求、分配中和等待状态开始。分配失败不同于等待后过期。收到短信应记录为事件,不应推断用户已通过验证;接码系统通常无法观察目标应用的最终决定。

条件式状态迁移

通过当前版本做条件更新。取消与短信回调竞争时,一条迁移生效,另一条进入核对。不能让迟到的超时事件覆盖已收码事实。同时保存事件发生时间与处理时间,解释回调延迟。

资金状态独立保存

订单生命周期关联扣款或退款编号,不直接代表余额。已取消订单仍可能处于退款处理中,页面应明确区分。保留不可变迁移历史,并使用不含敏感资料的订单标识。

示意流程

allowed = {
  "allocating": {"waiting", "allocation_failed"},
  "waiting": {"received", "cancel_requested", "expired"}
}
# Reconciliation decides raced terminal outcomes.

如何验收

测试重复收码、取消与收码竞争、收码后才到达的超时事件。核验历史和账本,不只看最后的标签。

继续阅读