避免联通实名回调因内部长度限制永久失效
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m9s

将实名事件身份收敛为受 Outbox 上限约束的稳定摘要,并允许相同 CUCC 回调原子认领失败终态后重试。

Constraint: 运营商回调固定返回成功,公共 Outbox event_id 上限为 64 字符

Rejected: 扩大数据库字段 | 根因是不受控事件 ID,且无法解决旧 failed 回调被吞

Confidence: high

Scope-risk: moderate

Directive: 新增稳定事件 ID 时必须服从持久化长度上限;失败回调恢复必须使用条件更新原子认领

Tested: gofmt;git diff --cached --check

Not-tested: 按用户要求未运行自动化测试、构建或测试环境重放
This commit is contained in:
2026-07-30 09:05:23 +08:00
parent c89291b362
commit 1141167598
5 changed files with 49 additions and 6 deletions

View File

@@ -10,7 +10,9 @@
- 合法 ICCID 只按 19/20 位对应列精确查询;不复制旧代码的 20 位截 19 位,不跨列降级,也不任取多匹配卡。
- 使用 `ICCID + dateChanged` 的安全摘要作为语义幂等键;解析失败使用正文摘要,重复、冲突和中断恢复沿用 Integration Log 租约规则。
- 内部失败终态收到相同正文重推时,原子恢复为 `pending` 并递增尝试次数;成功等其他终态仍保持幂等跳过。
- 唯一命中后调用公共 `ApplyCardObservation(verified=true)`,实名事实变化时由公共用例写 Outbox并尽力提前完成同卡实名观测序列。
- 卡实名 Outbox 事件 ID 使用受长度上限约束的稳定摘要,避免上游观测 ID 过长导致业务事务回滚。
- 不调用旧 `inner_callback`、第三方推送、旧平台登录、`ModifyDate` 或 Gateway 二次确认;`dateChanged` 只作为上游变更时间和幂等语义留痕,不直接改写本地业务时间。
- 无论开关状态、报文结果或内部处理结果,均返回入口时间对应的 HTTP 200 固定 JSON 应答,避免运营商不可控重推。