Springboot实现阿里云通信短信服务有关短信验证码的发送功能

发布时间 - 2026-01-11 02:49:58    点击率:

前言

短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。

现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点:

  1. 服务商知名度高,业务流量大。(这样的平台可信度高)
  2. 服务稳定,不能经常宕机。(保证自身业务的流畅运行)
  3. 文档全面详细。(没文档怎么玩?)

最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能。本人也是对比几家后,直接选择阿里云通信的短信服务。(本身项目服务器也是部署在阿里云上,但之前并不知道阿里云有短信服务,早知道阿里有的话就不会浪费时间找其他平台了)。废话不多说,下面直接开始短信验证服务教程。

准备

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实现阿里云通信短信服务有关短信验证码的发送功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# spring  # boot  # 阿里云短信服务  # 短信验证码的发送  # SpringBoot发送短信验证码的实例  # SpringBoot发送html邮箱验证码功能  # SpringBoot使用榛子云实现手机短信发送验证码  # SpringBoot发送邮件功能 验证码5分钟过期  # SpringBoot使用邮箱发送验证码实现注册功能  # SpringBoot发送邮箱验证码功能  # SpringBoot+Security 发送短信验证码的实现  # SpringBoot实现发送验证码功能(图片验证码)  # 验证码  # 短信服务  # 抛出  # 必填  # 可在  # 自定义  # 可选  # 文档  # 不需  # 小编  # 度高  # 自己的  # 您的  # 几个  # 随机数  # 目录下  # 中找到  # 就能  # 在此  # 有很多 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  利用python获取某年中每个月的第一天和最后一天  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  java中使用zxing批量生成二维码立牌  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  UC浏览器如何设置启动页 UC浏览器启动页设置方法  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何快速搭建自助建站会员专属系统?  Laravel如何实现数据库事务?(DB Facade示例)  制作企业网站建设方案,怎样建设一个公司网站?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在万网自助建站平台快速创建网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  微信小程序 wx.uploadFile无法上传解决办法  Android滚轮选择时间控件使用详解  如何确保西部建站助手FTP传输的安全性?  如何在阿里云购买域名并搭建网站?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何快速搭建二级域名独立网站?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在Windows环境下新建FTP站点并设置权限?  jQuery 常见小例汇总  Laravel怎么实现验证码(Captcha)功能  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Java垃圾回收器的方法和原理总结  香港服务器网站推广:SEO优化与外贸独立站搭建策略  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  手机网站制作与建设方案,手机网站如何建设?  如何为不同团队 ID 动态生成多个“认领值班”按钮  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel怎么实现模型属性的自动加密  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在云服务器上快速搭建个人网站?  Laravel中的Facade(门面)到底是什么原理  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?