前言
目前阿里短信不支持个人申请签名和模板,所以只能使用测试版固定的签名和模板
提示:以下是本篇文章正文内容,下面案例可供参考
一、控制台配置
1、进入阿里云官网,搜索“短信服务”进行购买
2、配置用户组和用户,获取AccessKey ID和AccessKey Secret
我们当然可以直接使用第一个“继续使用AccessKey”来直接创建AccessKey,但是为了安全(人家也有安全提示),所以咱就听话使用第二个。点击进入后配置用户组,添加关于短信的权限,然后添加一个用户,属于短信这个用户组,这个用户就自动拥有的用户组所拥有的短信权限。
创建用户的时候一定要记得勾选这个,并且记下来AccessKey Secret,因为只显示一次,之后就没了。
二、代码实现
上边直接点击进去就有阿里提供的各种语言的发送短信的代码
它有一个同步的代码和一个异步的代码,异步的按它的代码放到项目中报错,所以直接用的同步的
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.9</version>
</dependency>
/**
* 发送短信工具类
*/
public class SendSMS {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
}
import org.apache.commons.lang3.RandomStringUtils;
=======================================================
String code = RandomStringUtils.randomNumeric(4); //生成四位数字的验证码
com.aliyun.dysmsapi20170525.Client client = SendSMS.createClient(accessKeyId, accessKeySecret); //参数用你真实的替换
SendSmsRequest sendSmsRequest = new SendSmsRequest()
.setSignName("阿里云短信测试") //签名,测试只能这么写
.setTemplateCode("SMS_154950909") //测试模板(固定)
.setPhoneNumbers(phone) //手机号
.setTemplateParam("{\"code\":\""+code+"\"}");
// 复制代码运行请自行打印 API 的返回值
SendSmsResponse result = client.sendSms(sendSmsRequest);
log.info("短信登录API返回的状态码描述:{}",result.getBody().getMessage());
if("OK".equalsIgnoreCase(result.getBody().getCode())){ //OK表明发送成功,将验证码保存到redis,设置过期时间为5分钟
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return ResultData.success(messageUtil.message("messages.codeLoginTip1")); //根据自己的实际返回
}else {
return ResultData.error(messageUtil.message("messages.codeLoginTip2")); //根据自己的实际返回
}
验证的时候从redis中取出对应手机号的验证码。我这是集成到Oauth2中的短信登录,参数获取可能不太一样,但是验证逻辑肯定都是一样的
String mobile = httpServletRequest.getParameter("mobile");
String codeRequest = httpServletRequest.getParameter("code");
String codeRedis = redisTemplate.opsForValue().get(mobile) == null ? "" : String.valueOf(redisTemplate.opsForValue().get(mobile));
SysUser sysUser = userService.getUserByMobile(mobile);
if(sysUser == null){
//throw new SessionAuthenticationException("该手机号不是系统注册用户");
throw new SessionAuthenticationException("messages.codeLoginTip1");
}
if(StringUtils.isEmpty(mobile)){
//throw new SessionAuthenticationException("手机号不能为空");
throw new SessionAuthenticationException("messages.codeLoginTip2");
}
if(StringUtils.isEmpty(codeRequest)){
//throw new SessionAuthenticationException("短信验证码不能为空");
throw new SessionAuthenticationException("messages.codeLoginTip3");
}
if(StringUtils.isEmpty(codeRedis)){
//throw new SessionAuthenticationException("短信验证码已过期");
throw new SessionAuthenticationException("messages.codeLoginTip4");
}
if(!codeRequest.equals(codeRedis)){
//throw new SessionAuthenticationException("短信验证码不正确");
throw new SessionAuthenticationException("messages.codeLoginTip5");
}