一.开通阿里云短信服务

开通步骤如下图所示

开通完成后,进入阿里云短信验证首页,点击国内消息

一般来说,在短信验证时需要签名管理和模板管理,但是签名管理需要备案或者上线服务,所以对于没有备案和上线应用的用户来说,就进行不了这一项,但是阿里云提供了免费的api测试短信验证服务(当然测试信息验证码也是收费的),具体过程如下:

这边点击api发送测试功能,进行我们的测试验证,此时会让绑定手机号,我们剋以绑定自己的手机号即可。

我自己测试绑定了两个,随便搞一个就行

绑定后点击调用api发短信

然后会自动生成签名名称和模板code,这个我们需要记住,后续代码中需要这两个参数。

​​​​​​​

主要参数就这几个,后面代码中使用的也就是这几个参数。阿里云短信服务开通后,进行代码分析。

二. 代码分析

首先我们需要用到

1.redis:在进行登陆注册的时候进行短信验证时,我们可以将相关的信息存到redis中,这样避免了从数据库查找,直接从缓存中查找更加方便。

2.swagger:用来进行接口测试

(0)首先创建一个spring initializr项目,具体的项目结构如下所示。

(1)相关的pom依赖如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>mozz</artifactId><version>0.0.1-SNAPSHOT</version><name>mozz</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><!--swagger ui--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.2.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.10</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

(2)相关配置文件application.properties

# 端口号
server.port=8888spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8spring.mvc.pathmatch.matching-strategy=ant_path_matcher

(3)相关工具类

(3.1)统一返回值

package com.example.mozz.utils;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.HashMap;
import java.util.Map;//统一返回结果的类
@Data
public class R {@ApiModelProperty(value = "是否成功")private boolean success;@ApiModelProperty(value = "返回码")private Integer code;@ApiModelProperty(value = "返回消息")private String message;@ApiModelProperty(value = "返回数据")private Map<String,Object> data = new HashMap<String,Object>();//构造方法私有private R(){};//成功的静态方法public static R ok(){R r = new R();r.setSuccess(true);r.setCode(ResultCode.SUCCESS);r.setMessage("成功");return r;}//失败的静态方法public static R error(){R r = new R();r.setSuccess(false);r.setCode(ResultCode.ERROR);r.setMessage("失败");return r;}public R success(Boolean success){this.setSuccess(success);return this;}public R code(Integer code){this.setCode(code);return this;}public R message(String message){this.setMessage(message);return this;}public R data(String s, Object o){this.data.put(s,o);return this;}public R data(Map<String,Object> map){this.setData(map);return this;}
}
package com.example.mozz.utils;public interface ResultCode {public static Integer SUCCESS = 20000;public static Integer ERROR = 20001;}

(3.2)验证码分为四位和六位,所以写一个工具类返回四位还是六位验证码RandomUtils

