Spring boot项目集成阿里云短信服务发送短信验证码

简介: Spring boot项目集成阿里云短信服务发送短信验证码

集成阿里云短信服务发送短信

前言

前期准备:需要在阿里云中开通了短信服务并进行相应的配置,可以在我的《阿里云短信服务》中查看系列博客。

系列博客:
一、阿里云 短信服务——发送短信验证码图文教程

二、阿里云 短信服务——开启验证码防盗刷监控

三、阿里云 短信服务——短信发送频率限制
言归正传,本篇博客主要内容是在项目中运用阿里云的短信服务发送短信验证码

业务场景:用户忘记密码,通过发送短信验证码验证用户的真实性

参考bilibili忘记密码的界面理解业务





实现步骤

阿里云官网实现参考地址:SDK地址
在项目不仅要能够实现发送短信验证码,更需要考虑到之后的可复用性、可维护、可扩充性。所以咱们不能仅仅的实现功能。为了之后如果需要发送其他形式的短信,如通知短信、营销短信。以及实现其他阿里云提供的短信服务相关的API如:查询短信发送统计信息、发送卡片短信、批量发送短信等等与短信相关的业务。需要将核心的配置抽离出来,再根据各种业务需求封账相应的实现类。这儿以业务发送短信中的发送短信验证码为例。

1.pom文件引入依赖

<!--阿里云短信服务-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.22</version>
        </dependency>

2.编写阿里云短信服务核心配置类

这块儿用到了nacos做配置管理,accessKeyId,accessKeySecret,endpoint都是从naocs中读取

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : ALiYunSMSConfig
 * @description : [阿里云短信服务配置类]
 * @createTime : [2022/11/7 15:39]
 * @updateUser : [WangWei]
 * @updateTime : [2022/11/7 15:39]
 * @updateRemark : [描述说明本次修改内容]
 */
@Configuration
@RefreshScope
public class ALiYunSMSConfig {
    //阿里云账号的accessKeyId
    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;
    //阿里云账号的accessKeySecret
    @Value("${aliyun.sms.accessKeySecret}")
    private String accessKeySecret;
    //短信服务访问的域名
    @Value("${aliyun.sms.endpoint}")
    private String endpoint;
    /*
     * @version V1.0
     * Title: createClient
     * @author Wangwei
     * @description 创建短信服务的代理
     * @createTime  2022/11/7 15:47
     * @param []
     * @return com.aliyun.dysmsapi20170525.Client
     */
    public com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint =endpoint ;
        return new com.aliyun.dysmsapi20170525.Client(config);
    }
}

3.短信服务管理业务实现类SMSConfigServiceImpl

用于实现短信服务相关的方法,目前只是实现了发送短信的方法。

sendShortMessage()实现发送短信,可以通过传入的参数不同,发送不同形式的短信,如短信验证码、通知短信、营销短信。

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teautil.models.RuntimeOptions;
import com.tfjy.arprobackend.config.ALiYunSMSConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : SMSConfigServiceImpl
 * @description : [短信服务管理业务实现类]
 * @createTime : [2022/11/5 17:16]
 * @updateUser : [WangWei]
 * @updateTime : [2022/11/5 17:16]
 * @updateRemark : [描述说明本次修改内容]
 */
@Service
public class SMSConfigServiceImpl{
    private static final Logger log = LogManager.getLogger();
    //阿里云短信服务配置类
    @Autowired
    ALiYunSMSConfig aLiYunSMSConfig;
/*
 * @version V1.0
 * Title: sendShortMessage
 * @author Wangwei
 * @description 发送短信
 * @createTime  2022/11/7 16:02
 * @param [sendSmsRequest]
 * @return com.aliyun.dysmsapi20170525.models.SendSmsResponse
 */
    public SendSmsResponse sendShortMessage(SendSmsRequest sendSmsRequest) throws Exception {
        //初始化配置信息
        Client client=aLiYunSMSConfig.createClient();
        //TODO 配置运行时间选项暂时未进行配置
        RuntimeOptions runtime = new RuntimeOptions();
        SendSmsResponse sendSmsResponse;
        try {
            //发送短信
             sendSmsResponse=client.sendSmsWithOptions(sendSmsRequest, runtime);
        }catch (Exception e){
            throw new Exception("调用阿里云发送短信接口失败",e);
        }
        log.info("调用阿里云发送短信接口成功");
        return sendSmsResponse;
    }
}

