独立开发者的福音来啦!还在用传统的数据库验证吗?阿里云的号码认证服务真的太适合咱们平时学习和测试接口了。

它的接入流程非常友好,我整理了一份保姆级的一步步操作教程分享给大家。最给力的是它的计费方式,每条仅需 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

三、功能需求

  1. 发送短信验证码

    • 限制每 60 秒内同一手机号只能发送一次
  2. 验证短信验证码

    • 用户输入验证码时,调用阿里云接口验证
  3. 可拓展:每日发送次数统计、防刷机制


四、实现流程

如果需要文件

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 记录每日发送次数,超过限制返回提示

八、总结

  1. 阿里云短信验证码服务自带验证码生成和校验功能,后台无需自己存储验证码
  2. Redis 仅用于防刷和频率限制,保证接口安全
  3. 使用官方 CheckSmsVerifyCodeRequest 版本,避免复杂的 SmsToken 问题
  4. 前端 DTO 验证手机号和验证码格式,保证数据有效性
  5. 后续可扩展每日发送次数、黑名单、异步发送等功能

源码分享:

通过网盘分享的文件:sms-verifaction.zip
链接: https://pan.baidu.com/s/1VwLexX1Nr_-zGSKF1yXwZQ?pwd=s6mn
提取码: s6mn

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