package com.example.mozz.utils;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;/*** @author mozz* @version 1.0* @date 2022/8/22*/
public class RandomUtils {private static final Random random = new Random();private static final DecimalFormat fourdf = new DecimalFormat("0000");private static final DecimalFormat sixdf = new DecimalFormat("000000");public static String getFourBitRandom() {return fourdf.format(random.nextInt(10000));}public static String getSixBitRandom() {return sixdf.format(random.nextInt(1000000));}/*** 给定数组,抽取n个数据* @param list* @param n* @return*/public static ArrayList getRandom(List list, int n) {Random random = new Random();HashMap<Object, Object> hashMap = new HashMap<Object, Object>();// 生成随机数字并存入HashMapfor (int i = 0; i < list.size(); i++) {int number = random.nextInt(100) + 1;hashMap.put(number, i);}// 从HashMap导入数组Object[] robjs = hashMap.values().toArray();ArrayList r = new ArrayList();// 遍历数组并打印数据for (int i = 0; i < n; i++) {r.add(list.get((int) robjs[i]));System.out.print(list.get((int) robjs[i]) + "\t");}System.out.print("\n");return r;}}

(3.3) swagger配置类SwaggerConfig

package com.example.mozz.utils;import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket webApiConfig(){return new Docket(DocumentationType.SWAGGER_2).groupName("webApi").apiInfo(webApiInfo()).select().paths(Predicates.not(PathSelectors.regex("/admin/.*"))).paths(Predicates.not(PathSelectors.regex("/error.*"))).build();}private ApiInfo webApiInfo(){return new ApiInfoBuilder().title("API文档").description("接口定义").version("1.0").contact(new Contact("mozz", "http://www.baidu.com","1345656307@qq.com")).build();}
}

至此整个工具类都创建完成

(2)编写service层

(2.1)MessageService接口

package com.example.mozz.service;import java.util.Map;public interface MessageService {//是否发送成功boolean send(Map<String, Object> map, String phone);
}

(2.2)实现类

package com.example.mozz.service.Impl;import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.utils.StringUtils;
import com.example.mozz.service.MessageService;
import org.springframework.stereotype.Service;import java.util.Map;@Service
public class MessageServiceImpl implements MessageService {@Overridepublic boolean send(Map<String,Object> map, String phone) {if(StringUtils.isEmpty(phone)) return false;DefaultProfile profile =DefaultProfile.getProfile("default", "LTAI5tArv8Ccgp2YWX7ejmJa","5CvuGiss2sLMi5vcmI7N0UT7OjqWFC");IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();//request.setProtocol(ProtocolType.HTTPS);request.setMethod(MethodType.POST);request.setDomain("dysmsapi.aliyuncs.com");request.setVersion("2017-05-25");request.setAction("SendSms");request.putQueryParameter("PhoneNumbers", phone);   //手机号request.putQueryParameter("SignName", "阿里云短信测试");    //签名名称request.putQueryParameter("TemplateCode", "SMS_151923909");  //模板名称request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));  //验证码转换json数据try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());return response.getHttpResponse().isSuccess();} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return false;}
}

这边有几个注意事项:

如何获取你的accessKeyId和secret,步骤如下:

点击继续使用AccessKey, 出现对应的AccessKeyId以及secret信息

查看secret时,需要手机验证码,验证一下即可。(获取到id和secret后,最好将其保存在本地,这样以后再用的话可以直接使用,不需要这样去查找了)

(3)controller层编写

package com.example.mozz.controller;import com.example.mozz.service.MessageService;
import com.example.mozz.utils.R;
import com.example.mozz.utils.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import com.aliyuncs.utils.StringUtils;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/user/message")
public class MessageController {@Autowiredprivate MessageService messageService;@Autowiredprivate RedisTemplate<String,String> redisTemplate;@GetMapping("{phone}")public R sendMessage(@PathVariable String phone){//1.从redis中获取验证码,如果缓存中有的话直接返回,没有的话从阿里云发送获取String code = redisTemplate.opsForValue().get(phone);if(!StringUtils.isEmpty(code)){return R.ok();}//从阿里云发送// 1.生成随机值,发送给阿里云code = RandomUtils.getSixBitRandom();   //六位验证码Map<String,Object> map = new HashMap<>();map.put("code",code);boolean isSend = messageService.send(map,phone);if(isSend){redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);return R.ok();}else{return R.error().message("发送失败");}}}

至此整个的代码就编写完成,随后进行swagger测试

启动类:需要注意注解需要加上exclude = {DataSourceAutoConfiguration.class}, 因为我们没有用到数据库相关信息,所以需要将数据源排除掉。

package com.example.mozz;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MozzApplication {public static void main(String[] args) {SpringApplication.run(MozzApplication.class, args);}}

发送成功,这是你的手机上应该会收到相应的验证码:

可以看到这是六位验证码,也可以改成四位验证码,在controller层里面调用getFourBitRandom方法,即发送四位验证码。

至此短信验证功能结束,后续实现完整的q前后端登陆注册短信验证功能

springboot整合阿里云短信验证(无需签名和模板,通过阿里云api测试实现短信验证)相关推荐

  1. 阿里云短信服务的签名和模板的审核通过办法(已申请通过)

    简介: 关于阿里云的短信验证服务的签名和模板申请相对比其他服务有些麻烦,但是依然是可以解决的 首先我们先去产品是搜索到短信服务,开通短信服务,进入控制台 首先如果是企业用户操作就非常方便快捷了,因为直 ...

