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

本文涉及的产品
数字短信套餐包(仅限零售电商行业),100条 12个月
国际/港澳台短信套餐包,全球plus 100条 6个月
短信服务,200条 3个月
简介: 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();
    }

实现效果


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

目录
相关文章
|
23天前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
31 3
|
11天前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
|
13天前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
44 5
|
15天前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
23 1
|
26天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
39 2
|
16天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
29 0
|
2月前
|
存储 JavaScript 数据库
ToB项目身份认证AD集成(一):基于目录的用户管理、LDAP和Active Directory简述
本文介绍了基于目录的用户管理及其在企业中的应用,重点解析了LDAP协议和Active Directory服务的概念、关系及差异。通过具体的账号密码认证时序图,展示了利用LDAP协议与AD域进行用户认证的过程。总结了目录服务在现代网络环境中的重要性,并预告了后续的深入文章。
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
|
安全 Java 测试技术
ToB项目身份认证AD集成(二):快速搞定window server 2003部署AD域服务并支持ssl
本文详细介绍了如何搭建本地AD域控测试环境,包括安装AD域服务、测试LDAP接口及配置LDAPS的过程。通过运行自签名证书生成脚本和手动部署证书,实现安全的SSL连接,适用于ToB项目的身份认证集成。文中还提供了相关系列文章链接,便于读者深入了解AD和LDAP的基础知识。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
197 2