4.短信验证码配置类

主要是与发送短信验证码有关的参数配置,也将其放到了nacos中,使用的时候读取nacos中的配置

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : SMSConfigModel
 * @description : [短信验证码配置类]
 * @createTime : [2022/11/5 16:06]
 * @updateUser : [WangWei]
 * @updateTime : [2022/11/5 16:06]
 * @updateRemark : [描述说明本次修改内容]
 */
@RefreshScope
@Configuration
public class SMVCodeConfigModel {
    //短信签名名称
    @Value("${aliyun.sms.sMVCode.signName}")
    private String signName;
    //短信模板CODE
    @Value("${aliyun.sms.sMVCode.templateCode}")
    private String templateCode;
    //短信模板变量对应的实际值
    private String templateParam;
    //短信验证码存储在redis中的时间 单位分钟
    @Value("${aliyun.sms.sMVCode.limitTime}")
    private  String limitTime;
    public String getSignName() {
        return signName;
    }
    public void setSignName(String signName) {
        signName = signName;
    }
    public String getTemplateCode() {
        return templateCode;
    }
    public void setTemplateCode(String templateCode) {
        templateCode = templateCode;
    }
    public String getTemplateParam() {
        return templateParam;
    }
    public void setTemplateParam(String templateParam) {
        templateParam = templateParam;
    }
    public String getLimitTime() {
        return limitTime;
    }
    public void setLimitTime(String limitTime) {
        this.limitTime = limitTime;
    }
}

5.发送短信验证码核心代码

      //生成六位手机验证码
            String verificationCode = randomCodeUtils.randomCode();
            //拼接阿里云短信模板变量对应的实际值"{\"code\":\"+verificationCode+\"}";
            HashMap hashMap = new HashMap();
            hashMap.put("code", verificationCode);
            String templateParam = JSON.toJSONString(hashMap);
            //配置发送阿里云短信的请求体
            SendSmsRequest sendSmsRequest=new SendSmsRequest();
            //设置短信签名名称
            sendSmsRequest.setSignName(smvCodeConfigModel.getSignName());
            //设置短信模板Code
            sendSmsRequest.setTemplateCode(smvCodeConfigModel.getTemplateCode());
            //设置发送短信的手机号
            sendSmsRequest.setPhoneNumbers(phoneNumber);
            //设置短信模板变量对应的实际值
            sendSmsRequest.setTemplateParam(templateParam);
            //发送短信响应体
            SendSmsResponse sendSmsResponse;
            try {
                //调用阿里云短信服务发送短信验证码
                sendSmsResponse = smsConfigService.sendShortMessage(sendSmsRequest);
                log.info("调用阿里云短信服务发送短信验证码");
            } catch (Exception e) {
                throw new Exception("调用阿里云短信服务发送短信验证码接口失败!", e);
            }
            if (!sendSmsResponse.getBody().getCode().equals("OK")) {
                log.error("调用阿里云短信服务发送短信验证码失败 {}", sendSmsResponse);
                return false;
            }
            log.info("调用阿里云短信服务发送短信验证码成功 {}", sendSmsResponse);

生成六位随机数的方法

public  String randomCode() {
        StringBuffer  stringBuffer = new StringBuffer ();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            stringBuffer.append(random.nextInt(10));
        }
        return stringBuffer.toString();
    }

实现效果


如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

目录
相关文章
|
3月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
141 0
|
3月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
136 0
|
2月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
120 0
|
2月前
|
Java 开发工具 Spring
【Azure Application Insights】为Spring Boot应用集成Application Insight SDK
本文以Java Spring Boot项目为例,详细说明如何集成Azure Application Insights SDK以收集和展示日志。内容包括三步配置:1) 在`pom.xml`中添加依赖项`applicationinsights-runtime-attach`和`applicationinsights-core`;2) 在main函数中调用`ApplicationInsights.attach()`;3) 配置`applicationinsights.json`文件。同时提供问题排查建议及自定义日志方法示例,帮助用户顺利集成并使用Application Insights服务。
|
2月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
136 4
|
2月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
126 2
|
3月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
98 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
2月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
151 0
|
3月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
123 0
|
3月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
105 0