1.7 KiB
1.7 KiB
短信验证码阿里云时间戳格式修复(2026-05-07)
背景
使用阿里云短信验证码真实 provider 发送验证码时,接口返回:
短信验证码发送失败:Specified time stamp or date value is not well formatted.
该错误来自阿里云 OpenAPI 网关对签名请求头 x-acs-date 的格式校验。
根因
server-rs/crates/platform-auth/src/lib.rs 中阿里云 ACS3 签名逻辑会构造 x-acs-date 请求头。
原实现使用 time::format_description::well_known::Rfc3339,当 OffsetDateTime::now_utc() 带纳秒时会生成形如:
2026-05-07T14:23:59.364767Z
阿里云 ACS3 签名要求 x-acs-date 使用不带小数秒的 UTC ISO 8601 格式:
yyyy-MM-dd'T'HH:mm:ss'Z'
即:
2026-05-07T14:23:59Z
带小数秒的时间戳会被阿里云网关判定为格式非法,从而返回 Specified time stamp or date value is not well formatted.。
修复方案
将 current_aliyun_timestamp() 改为手动输出不带小数秒的 UTC ISO 8601 格式:
yyyy-MM-dd'T'HH:mm:ss'Z'
并新增单元测试,确保:
- 长度等于
2026-05-07T12:34:56Z; - 固定位置包含
-、T、:、Z; - 不包含小数点;
- 除固定分隔符外均为数字。
影响范围
- 仅影响阿里云短信验证码 provider 的请求签名头
x-acs-date。 - 不改动短信模板、签名、验证码业务参数。
- 不改动 mock 短信 provider。
- 不涉及前端接口契约变化。
验收
执行:
cd server-rs
cargo test -p platform-auth aliyun -- --nocapture
cargo fmt -p platform-auth --check
预期:相关测试通过,格式检查通过。