Controller层
@RestController
@CrossOrigin
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/send/{phone}")
public String code(@PathVariable("phone") String phone) {
//从redis中获取短信验证码
String code = redisTemplate.opsForValue().get(phone);
//如果redis中有,则短信验证码已发送并且有效,直接返回验证码已发送
if (StrUtil.isNotEmpty(code)) {
return phone + ":" + code + "验证码已发送!";
}
//如果redis中没有查到验证码,直接生成6位数验证码,此code和短信模板中的变量${code}保持一致
code = RandomUtil.randomNumbers(6);
Map<String, Object> map = new HashMap<>(1);
map.put("code", code);
//发送验证码,参数中的模板CODE为阿里云模板管理中生成的模板CODE
Boolean isSend = sendSms.send(phone, "模板CODE", map);
//发送成功后将短信验证码存入redis中,设置有效期为50秒
if (isSend) {
redisTemplate.opsForValue().set(phone, code, 50, TimeUnit.SECONDS);
return phone + ":" + code + "发送成功!";
} else {
return "发送失败!";
}
}
}
Service层:
public interface SendSms {
/**
* 发送短信验证码
* @param phoneNumber
* @param templateCode
* @param map
* @return
*/
Boolean send(String phoneNumber, String templateCode, Map<String, Object> map);
}
Servicelmpl层:
@Service
public class SendSmsImpl implements SendSms {
@Override
public Boolean send(String phoneNumber, String templateCode, Map<String, Object> map) {
//连接阿里云,后两参数输入自己阿里云账号中生成的AccessKey ID和SECRET的值
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AccessKey ID", "SECRET");
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", phoneNumber);
//后面参数为阿里云账号中签名模板的签名名称
request.putQueryParameter("SignName", "签名名称");
request.putQueryParameter("TemplateCode", templateCode);
//构建短信验证码
request.putQueryParameter("TemplateParam", JSONUtil.toJsonStr(map));
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;
}
}
yml配置文件:
server:
port: 8090
spring:
redis:
host: 192.168.0.14
port: 6379
password: 123456
依赖配置:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>