前言
之前在写Redis相关内容的时候,提到了Redis可以和我们的短信验证结合起来使用,于是这几天博主空了,想起来这个事,连忙学习了阿里云关于短信验证的内容,使用SpringBoot框架进行代码书写,并将Redis结合起来一起使用。详细内容如下,各位小伙伴“放心食用”〜
一、准备工作
1、阿里云的AcceccKey ID和AccessSecret
登录阿里云,并实名认证,这里我只是大概讲解需要做那些步骤,最重要的是获得AcceccKey ID和AccessSecret,然后关于开通sms短信服务的操作(比较繁琐),小伙伴们可以在哔哩哔哩上找向相关的视频看操作,这样一来更容易理解一些。
①创建一个用户组并添加sms权限
②创建一个用户
③获得我们的AcceccKey ID和AccessSecret
2、开通阿里云的短信服务
①在搜索框搜索“短信服务”
②根据“快速学习和测试”完成任务
③根据提示完成“签名管理”和“模板管理”
ps:审核的时候,可能审核的时间有点长,请耐心等待!
3、代码开发准备
导入短信发送的Java的SDK依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
4、创建一个Idea项目
项目的目录如下:
二、代码实现
1、Service层代码书写
①接口代码
public interface SendMessage {
public boolean send(String phone, String templateCode, Map<String,Object> code);
}
②实现类!!!
这段代码是核心,是阿里云官方写的一个API接口,里面的数据如签名、AcceccKey ID和AccessSecret等根据自己的情况填写即可,相应的代码也有注解!
ps:代码中phone手机号,要提前在阿里云官方,设置好测试用的手机号,不然到时候可能收不到短信信息。
@Service
public class SendMessageImp implements SendMessage {
@Override
public boolean send(String phone, String templateCode, Map<String, Object> code) {
//初始化配置对象 com.aliyuncs.profile.DefaultProfile 。 Profile 对象存放 your-access-key-id、your-access-key-secret 和 your-region-id
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI5tCdq6x**********", "RYgTJUPy******************");
//实例化一个客户端,从 com.aliyuncs.IAcsClient 类生成对象 client
IAcsClient client = new DefaultAcsClient(profile);
// 创建API请求并设置参数
//创建对应 API 的 Request 。 类的命名规则为 API 方法名加上 Request
SendSmsRequest request = new SendSmsRequest();
//设置请求类 request 的参数。 通过 request 类的 setXxx 方法设置必要的信息,即 API 中必须要提供的信息,通过 set 方法设置参数
//手机号、验证码、签名、模板
request.setPhoneNumbers(phone); // 该参数值为假设值,请您根据实际情况进行填写
request.setSignName("***"); // 该参数值为假设值,请您根据实际情况进行填写
request.setSysMethod(MethodType.POST);
request.setTemplateCode(templateCode);
//构建验证码
request.setTemplateParam(JSONObject.toJSONString(code));
try {
//通过 client 对象获得对应 request 响应 response
SendSmsResponse response = client.getAcsResponse(request);
System.out.println(JSON.toJSONString(response));
// 打印您需要的返回值,此处打印的是此次请求的 RequestId
System.out.println(response.getRequestId());
return response.getMessage().equals("OK");
} catch (ServerException e) {
//服务端报错
e.printStackTrace();
} catch (ClientException e) {
// 打印错误码,客户端报错
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
return false;
}
}
2、controller层代码书写
在该代码中是引入了SpringBoot自带的Redis模板,用于存储code(随机生成)的值,并设置一定的有效时间,防止code在短时间内失效。
①Redis简单配置
具体代码如下:
@RestController
@CrossOrigin//支持跨域问题
public class SmsController {
@Resource
private SendMessage sendMessage;
@Resource
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String Send(@PathVariable("phone") String phone){
//调用方法(真实业务)
String code = redisTemplate.opsForValue().get(phone);//获取取得的手机号
//如果code不为空则说明将code放入了缓存,而且没有过期
if(!StringUtils.isEmpty(code)){
return phone + ":" +code + "未过期";
}
//生成4个字的验证码存储在redis中
code = RandomStringUtils.random(5, new char[]{'0','1','2','3','4','5','6', '7', '8', '9'});
//String code=random.next(10000);
HashMap<String,Object> map = new HashMap<>();
map.put("code",code);
boolean sms = sendMessage.send(phone, "SMS_*****", map);
if(sms){
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MICROSECONDS);
return phone+":"+code+"发送成功";
}else
return phone+":"+code+"发送失败";
}
}
三、效果图
访问接口:
手机短信截图:
四、总结
到这儿,关于这个阿里云短信验证的代码就集成好了,需要的小伙伴就可以直接拿去使用。还是那句话,如果这篇博客对你有所帮助,别忘了关注、点赞支持博主一波哦〜你们的支持就是博主更下去的动力,咱们下一篇博客再见!