您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot实现阿里云SMS短信发送功能

时间:2020-12-31 12:46:33  来源:  作者:

短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信验证码从而找回密码”、“双重验证用户身份时需要用手机号接收平台发送的验证码已确认用户身份”等等都是比较常见的,本文将基于阿里云SMS短信发送服务 在JAVA Spring Boot应用系统实现短信发送功能

移动互联网时代,几乎人人都有部智能手机,每天的收、发短信操作想必已成常态,在使用各种App或者网站应用系统时相比也应该经常都能有所见闻;而作为一名Java开发者,不知诸位在实际项目、实际应用系统中是否有真正地实现过短信发送以及对短信验证码进行验证的功能?今天debug将带大家一起实战落地该功能!

顺带提下,我们将基于Spring Boot2.x进行代码实战,别问为什么哈!作为一名Java开发者,如果都不知道Spring Boot,debug都不知道该怎么说你了!另外,我们将基于阿里云SMS短信发送服务功能,其官网如下所示:https://www.aliyun.com/product/sms,可以点击购买或者免费开通,如果人品好的话,估计还真的可以免费开通(免费试用几条);

干货实战-Spring Boot实现阿里云SMS短信发送功能

 

在这里,debug就假设诸位已经成功开通了阿里云SMS短信发送服务了哈(如果没有开通成功也没关系,收藏下文章吧,以后总有用得着的),OK,话不多说,咱们直接开干!

(1)首先,需要加入阿里云短信SMS服务的SDK,即对于我们Java后端而言,其实就是一个Jar包,如下所示:

<!--阿里云短信服务-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.0</version>
</dependency>

(2)紧接着是进入阿里云短信服务管理控制台,获取AccessKey ID 、AccessKey Secret并创建“短信签名”以及“短信发送模板”,如下图所示:

干货实战-Spring Boot实现阿里云SMS短信发送功能

 


干货实战-Spring Boot实现阿里云SMS短信发送功能

 

拿到这些信息之后,接下来需要将这些信息项配置起来,如下所示:

#阿里云sms配置
ali.sms.accessKeyId=这里是你的AccessKey ID
ali.sms.accessSecret=这里是你的AccessKey Secret
ali.sms.regionId=cn-hangzhou
ali.sms.sysDomain=dysmsapi.aliyuncs.com
ali.sms.sysVersion=2017-05-25
ali.sms.sysAction=SendSms
ali.sms.enabled=true


ali.sms.phone.sendCode.bu=申请的短信签名
ali.sms.phone.sendCode.temp=申请的短信模板编码
ali.sms.phone.sendCode.msg=备注信息

之后便可以基于SpringBoot自动注入配置的功能特性将以上配置项加入到一个实体类中,以方便后续开发实际业务代码时使用,其定义如下所示:

@Configuration
@ConfigurationProperties(prefix = "ali.sms")
@Data
public class AliSmsProperty {
    private String accessKeyId;


    private String accessSecret;


    private String regionId;


    private String sysDomain;


    private String sysVersion;


    private String sysAction;


    private Boolean enabled;
}

(3)紧接着,开发调用阿里云短信服务SMS的SDK提供的发送短信功能 的代码,如下所示:

@Service
public class AliSmsService {
    private static final Logger log= LoggerFactory.getLogger(AliSmsService.class);


    private static final String Channel="aliyun";


    @Autowired
    private AliSmsProperty aliSmsProperty;


    @Autowired
    private ObjectMapper objectMapper;


    //发送通用消息
    public void sendMsg(AliSmsRequest smsRequest,final Long sendId) throws Exception{
        if (!aliSmsProperty.getEnabled()){
            return;
        }


        //参数校验


        //短信配置初始化
        DefaultProfile profile=DefaultProfile.getProfile(aliSmsProperty.getRegionId(),aliSmsProperty.getAccessKeyId(),aliSmsProperty.getAccessSecret());
        IAcsClient client=new DefaultAcsClient(profile);
        //构造短信发送请求
        CommonRequest request=new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain(aliSmsProperty.getSysDomain());
        request.setSysVersion(aliSmsProperty.getSysVersion());
        request.setSysAction(aliSmsProperty.getSysAction());


        request.putQueryParameter("RegionId", aliSmsProperty.getRegionId());
        request.putQueryParameter("PhoneNumbers", smsRequest.getPhoneNumbers());
        request.putQueryParameter("SignName", smsRequest.getSignName());
        request.putQueryParameter("TemplateCode", smsRequest.getTemplateCode());
        request.putQueryParameter("TemplateParam", smsRequest.getTemplateParam());


        request.putQueryParameter("SmsUpExtendCode", RandomStringUtils.randomNumeric(4));
        request.putQueryParameter("OutId", smsRequest.getTemplateCode()+"_"+RandomStringUtils.randomAlphanumeric(8));


        //发送短信
        CommonResponse response = client.getCommonResponse(request);
        log.info("--阿里云短信发送结果:{},{},{}----",response.getHttpStatus(),response.getHttpResponse(),response.getData());


        if (response!=null && StringUtils.isNotBlank(response.getData())){
            AliSmsResponse smsResponse=objectMapper.readValue(response.getData(),AliSmsResponse.class);
            if (smsResponse!=null && "OK".equals(smsResponse.getCode())){
                //创建一条短信发送成功的记录(记录到数据库DB,以用于后续的验证码验证)
                
            }else{
                //创建一条短信发送失败的记录
            }
        }
    }
}

其中,AliSmsRequest为开放给客户端调用的参数,其定义如下所示:

@Data
public class AliSmsRequest implements Serializable{
    //要接受短信的手机号
    private String phoneNumbers;


    //申请的短信签名
    private String signName;


    //申请的模板编码
    private String templateCode;


    //短信发送参数-json格式的字符串,如{"code":123456}
    private String templateParam;


    //短信发送上行编码-按照官方建议的填就行
    private String smsUpExtendCode;
    //序列id-按照官方建议的填就行
    private String outId;


    public AliSmsRequest(String phoneNumbers, String signName, String templateCode, String templateParam) {
        this.phoneNumbers = phoneNumbers;
        this.signName = signName;
        this.templateCode = templateCode;
        this.templateParam = templateParam;
    }


    public AliSmsRequest() {
    }
}

至此,我们已经将发送短信的核心代码撸完了,其中传递给服务端的参数的格式为(以发送短信验证码为例):

{
    "phoneNumbers":"15812490898",
    "signName":"申请的短信签名",
    "tempCode":"申请的短信模板编码",
    "templateParam":"{"code":"708946"}",
    "smsUpExtendCode":"12345678",
    "outId":"12345678"      
}

如果过程没有报错,不出5秒应该会收到一条短信,如下图所示:

干货实战-Spring Boot实现阿里云SMS短信发送功能

 

OK,打完收工,咱们下期再见!



Tags:SMS短信   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信...【详细内容】
2020-12-31  Tags: SMS短信  点击:(185)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条