news 2026/9/19 17:49:53

三步搞定短信验证码!SpringBoot集成阿里云短信实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三步搞定短信验证码!SpringBoot集成阿里云短信实战

大家好,我是小悟。

在SpringBoot项目中集成阿里云短信服务,核心是完成一系列前置申请,并调用其官方SDK发送短信。整个流程从前置准备到代码集成,步骤清晰。

阿里云短信服务概述

阿里云短信服务提供高并发、安全的全球短信发送能力,支持验证码、通知、营销等场景。其主要特点如下:

特性维度具体说明
核心能力提供三网合一通道,秒级可达,支持国内及全球200多个国家/地区。
安全与管控基于阿里云账户与RAM权限管理,支持设置日发送量上限、单用户频次阈值,并具备验证码防盗刷监控。
计费模式采用短信套餐包优先抵扣,超出后按量计费的模式。国内验证码/通知短信低至0.045元/条起。
使用限制仅支持企业认证账号;发送前需完成资质、签名、模板的申请与审核;对发送频率有严格限制(例如验证码同一号码最多1条/分钟)。

集成前必须完成的控制台配置

编写代码前,你必须在阿里云控制台完成一系列配置,这是短信发送的前提。

  1. 开通服务与购买资源包
    • 完成企业实名认证并登录短信服务控制台开通服务。
    • 根据业务需要(国内或国际)购买短信套餐包
  2. 创建AccessKey
    • 为安全起见,建议为应用创建RAM子用户并授权AliyunDysmsFullAccess策略。
    • 为该子用户创建AccessKey(AccessKey ID和AccessKey Secret),后续代码将使用它调用API。切勿直接使用主账号的AccessKey
  3. 申请短信签名与模板
    • 签名:在“国内消息”或“国际/港澳台消息”菜单下申请。签名是显示在短信开头的标识,如【企业名称】,用于标识发送方。审核通常需2小时。
    • 模板:短信内容模板,支持变量。例如验证码模板:“您的验证码为:${code},5分钟内有效。”模板审核同样约需2小时。
    • 重要提示:签名和模板均审核通过后方可使用。国内签名还需完成运营商实名报备(需7-15个工作日),报备成功前发送可能失败。

SpringBoot项目集成详细步骤

完成控制台配置后,即可在SpringBoot项目中集成。

第1步:添加Maven依赖
在项目的pom.xml中添加阿里云短信服务SDK的依赖。

<dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20180501</artifactId> <version>2.0.24</version> <!-- 请使用Maven仓库中的最新版本 --> </dependency>

第2步:配置应用参数
application.ymlapplication.properties中配置必要的参数。

# application.yml 配置示例 aliyun: sms: # 从控制台获取的AccessKey信息 access-key-id: your-access-key-id access-key-secret: your-access-key-secret # 短信服务接入点(Endpoint),国内一般为 dysmsapi.aliyuncs.com endpoint: dysmsapi.aliyuncs.com # 控制台申请并通过审核的签名名称(无需加【】) sign-name: 你的签名 # 控制台申请并通过审核的模板CODE template-code: SMS_123456789

第3步:创建配置类与Service
创建一个配置类来初始化SDK客户端,并编写发送短信的服务类。

