独立开发者必看:免费接入阿里云号码认证服务(一键登录)全攻略
基于 Spring Boot 3 + Redis + 阿里云短信认证服务(DypnsApi),完整实现了一套 短信验证码登录功能。文章从阿里云短信服务选型入手,详细对比了短信通知服务与短信认证服务的区别,重点介绍了短信认证服务中 SendSmsVerifyCode 与 CheckSmsVerifyCode 的正确使用方式。在实现过程中,引入 Redis 作为发送频率控制手段,有效防止短信接口被恶意
独立开发者的福音来啦!还在用传统的数据库验证吗?阿里云的号码认证服务真的太适合咱们平时学习和测试接口了。
它的接入流程非常友好,我整理了一份保姆级的一步步操作教程分享给大家。最给力的是它的计费方式,每条仅需 0.05 元,一杯奶茶钱就能做成百上千次测试,门槛极低,性能极强,强烈推荐!
如果之前没使用过的朋友可以进行免费试用,12个月100次调用发送短信接口
如果有疑问欢迎在评论区留言,刚开始上手可能会遇到一些小问题,比如服务使用错误,是阿里云的号码认证服务(不需要企业认证和资质) 并非是 ❌短信服务(需要企业认证),引入依赖也可能引入短信服务依赖导致需要验证等。
效果演示
浅浅写了一个小demo测试前端登录效果
web前端页面显示
手机收到验证码
验证码验证信息
查看阿里云的发送短信

流程图演示

准备阿里云服务
想要使用阿里云的号码认证服务,首先需要有阿里云的账号,跟着教程一步一步注册,很简单。
1、进入官网
进入阿里云官网后我们需要创建一个AccessKey(有的话就不需要了)
2、创建用户
这里有个提示,使用RAM用户,建议使用RAM
RAM 用户 (Resource Access Management): 也就是“子账号”。你可以创建一个专门用来发送短信或号码认证的子账号,只给它这一项权限,避免使用云账号AccessKey它是拥有最高权限,可以调用你的全部服务。
可以理解为云账号AccessKey是超级管理员,RAM 用户是普通用户。
AccessKey (AK): 由 AccessKey ID 和 AccessKey Secret 组成。
这里需要注意:一定一定不要让自己的AK泄漏给别人,否则其他人就能调用你的API,相当于你家的大门被打开了别人随便进

创建用户组
创建用户
创建用户完成后会生成一个AccessKey.csv 的文件,保存下来,这里账号密码只出现一次,后续就不能看到了。一定要保存下来,并且不要泄漏!!
完成之后,将用户添加到用户组中,方便管理
现在开始给用户赋予权限,一开始这里我也没有赋权限,导致发送短信时出现403
权限搜索:
- AliyunDysmsFullAccess
- AliyunRAMFullAccess
- AliyunSTSAssumeRoleAccess
- AliyunDypnsFullAccess
这样该用户就拥有了发送短信的权限,重要的事情说三遍:
AK不要泄漏!
AK不要泄漏!
AK不要泄漏!
3、开通号码认证服务
1、阿里云首页搜索:号码认证服务
- 点击免费试用
- 向下滑或者直接搜索,找到融合认证 - 个人认证
- 点击立即试用,这样你就拥有了100次免费调用的机会

2、然后重新搜索:号码认证服务,进入控制台开通使用短信认证的服务
进入控制台,向下滑动,找到功能开启,打开使用认证功能
这个时候你看一下,刚才领取的免费使用的套餐包

3、好的到这一步准备工作基本完成,下面就可以使用代码连接了。
这一步仅做了解,可以更直观的感受怎么发送的短信和需要哪些参数
开始在阿里云中测试发送短信
- 这里带
*号的选项是我们必须要填的,也是我们在代码中必须要配置的 - 右侧有不同的开发语言的sdk示例代码
- 我们可以填写手机号、签名名称和模版来测试,这里有提供的测试模版我们只需要将给出的模版填入就可以

