Springboot实现阿里云通信短信服务有关短信验证码的发送功能
作者:喝酒不骑马 发布时间:2022-07-24 15:36:53
前言
短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。
现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点:
服务商知名度高,业务流量大。(这样的平台可信度高)
服务稳定,不能经常宕机。(保证自身业务的流畅运行)
文档全面详细。(没文档怎么玩?)
最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能。本人也是对比几家后,直接选择阿里云通信的短信服务。(本身项目服务器也是部署在阿里云上,但之前并不知道阿里云有短信服务,早知道阿里有的话就不会浪费时间找其他平台了)。废话不多说,下面直接开始短信验证服务教程。
准备
1.登录阿里云,开通阿里云通信短信服务。
2.申请accessKey
选择右上角accessKeys,创建一个access key
3.进入控制台,申请短信签名。这个作用就是用于短信前面“【】”里面的名称。输入时不需要带“【】”
注意申请规范,要不然审核不会过。符合规范的话一般一个小时左右就能通过了。
我这里的签名是“喝酒不骑马”
4.申请短信模版
模板类型选择验证码。注意,选择验证码后,模板替代变量只支持验证码作为变量,且变量替换值<=6位数字或字母。
我的模板如下图
1.下载SDK包
https://help.aliyun.com/document_detail/55284.html
下载后,我们需要使用
aliyun-java-sdk-core-3.2.2.jar
aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar
aliyun-sdk-mns-1.1.8.jar
这三个包
SpringBoot + Maven下的jar包配置
1.在工程的resources目录下新建一个lib文件夹,将jar包复制进去。
2.由于maven库中没有上述几个jar包的依赖,所以需要将本地lib目录下的jar包导入到maven中。并在pom.xml文件中填下如下依赖。
<dependency>
<groupId>aliyun-message-sdk-core</groupId>
<artifactId>aliyun-message-sdk-core</artifactId>
<version>3.2.3</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-core-3.2.2.jar</systemPath>
</dependency>
<dependency>
<groupId>aliyun-message-sdk-mns</groupId>
<artifactId>aliyun-message-sdk-mns</artifactId>
<version>1.1.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-sdk-mns-1.1.8.jar</systemPath>
</dependency>
<dependency>
<groupId>aliyun-java-sdk-dysmsapi</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar</systemPath>
</dependency>
注意, <groupId>、<artifactId>、<version>
随意填写。<scope>system</scope>
必须要加,这表示导入本地的jar包。
${project.basedir}
为项目的根路径。
建立AliyunMessageUtil工具类
public class AliyunMessageUtil {
private static final String product = "Dysmsapi";
//产品域名,开发者无需替换
private static final String domain = "dysmsapi.aliyuncs.com";
// 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
private static final String accessKeyId = "这里替换你的accessKeyId";
private static final String accessKeySecret = "这里替换你的accessKeySecret";
public static SendSmsResponse sendSms(Map<String, String> paramMap) throws com.aliyuncs.exceptions.ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(paramMap.get("phoneNumber"));
//必填:短信签名-可在短信控制台中找到
request.setSignName(paramMap.get("msgSign"));
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(paramMap.get("templateCode"));
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为$[code]"时,此处的值为
request.setTemplateParam(paramMap.get("jsonContent"));
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode(paramMap.get("extendCode"));
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId(paramMap.get("outId"));
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
}
sendSms(Map<String, String> paramMap)
方法是我封装的方法。传入的参数是paramMap,其中包含以下属性:
phoneNumber:接受者手机号
msgSign:短信签名名称。在控制台的短信签名里能找到。
templateCode:短信模版的code。见控制台中的模版code。
jsonContent:需要替换的变量的JSON字符串。对于验证码来说,String jsonContent = "{\"number\":\"" + randomNum + "\"}";即可。其中randomNum是随机生成的6位验证码。
extendCode:上行短信模板的验证码,不需要的话可以忽略
outId:扩展字段,不需要则可以忽略
调用demo
public String sendMsg() throws LgdServiceException, ClientException {
String phoneNumber = "18888888888";
String randomNum = createRandomNum(6);
String jsonContent = "{\"number\":\"" + randomNum + "\"}";
Map<String, String> paramMap = new HashMap<>();
paramMap.put("phoneNumber", phoneNumber);
paramMap.put("msgSign", "喝酒不骑马");
paramMap.put("templateCode", "xxxxxxxx");
paramMap.put("jsonContent", jsonContent);
SendSmsResponse sendSmsResponse = AliyunMessageUtil.sendSms(paramMap);
if(!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) {
if(sendSmsResponse.getCode() == null) {
//这里可以抛出自定义异常
}
if(!sendSmsResponse.getCode().equals("OK")) {
//这里可以抛出自定义异常
}
}
}
/**
* 生成随机数
* @param num 位数
* @return
*/
public static String createRandomNum(int num){
String randomNumStr = "";
for(int i = 0; i < num;i ++){
int randomNum = (int)(Math.random() * 10);
randomNumStr += randomNum;
}
return randomNumStr;
}
总结
短信效果如图所示
对于验证码的校验,可参见我的另一篇博文SpringBoot实现短信验证码校验.
以上所述是小编给大家介绍的Springboot实现阿里云通信短信服务有关短信验证码的发送功能网站的支持!
来源:http://blog.csdn.net/Colton_Null/article/details/77283193


猜你喜欢
- 在实际开发中,我们经常会需要在页面跳转的时候携带路由参数,典型的例子就是从列表到详情页的时候,需要携带详情的 id,以便详情页获取对应的数据
- 不适用click而用touch自定义监听:class myOnGestureListener extends GestureDetector
- Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的:排序二叉树的3个特征:1:当前node的所有
- 可以根据执行时间打印sql语句,打印的sql语句是带参数的,可以拷贝到查询分析器什么的直接运行package mybatis;import
- 本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下雪花效果图:具体代
- **正所谓,一入商城深似海~ 商城类的App,确实是有许多东西值得学习,但是只要略微斟酌一下,你又会发现,它们之间存在着许多不谋而合的相似,
- IISExpress 配置允许外部访问详细介绍1.找到IISExpress的配置文件,位于 <文档>/IISExpr
- 线程池合理设置最大线程数和核心线程数工作中有这样一个场景,需要处理千万级别的数据的一个算法,大部分是增删查的操作。这个时候就需要使用多线程去
- 学习大佬们开发安全小工具,打包jar解决错误: 找不到或无法加载主类 main1 Maven方式遇到报错”找不到或无法加载主类 main“解
- 在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置1.在项目的application.yml文件
- 本文实例讲述了Android中Matrix用法。分享给大家供大家参考,具体如下:Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方
- 本文旨在用通俗的语言讲述枯燥的知识定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时
- 第一个为大家分享的是C#字符串使用密钥进行加解密代码,具体内容如下public class DesEncrypt {  
- Android 无障碍的全局悬浮窗可以在屏幕上添加 UI 供用户进行快捷操作,可以展示在所有应用程序之上长期展示。另一方面,在一些自动化场景
- 本文实例为大家分享了android水平循环滚动控件的具体代码,供大家参考,具体内容如下CycleScrollView.javapackage
- shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/ 它提供了很方便的权限认证和
- DataSource在数据库应用中,客户端与数据库服务端建立的连接对象(Connection)是宝贵的资源,每次请求数据库都创建连接,使用完
- 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找开始正文1、先介绍本文会用到的window
- 本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本a
- 前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。位图先看一个问题,