使用场景 : 手机验证码, 一般作为权限校验 , 授权 , 消息通知等
配合使用 : 如果作为短信验证码 , 则一般配合redis使用 , 如果是普通的短信通知则不需要
以阿里云实现验证码为例:
java实现
1&.短信验证接口
@GetMapping("/getMessageCode/{phone}")
public Result getMessageCode(@PathVariable String phone) {
String messageCode = RandomUtils.getUUIDRandom(4);
System.out.println(phone);
if (StringUtils.isEmpty(phone) || !FormUtils.isMobile(phone)) {
return new Result(false, StatusCode.ERROR, "手机号为空或不合法");
}
//执行发送短信的逻辑
userRegisterService.sendMessageCode(phone, messageCode);
//将验证码存入redis
redisTemplate.opsForValue().set(CacheKey.USER_PHONE + phone, messageCode, 60, TimeUnit.MINUTES);
return new Result(true, StatusCode.OK, "短信发送成功,60s后过期");
}
2&.发送短信逻辑
public void sendMessageCode(String phone,String messageCode) {
//创建远程连接客户端对象
DefaultProfile profile = DefaultProfile.getProfile(
smsProperties.getRegionId(),
smsProperties.getKeyId(),
smsProperties.getKeySecret());
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("RegionId", smsProperties.getRegionId());
request.putQueryParameter("PhoneNumbers", phone);
request.putQueryParameter("SignName", smsProperties.getSignName());
request.putQueryParameter("TemplateCode", smsProperties.getTemplateCode());
Gson gson = new Gson();
Map<String, String> map = new HashMap<>();
map.put("code", messageCode);
String json = gson.toJson(map);
request.putQueryParameter("TemplateParam", json);
//使用客户端对象携带请求对象发送请求并得到响应结果
CommonResponse response = null;
try {
response = client.getCommonResponse(request);
} catch (ClientException e) {
log.error("短信发送失败:" + ExceptionUtils.getStackTrace(e));
throw new RuntimeException("发送短信连接失败");
}
String data = response.getData();
HashMap<String, String> resultMap = gson.fromJson(data, HashMap.class);
String code = resultMap.get("Code");
String message = resultMap.get("Message");
if("isv.BUSINESS_LIMIT_CONTROL".equals(code)){
log.error("短信发送过于频繁:code = " + code + ",message = " + message);
throw new RuntimeException("发送短信过于频繁");
}
if(!"OK".equals(code)){
log.error("短信发送失败:code = " + code + ",message = " + message);
throw new RuntimeException("短信发送失败");
}
}
3& 相关参数及依赖配置
@Data
@Component
//注意prefix要写到最后一个 "." 符号之前
@ConfigurationProperties(prefix="aliyun.sms")
public class MessageProperties {
private String regionId;
private String keyId;
private String keySecret;
private String templateCode;
private String signName;
}
//yml配置
aliyun:
sms:
regionId: *****
keyId: *****
keySecret: *****
templateCode: *****
signName: *****
pom.xml依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.2</version>
</dependency>