Spring Boot + 阿里云短信验证码实现(含 Redis 限流)
一、项目背景
在实际业务中,注册/登录、敏感操作通常需要短信验证码验证用户身份。
本demo基于 Spring Boot 3 + 阿里云短信服务实现短信发送与校验,并使用 Redis 做发送频率限制,保证用户体验同时防止恶意刷接口。
二、技术栈
- Spring Boot 3.3.4
- 阿里云短信认证服务 (
dypnsapi20170525) - Redis(限流/发送锁)
- MyBatis + MySQL(可选,业务数据库)
- Lombok、Jakarta Validation
三、功能需求
-
发送短信验证码
- 限制每 60 秒内同一手机号只能发送一次
-
验证短信验证码
- 用户输入验证码时,调用阿里云接口验证
-
可拓展:每日发送次数统计、防刷机制
四、实现流程
如果需要文件
0.pom文件
调用最主要的pom文件
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dypnsapi20170525</artifactId>
<version>2.0.0</version>
</dependency>
1. 配置阿里云客户端
在 AliyunSmsConfig 中注入 dypnsapi20170525.Client:
注意这里的
@Bean
public com.aliyun.dypnsapi20170525.Client dypnsClient() throws Exception {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
config.endpoint = "dypnsapi.aliyuncs.com";
return new com.aliyun.dypnsapi20170525.Client(config);
}
- AK/SK 建议放在
application.yml中 - Endpoint 固定为
dypnsapi.aliyuncs.com
2. 发送短信
在 SmsServiceImpl.sendLoginCode 方法中:
SendSmsVerifyCodeRequest request = new SendSmsVerifyCodeRequest()
.setPhoneNumber(phone)
.setSignName("速通互联验证码")
.setTemplateCode("100001")
.setTemplateParam("{\"code\":\"##code##\",\"min\":\"5\"}");
SendSmsVerifyCodeResponse response = dypnsClient.sendSmsVerifyCodeWithOptions(request, new RuntimeOptions());
// 发送成功后设置 Redis 锁,限制频率
redisTemplate.opsForValue().set(lockKey, "1", SMS_LOCK_EXPIRE, TimeUnit.SECONDS);
好处:
- 阿里云接口自动生成验证码
- Redis 用于发送锁,防止重复发送
3. 校验验证码
使用官方示例的 CheckSmsVerifyCodeRequest:
var request = new CheckSmsVerifyCodeRequest()
.setPhoneNumber(phone)
.setVerifyCode(code);
var response = dypnsClient.checkSmsVerifyCodeWithOptions(request, new RuntimeOptions());
// 判断是否验证成功
return response.getBody() != null && "OK".equals(response.getBody().getCode());
✅ 注意事项:
- 不需要
SmsToken,官方示例中CheckSmsVerifyCodeRequest即可 - 阿里云服务端会自动管理验证码有效期
4. Redis 限流
private static final String SMS_LOCK_PREFIX = "sms:lock:";
private static final long SMS_LOCK_EXPIRE = 60; // 60秒锁
// 发送前检查
if (redisTemplate.hasKey(lockKey)) {
throw new RuntimeException("操作过于频繁,请稍后再试");
}
- 避免同一手机号 60 秒内重复发送
- 可扩展每日发送次数统计、防刷策略
五、前端 DTO
发送验证码 DTO
@Data
public class SmsCodeSendDTO {
@NotBlank
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
}
验证验证码 DTO
@Data
public class SmsCodeVerifyDTO {
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
@NotBlank(message = "验证码不能为空")
@Size(min = 4, max = 6, message = "验证码长度不正确")
private String code;
}
六、Controller 层
@RestController
@RequestMapping("/api/sms")
@RequiredArgsConstructor
public class SmsController {
private final SmsService smsService;
@PostMapping("/send")
public String sendCode(@RequestBody @Valid SmsCodeSendDTO dto) {
smsService.sendLoginCode(dto.getPhone());
return "验证码已发送";
}
@PostMapping("/verify")
public String verify(@RequestBody @Valid SmsCodeVerifyDTO dto) {
boolean isOk = smsService.verifyCode(dto.getPhone(), dto.getCode());
return isOk ? "验证成功" : "验证码错误或已失效";
}
}
七、接入中可能遇到的问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
Cannot resolve method 'getSmsToken' |
之前参考旧版本 SDK 文档尝试获取 SmsToken | 改为使用 CheckSmsVerifyCodeRequest 校验,不需要 SmsToken |
验证失败返回 400 SmsToken is mandatory |
使用了 VerifySmsCodeRequest 接口版本 |
统一使用官方示例 checkSmsVerifyCodeWithOptions,仅手机号+验证码 |
| 短信重复发送 | 用户频繁请求发送接口 | Redis 设置发送锁,60 秒内拒绝重复发送 |
| 每日发送次数控制 | 用户大量刷接口 | Redis 记录每日发送次数,超过限制返回提示 |
八、总结
- 阿里云短信验证码服务自带验证码生成和校验功能,后台无需自己存储验证码
- Redis 仅用于防刷和频率限制,保证接口安全
- 使用官方
CheckSmsVerifyCodeRequest版本,避免复杂的SmsToken问题 - 前端 DTO 验证手机号和验证码格式,保证数据有效性
- 后续可扩展每日发送次数、黑名单、异步发送等功能
源码分享:
通过网盘分享的文件:sms-verifaction.zip
链接: https://pan.baidu.com/s/1VwLexX1Nr_-zGSKF1yXwZQ?pwd=s6mn
提取码: s6mn
更多推荐



所有评论(0)