import com.aliyun.dysmsapi20180501.Client; import com.aliyun.teaopenapi.models.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; @Configuration public class AliyunSmsConfig { @Value("${aliyun.sms.access-key-id}") private String accessKeyId; @Value("${aliyun.sms.access-key-secret}") private String accessKeySecret; @Value("${aliyun.sms.endpoint}") private String endpoint; /** * 创建并返回阿里云短信服务的Client实例。 * 该Bean可用于整个Spring容器。 */ @Bean public Client createClient() throws Exception { Config config = new Config() .setAccessKeyId(accessKeyId) .setAccessKeySecret(accessKeySecret); config.endpoint = endpoint; return new Client(config); } }
import com.aliyun.dysmsapi20180501.Client; import com.aliyun.dysmsapi20180501.models.SendMessageWithTemplateRequest; import com.aliyun.dysmsapi20180501.models.SendMessageWithTemplateResponse; import com.aliyun.teautil.models.RuntimeOptions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class SmsService { @Autowired private Client smsClient; @Value("${aliyun.sms.sign-name}") private String signName; @Value("${aliyun.sms.template-code}") private String templateCode; /** * 发送短信验证码 * @param phoneNumber 目标手机号(国内号码需带国际区号86) * @param templateParam 模板变量对应的JSON字符串,如:{"code":"123456"} * @return 是否发送成功 */ public boolean sendSms(String phoneNumber, String templateParam) { try { SendMessageWithTemplateRequest request = new SendMessageWithTemplateRequest() .setTo(phoneNumber) // 接收方手机号 .setSignName(signName) // 短信签名 .setTemplateCode(templateCode) // 短信模板CODE .setTemplateParam(templateParam); // 模板变量JSON RuntimeOptions runtime = new RuntimeOptions(); SendMessageWithTemplateResponse response = smsClient.sendMessageWithTemplateWithOptions(request, runtime); // 根据响应判断是否成功,"OK"表示成功[citation:4] return "OK".equals(response.getBody().getResponseCode()); } catch (Exception e) { // 此处应记录日志,并根据业务需要进行异常处理 e.printStackTrace(); return false; } } }

第4步:在Controller中调用
创建一个简单的控制器来提供发送短信的HTTP接口。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class SmsController { @Autowired private SmsService smsService; @GetMapping("/sendCode") public String sendVerificationCode(@RequestParam String phone) { // 生成随机验证码(示例) String code = String.valueOf((int)((Math.random() * 9 + 1) * 100000)); // 构造模板参数(必须与申请模板时的变量名一致) String templateParam = "{\"code\":\"" + code + "\"}"; boolean isSuccess = smsService.sendSms(phone, templateParam); if (isSuccess) { // 在实际业务中,此处应将验证码与手机号关联并存入缓存(如Redis),设置有效期 return "验证码发送成功!"; } else { return "验证码发送失败,请稍后重试。"; } } }

总结

按照上述步骤,即可在SpringBoot项目中集成阿里云短信。最后,有几个关键点需要注意:

  1. 资质与审核是关键前提:务必确保使用企业认证账号,并提前完成签名、模板的申请和审核。国内签名还需要等待运营商报备成功,否则发送会失败。
  2. 安全第一:AccessKey相当于账号密码,务必通过环境变量或配置服务器管理,切忌硬编码在代码中提交至版本库。
  3. 关注限制与成本:严格遵守发送频率限制(如1条/分钟/号)。发送测试短信也会产生费用,请注意账户余额。
  4. 生产环境建议:应考虑异步发送、失败重试、发送状态回执(SmsReport)接收等机制以提升稳定性和可靠性。

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 2:07:43

1.2.2 国内主流AI模型深度测评:通义千问、文心一言、讯飞星火全面对比

1.2.2 国内主流AI模型深度测评:通义千问、文心一言、讯飞星火全面对比 引言 在上一节(1.2.1)中,我们深入了解了三大国际主流AI模型。但对于国内用户来说,国产AI模型在中文理解、网络访问、性价比等方面具有独特优势。本节将全面测评三大国产主流AI模型:通义千问、文心一…

作者头像 李华
网站建设 2026/9/11 10:03:16

1.5 提示词优化实战:从基础到进阶的完整指南

1.5 提示词优化实战:从基础到进阶的完整指南 引言:提示词工程的实践价值 在前面的章节中,我们学习了提示词工程的基础概念和黄金法则。然而,理论知识只有通过实践才能真正转化为技能。提示词优化是一个需要大量实践和不断迭代的过程,优秀的提示词往往是在多次试验和调整…

作者头像 李华
网站建设 2026/9/13 16:59:01

沙虫病毒与供应链安全:软件供应链成为网络安全的阿喀琉斯之踵

无论是React2Shell、沙虫病毒&#xff08;Shai-Hulud&#xff09;还是XZ Utils漏洞&#xff0c;软件供应链安全正面临多重风险威胁。现代应用程序由众多组件构成&#xff0c;每个组件连同其开发环境都可能成为攻击入口。无论企业是自主开发代码还是依赖第三方供应商&#xff0c…

作者头像 李华
网站建设 2026/9/1 4:16:56

水厂安全监测管理系统:御控物联网方案

在城市化快速发展的今天&#xff0c;供水安全已成为城市生命线的核心保障。然而传统水厂监测依赖人工巡检、数据分散、响应滞后等痛点长期存在。御控物联网水厂安全远程监测系统&#xff0c;正以数字化、智能化技术重塑供水安全监测新范式。深度痛点&#xff1a;传统水厂安全监…

作者头像 李华
网站建设 2026/9/12 2:03:54

51单片机(1)

一、嵌入式与 51 单片机基础认知&#xff08;一&#xff09;嵌入式系统概念嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪的专用计算机系统。它广泛应用于智能家居、工业控制、智能穿戴等众多领域&#xff0c;核心特点是针对性强、资源利用…

作者头像 李华
网站建设 2026/9/16 10:31:58

程序员如何转行大模型?一份详尽的学习路线与实战指南,一份详细攻略_转行大模型学习路线

本文为程序员提供大模型领域转行攻略&#xff0c;涵盖明确方向、掌握基础知识、深入学习Transformer架构、预训练微调技术、实践项目、参与开源社区等关键环节。同时提供七个阶段学习路径和免费资源&#xff0c;帮助小白从零开始系统学习大模型技术&#xff0c;构建个人品牌&am…

作者头像 李华