feat(sms): 短信验证码 极光→创蓝 容灾 fallback #204

Merged
guke merged 13 commits from feat/sms-jiguang-chuanglan-fallback into main 2026-07-31 11:17:32 +08:00

13 Commits

Author SHA1 Message Date
guke 8d5e062122 Merge branch 'main' into feat/sms-jiguang-chuanglan-fallback 2026-07-31 11:17:21 +08:00
guke 908df060a6 Merge branch 'main' into feat/sms-jiguang-chuanglan-fallback 2026-07-30 17:13:28 +08:00
guke 5281148488 harden(sms): SMS_FALLBACK_PROVIDER Literal 收窄为 Mode B(去 aliyun)
最终 review Minor:aliyun 是 Mode A(校验走接口、可抛 SmsError),不该做 Mode B
fallback 备。收窄 Literal 为 ["jiguang","chuanglan",""],pydantic 启动即挡住误配
SMS_FALLBACK_PROVIDER=aliyun。同步设计/计划文档。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 16:52:34 +08:00
guke 8f186bc8f7 docs(sms): .env.example 加 SMS_FALLBACK_PROVIDER 说明
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 16:44:38 +08:00
guke ca206bccb2 fix(sms): auth sms_send 接入 SendResult(修 cooldown_sec 500)+ 记 provider/fallback
批次2 将 send_code 返回类型 int→SendResult 后,sms_send 仍把它整体塞进
SmsSendResponse.cooldown_sec:int → pydantic ValidationError → 500。改为取
send_result.cooldown_sec;成功侧 EVENT_SMS_SEND details 加 provider/fallback。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 16:36:45 +08:00
guke 60c8fece23 feat(sms): verify_code try-both 遍历启用的 fallback 链
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 16:02:58 +08:00
guke f3cd9bd318 feat(sms): send_code 仅主 503 时转创蓝补发(429/400 不转)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 16:01:40 +08:00
guke 63e8083fbd feat(sms): send_code 返回 SendResult(主路径),迁移 dispatch 断言
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:58:35 +08:00
guke c9fad9bca8 fix(sms): SMS_FALLBACK_PROVIDER 用 Literal 约束 + base docstring 补 SendResult
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:50:58 +08:00
guke 0cd667618d feat(sms): 加 SMS_FALLBACK_PROVIDER 开关(默认空=关)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:40:47 +08:00
guke cbe1d340d6 feat(sms): 加 SendResult 结果类型(cooldown+provider+fallback)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:39:31 +08:00
guke 2399e56a45 docs(sms): 极光→创蓝 fallback 实现计划(TDD 7 任务)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:31:06 +08:00
guke 10ac1511c3 docs(sms): 极光→创蓝 短信容灾 fallback 设计方案
极光为主、创蓝为备:仅极光供应商不可用(SmsError status_code=503)时自动
转创蓝补发;本地冷却/超频(429)、手机号无效(400)不转。校验用 try-both
遍历「启用的 fallback 链」(关闭时只问极光,创蓝零参与);码只存实际发码那家
的进程内存,命中即知渠道、防爆破不被绕过。后台经 EVENT_SMS_SEND.details
(provider/fallback)+ 分派层日志区分实际渠道。开关 SMS_FALLBACK_PROVIDER
默认空=关、生产设 chuanglan、置空秒回退。

provider 文件(jiguang/chuanglan/aliyun)一行不动;仅改分派层 __init__ +
base(SendResult)+ config + auth 一处 details + 测试。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 15:21:04 +08:00