Files
Genarrative/docs/technical/ALIYUN_SMS_TIMESTAMP_FORMAT_FIX_2026-05-07.md

1.7 KiB
Raw Permalink Blame History

短信验证码阿里云时间戳格式修复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

预期:相关测试通过,格式检查通过。