一、设置AccessKey
创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查询到。
二、开启阿里云短信服务
在阿里云官网搜索短信服务,进入短信服务控制台。
1、资质管理
在这里我们申请个人资质即可,就不用上传企业的证明材料。注意个人的证件照片要清除,不能有遮挡,备注信息写上申请说明,不能随便写,审核一般在两个小时内。
2、签名管理
申请签名。
3、模板管理
这里的模板,就是我们发送短信的模板,需要注意的是,要注意选择纯数字,或者则是英文数字混合使用的模板。模板CODE后面我们需要使用。
三、SpringBoot整合阿里云SMS
1、整体流程
1、前端发送短信验证码的请求;
2、后端收到请求后,生成验证码的code,调用阿里云API 接口发送短信;
3、判断 SMS API 的返回信息,“OK”则为成功发布;
4、发布成功将code存入redis,供后期校验使用;
5、将存入redis时的key值返回给前端。
2、引入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
3、配置SMS Client
@Configuration
public class AliyunCheckCodeConfig {
@Bean
public Client aliyunClient() throws Exception {
Config config = new Config()
.setAccessKeyId("你的AccessKeyID")
.setAccessKeySecret("你的AccessKey密码");
config.endpoint = "dysmsapi.aliyuncs.com";
return new Client(config);
}
}
在配置类中将阿里云SMS 的客户端注册进ioc 容器,交给SpringBoot管理,这里需要将自己生成的AccessKeyID 和 AccessKey 密码替换上
4、业务代码
@Autowired
private Client aliyunClient;
/**
* 发送短信验证码
*
* @param phone
* @return
*/
@Override
public String sendPhoneCheckCode(String phone) {
//避免重复提交
String jsonString = redisTemplate.opsForValue().get("phone:" + phone);
if(jsonString != null){
return null;
}
//生成验证码
Integer numCode = new Random().nextInt(1000,9999);
String code = String.valueOf(numCode);
SendSmsRequest sendSmsRequest = new SendSmsRequest();
sendSmsRequest.setSignName("发送短信的主题")
.setTemplateCode("你的模板CODE")
.setPhoneNumbers("发送到的手机号")
.setTemplateParam("{\"code\":" + code + "}");
try {
RuntimeOptions runtimeOptions = new RuntimeOptions();
SendSmsResponse sendSmsResponse = aliyunClient.sendSmsWithOptions(sendSmsRequest, runtimeOptions);
SendSmsResponseBody body = sendSmsResponse.getBody();
if (body.getMessage().equals("OK")) {
//存入redis
String key = "phone:" + phone;
//存入redis
redisTemplate.opsForValue().set(key,code,3,TimeUnit.MINUTES);
//返回key
return key;
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
这里我们需要将之前申请的模板CODE替换上,code即为替换模板中占位符的信息,我们引入了redis缓存,将生成的验证码存入缓存中,供后面的校验提供支持。