用户注册、找回密码、订单通知,这些地方最常用到短信验证码。门槛低,短信到达快,但真正接入时,不少团队会卡在资质审核、模板报备和频率限制上。这篇文章按实际项目的顺序,讲阿里云短信验证怎么接,以及几个常见问题怎么处理。

先想清楚验证码要干什么
很多人把短信验证理解成“发一个六位数字”。实际上它至少做三件事:确认手机号是本人的,拦住批量注册和恶意刷接口,在改密码、换绑手机这类敏感操作前做二次确认。三件事的需求不一样,所以验证码的有效期、重发间隔和失败次数上限也该分开设。
举个例子。某电商小程序上线初期只做注册验证,验证码有效期设成30分钟,每个手机号每天可以请求50次。一周后客服接到大量投诉,有人用脚本批量请求验证码,短信费用一天就超出预算两倍。团队后来把有效期缩短到5分钟,同一手机号60秒内只能请求一次,同一IP每小时限20次,问题很快压住。参数设计本身就是风控的一部分,上线前就该定下来。
阿里云短信服务的基本概念
阿里云短信服务(SMS)的概念不多,先弄清下面四个,接入时就不容易乱:
- 签名:短信开头的【某某公司】。要和企业名称或产品名称一致,并通过审核。
- 模板:短信正文的固定格式,变量用 ${code} 这类占位符表示。验证码类模板要单独报备,内容里不能夹带营销信息。
- AccessKey:调用接口用的身份凭证。建议用 RAM 子账号的密钥,并只授予短信相关权限。
- 发送接口:调用 SendSms,提交手机号、签名、模板编码和变量内容,返回发送回执。
签名和模板的审核通常要几个小时到一两个工作日。审核不过,一般要按提示改好再重新提交。所以开发初期就提交,别等测试环境全跑通了才发现卡在审核上。
接入步骤与代码示例
接入大致分四步:开通服务并完成资质备案,创建签名和验证码模板,配置 RAM 账号与密钥,在服务端调用发送接口。下面是用 Node.js SDK 发送验证码的一段示例。密钥从环境变量读取,不要写进代码仓库。
示例仅供参考,实际项目请以阿里云最新 SDK 文档为准。
const Dysmsapi20170525 = require('@alicloud/dysmsapi20170525');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const client = new Dysmsapi20170525.default(
new OpenApi.Config({
accessKeyId: process.env.ALIYUN_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIYUN_ACCESS_KEY_SECRET,
endpoint: 'dysmsapi.aliyuncs.com',
})
);
async function sendVerifyCode(phone, code) {
const request = new Dysmsapi20170525.SendSmsRequest({
phoneNumbers: phone,
signName: '你的签名',
templateCode: 'SMS_XXXXXXX',
templateParam: JSON.stringify({ code }),
});
const res = await client.sendSmsWithOptions(request, new Util.RuntimeOptions({}));
if (res.body.code !== 'OK') {
throw new Error(`短信发送失败:${res.body.message}`);
}
return res.body.bizId;
}
验证码要在服务端生成,和手机号一起写入缓存(如 Redis),并设置过期时间。校验时只比对缓存里的值。校验成功,或失败次数超过上限后,立刻删除这条记录,防止同一个验证码被重复使用。
风控与成本
短信验证最容易被滥用,风控要从第一天就放进去。常见做法有:
- 同一手机号设发送间隔,比如60秒,同时限制每日上限。
- 同一IP、同一设备的请求做限流。超过阈值后,改用图形验证码或人机校验。
- 验证码输错达到一定次数(如5次)就作废,要求用户重新获取。
- 监控发送量、失败率和运营商返回状态,出现异常及时告警。
成本上,根据业务量在预付费套餐和按量计费之间选,并定期对账单。国际短信和部分地区号段的单价差距很大,需要单独核算,不能直接套用国内的预算。
常见问题怎么查
开发中出现得最多的几类问题,可以这样排查:
- 签名或模板未通过:多半是签名和企业名称对不上,或者模板内容带了营销性质。按审核意见修改,再重新提交。
- 返回 isv.BUSINESS_LIMIT_CONTROL:触发了平台限流。先检查是否有循环调用,或者重试逻辑没有设置上限。
- 用户反馈收不到短信:先看回执状态,再确认手机号是否带了国家码。然后排查运营商拦截,以及用户手机上的垃圾短信过滤设置。
- 验证码被刷:按上一节补充限流,同时检查接口是否缺少图形验证或登录态校验。
上线前后
阿里云短信验证的接入本身不复杂。费时间的主要是签名模板报备、频率和有效期的设计,以及上线后的风控和成本监控。建议先用自己的手机号在测试环境完整跑一遍,再逐步放量。验证码是需要持续运营的安全能力,上线只是开始。