SpringBoot 发送短信验证码
1. 创立用户信息
1. 申请一个阿里云的账号
2. 关上控制台,点击个人头像,找到 AccessKey 治理,点击关上
3. 点击进入之后会看到这个,肯定要保存好这个 accesskey
不要泄露, 抉择应用子用户的
4. 新建一个用户组
点击创立用户组,而后依据提醒填写即可
创立实现之后点击新建的用户组进去
5. 给用户组增加权限
找到权限治理,增加权限
输出 SMS 点击治理短信服务, 跳到有边,点击确定即可
6. 创立用户
依据提醒填写就能够
编程拜访肯定要勾选上,因为咱们是通过代码操作的
点击确定即可
创立用户之后点击进入会看到这个用户的所有信息
这里的 accesskeyid accessSecret 肯定要妥善保存,因为一旦创立了用户之后就看不到明码了,如果泄露,要即便禁用或者删除
而后点击退出的组,将方才创立好的用户组增加进去即可
该子用户会继承用户组的权限
2. 开明短信服务
1. 在控制台首页间接搜寻 短信服务
即可,点击进入
2. 第一次进入他会让开明短信服务,间接批准开明即可,能够本人查看计费规定及其他的信息
3. 增加短信的模板
依据提醒填写就能够,肯定不要乱写, 填写正当理由,审核未通过接着审核就行
${code}
这个肯定要有,不要批改他,要通过这个将验证码的变量传进去
4. 增加签名
第一次进去的时候验证码是能够选用的,选用验证码就行,因为我申请过了,所以不能在抉择了
肯定要等审核通过了才能够应用
5. 找到帮忙文档 关上找到 SDK 参考抉择 java 的,失常公司的开发都是应用 SDK 形式的,这里也是应用这个形式
这个帮忙文档有 api 参考,能够自行理解
进入官网的 demo 中
3. 代码阶段
pom.xml 在 pom.xml 中导入以下依赖
<!-- 导入依赖 sms 发送短信的外围依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--FastJson 对于数据的解决的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--redis 因为短信验证码都是几分钟后无奈应用,所以放在 redis 中 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
先测试一下能不能应用,间接将官网的 demo 代码复制放到测试类中测试一下
/**
* <accessKeyId> 你本人的 accessKeyId 相当于账号
* accessSecret 在创立用户时的 accessSecret 相当于明码
*/
@Test
void contextLoads() {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 构建申请
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");// 不能改 改了就会报错
request.setSysVersion("2017-05-25");// 不能改 改了就会报错
request.setSysAction("SendSms");// 个别也不会该改
// 自定义的参数(手机号,验证码,模板,签名)
// 参数名称不要乱写
// 手机号
request.putQueryParameter("PhoneNumbers", "承受短信的手机号");
// 签名名称
request.putQueryParameter("SignName", "方才定义好的签名名称");
// 模板 code
request.putQueryParameter("TemplateCode", "自定义短信模板的模板 CODE 编码");
// 构建一个短信验证码
Map<String,Object> map = new HashMap<>();
map.put("code","1234");
// 将定义好的验证码放入进去
// 短信验证码
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
try {CommonResponse response = client.getCommonResponse(request);
// 控制台打印返回的信息
System.out.println(response.getData());
} catch (ServerException e) {e.printStackTrace();
} catch (ClientException e) {e.printStackTrace();
}
}
在导包的时候肯定不要导错了,导阿里云的,有些包是重名的
测试发送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}
在控制台看到这句话就证实短信发送胜利了
是不是曾经收到短信了!
发送短信的正式代码
controller
package com.mango.controller;
import com.mango.Service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* @Author:
* @Date: 2020/8/9 22:11
* @CrossOrigin// 跨域反对
*/
@RestController
@CrossOrigin
public class SendSmsApiController {
@Autowired
private SendSmsService sendSmsService;
/**
* 应用 redis 的模板
*/
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String sendSms(@PathVariable("phone")String phone){// 调用发送短信的办法(应用 redis)
// 获取 redis 中的手机号
String code = redisTemplate.opsForValue().get(phone);
// 判断以后的 code 的不为空
if(!StringUtils.isEmpty(code)){return phone+":"+code +"已存在, 还没有过期";}
// 否则就是没有验证码,生成验证码并且存储到 redis 中,设置他的过期工夫
// 生成随机验证码
code = UUID.randomUUID().toString().substring(0, 4);
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
// 发送短信
boolean isSend = sendSmsService.sendSms(phone, "自定义短信模板的模板 CODE 编码", map);
if(isSend){
// 如果短信发送胜利就放入到 redis 中,设置 5 分钟之后过期
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return phone+":"+code +"发送胜利";
}else {return "发送胜利";}
}
}
service
package com.mango.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
public interface SendSmsService {
/**
* @param phoneNum 发送的手机号
* @param TemplateCode 短信模板的 code
* @param code 验证码
* @return
*/
public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);
}
servcieImpl
package com.mango.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.mango.Service.SendSmsService;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
@Service
public class SendSmsImpl implements SendSmsService {
/**
* @param phoneNum 发送的手机号
* @param TemplateCode 短信模板的 code
* @param code 验证码
* @return
*/
@Override
public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 构建申请
CommonRequest request = new CommonRequest();
// 不要改
request.setSysMethod(MethodType.POST);
// 不能改 改了就会报错
request.setSysDomain("dysmsapi.aliyuncs.com");
// 不能改 改了就会报错
request.setSysVersion("2017-05-25");
// 个别也不会该改
request.setSysAction("SendSms");
// 自定义的参数(手机号,验证码,模板,签名)
// 参数名称不要乱写
// 手机号
request.putQueryParameter("PhoneNumbers", phoneNum);
// 签名名称
request.putQueryParameter("SignName", "方才定义好的签名名称");
// 模板 code
request.putQueryParameter("TemplateCode", TemplateCode);
// 短信验证码
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
try {CommonResponse response = client.getCommonResponse(request);
// 这个是他自带的判断他发送的是否胜利,胜利就间接返回
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {e.printStackTrace();
} catch (ClientException e) {e.printStackTrace();
}
return false;
}
}
application.yml
server:
port: 8090
# redis 我这里应用的是本地的 redis
spring:
redis:
host: 127.0.0.1
port: 6379
当初看下是不是曾经发送胜利了!