  2. 使用聚合数据短信API测试(短信验证登录)

    搞一手聚合数据短信API测试(之前用阿里云的搞过,今天我们用聚合) 注册聚合账号!聚合官网链接 登陆后进入短信服务API(免费提供十次) 添加自定义模板(审核速度看脸) 审核成功后得到模板ID 之后得 ...

  3. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板

    主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...

  4. 短信验证码之签名和模板

    之前写过一篇如何利用短信验证码平台云片网获得第一条短信的教程,其中提到了短信验证码中非常重要的两个概念,签名和模板.今天就来聊聊这哥俩. 在使用签名和模板前,首先要通过个人验证. 个人和组织认证 在国 ...

  5. 一小时学会使用Springboot整合沙箱环境支付宝支付(附源码)

    0.前言 文章需求: 对于学生来说,目前网上确实没有比较统一而且质量好的支付教程.因为支付对个人开发者尤其是学生来说不太友好.因此,自己折腾两天,算是整理了一篇关于支付宝沙箱支付的文章. 那么为什么不 ...

  6. SpringBoot整合redis实现阿里云短信验证

    <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId ...

  7. Spring-Boot整合微信登陆、微信支付、邮箱发送、支付宝支付和阿里云短信

    Spring-Boot整合 1. 发送邮件 2. 支付宝支付 3. 阿里云短信 4. 微信登陆 5. 微信支付 6. Swargger2 前后端API接口信息文档 7. ehcache缓存缓存 8. ...

  8. SpringBoot整合阿里云短信服务详细过程(保证初学者也能实现)

    前言 网上关于实操性的文章普遍大部分都记录不全,要么只记录重点部分,对于刚学习的小伙伴来说看起来是比较困难的 所以,基于这一点. 该文章会详细介绍使用SpringBoot整合阿里云短信服务的每一步过程 ...

  9. 一小时学会使用SpringBoot整合阿里云SMS短信服务

    1. 登录阿里云进入控制台 进入阿里云控制台,https://home.console.aliyun.com/在个人头像位置点击进入AccessKey管理: 2. 创建用户和用户组 创建用户组 添加完 ...

最新文章

  1. 阿里云推出全球首个影像类应用一站式解决方案:智能云相册
  2. WCF-学习笔记概述之计算服务(1)
  3. 网站流量突然下降从三方面进行判断病因
  4. 西安python培训班多少钱-西安Python培训班哪个好
  5. java面试精典问答
  6. 使用 python-nmap 进行端口扫描
  7. spring resource
  8. [Python技巧]如何加快循环操作和Numpy数组运算速度
  9. Python 数据分析三剑客之 Matplotlib(七):饼状图的绘制
  10. mysql 不锁表备份_Mysql不锁表备份之Xtrabackup的备份与恢复
  11. 你一直想学的 RocketMQ,原来这样学才最省时省力
  12. git之checkout代码
  13. 关于SOC、态势感知,5种常见的关联分析模型
  14. 高端餐饮空间布局要点
  15. google新搜索网站
  16. matlab图像区域填充的原理_MATLAB中怎么用fill填充指定区域?
  17. 项目没有亮点,如何应对面试官的提问?
  18. oppo手机忘记解锁图案怎么办
  19. 在进行计算机软件著作权维权时必须要进行源代码比对么?
  20. 一个基于pycuda的矩阵乘法实现,它使用CUDA核心来加速计算。

热门文章

  1. 无线蓝牙通信的c语言,蓝牙与C和winsock
  2. 这几本值得你一看再看的程序员素养必备好书
  3. 软件已删除,但在控制面板里还有,就是删不掉.怎么办?
  4. 直流电机的PWM调速
  5. ORACLE ORA-28545: 连接代理时 Net8 诊断到错误 解决办法
  6. 使用python爬取猎聘网的职位信息
  7. UDP重传,似牛非马。。。
  8. oracle cmd命令导入,oracle使用cmd命令导入数据库
  9. Python 基于积分原理计算定积分并可视化数值积分计算的动画过程
  10. Debian 11 安装,超详细!