注册、登录、找回密码这些场景里,短信验证码通常是第一道身份核验。阿里云短信服务的发送接口接入本身不难,但上线后,团队常遇到三类问题:收不到短信、被人刷量、费用超出预期。本文先说明接入前要准备的材料,再讲基础发送流程,最后用一个实际案例说明排查思路。

一、接入前需要准备什么
调用接口之前,需要先备好三样东西。
- 短信签名:一般是企业或应用名称,要提交资质材料并等待审核。签名内容必须和申请主体一致,名称对不上时,审核很容易被驳回。
- 短信模板:验证码类模板要写清用途,例如“您的验证码是${code},5 分钟内有效,请勿泄露。”${code} 这类变量由程序在发送时替换。模板里尽量只放验证码相关的内容。
- AccessKey:调用 API 时使用的身份凭证。建议新建子账号,只授予短信相关的最小权限,不要直接用主账号的密钥。
签名和模板通过审核后才能正式发送。不少团队在测试阶段就用未审核的内容发短信,等到上线当天才发现发不出去。审核需要时间,最好把它算进排期里。
二、基础调用流程
发送验证码一般分四步:生成随机验证码,调用 SendSms 接口发送,把验证码和过期时间存入缓存(例如 Redis),用户提交后取出比对。
生成验证码时,用密码学安全的随机数函数,不要用普通的随机数方法。有效期设为 5 分钟左右比较常见。验证成功或失败后,都要及时作废这条验证码,避免同一个码被重复使用。
三、案例:某社交 App 的注册验证码故障
一家做本地生活社交的小团队,在 2023 年某个周末上线了新版注册流程。上线第一天,客服接到大量投诉,用户反映“收不到验证码”。后台日志显示接口返回成功,但手机上确实没有短信。
团队按下面的顺序排查:
- 查看发送记录,确认请求参数正确,模板 ID 与审核通过的版本一致。
- 检查回执状态。回执显示部分号码被“运营商拦截”,而且集中在某一个省份的某家运营商。接口返回成功只代表请求已受理,并不代表用户收到了短信,所以回执才是判断投递结果的依据。
- 对比发送内容,发现新版模板里加入了外部链接,链接域名没有在备案中登记。运营商把这条短信判为可疑内容,于是拦截。
修复方法很直接:去掉模板中的外链,重新提交审核。审核期间,临时改用语音验证码作为备用通道。两天后,投递成功率恢复正常。这件事说明,模板内容会直接影响投递结果,只看接口返回值是不够的。
同一周还出现了另一个问题。有用户在短时间内反复点击“获取验证码”,当天的短信费用达到平时的数倍。团队随后增加了频率限制:同一手机号 60 秒内只能发送一次,同一手机号每天最多发 10 条。费用很快回落。
四、常见问题与排查清单
- 收不到短信:先看回执状态,判断是发送失败还是运营商拦截。再核对签名、模板内容和号码格式。号码最好统一成一种格式,国内号码统一为 11 位,或统一为国际格式,避免同一号码两种写法被当作不同号码处理。
- 发送被拒绝:常见原因包括调用频率超限、模板变量长度不符合要求,以及账户余额不足。遇到拒绝时,先看返回的错误码,再对照这三项逐一检查。
- 被刷量:在发送接口前加入图形验证码或人机验证,并对同一手机号、同一 IP 设置发送上限。只在前端做限制是不够的,服务端也要做。
- 验证码被重复使用:验证成功后立即删除缓存中的记录。连续输错超过阈值时,锁定该手机号的校验一段时间。
- 费用异常:设置用量告警,每天或每周看一次按日的发送统计。发现某个号码或某个 IP 发送量突增,先暂停它的发送权限,再查原因。
五、安全与合规注意事项
验证码的安全性取决于整个流程,短信本身只是其中一环。接口必须在服务端做校验,前端的限制可以被绕过。日志里不要明文记录验证码,AccessKey 应保存在环境变量或密钥管理服务中,不要写进代码仓库。
涉及用户手机号的数据,要按照所在地区的个人信息保护规定处理,并在隐私政策中说明手机号的用途和保存期限。
短信也可能被拦截,或者手机号被他人占用后收到验证码。对于转账、提现、修改绑定手机等敏感操作,单靠一条短信不够,建议再加一道校验,例如人脸核验或已绑定设备的确认。
六、总结
使用阿里云短信验证码,最需要盯住三件事:签名和模板合规,接口有频率限制和防刷措施,发送后查看投递回执并据此排查。做到这三点,大部分收不到验证码和费用异常的问题都能提前避开。