目的是集成阿里云短信服务,完成验证码的发送和接收。
目 录
1、开通阿里云短信服务
2、申请签名
3、申请模板
4、获取AccessKey
5、代码实现
6、代码扩展
7、总结
1、开通阿里云短信服务
去阿里云官网开通
2、申请签名
进行整个步骤时,可以先阅读快速学习和测试教程
注意签名的填写不要太随意,不然不会通过
3、申请模板
4、获取AccessKey
用于后续代码中的书写
5、代码实现
引入相关依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<!--实际上只有上面的依赖用于阿里云短信服务的依赖,下面fastjson为json转换工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
逻辑实现
//发送短信的方法
@Override
public boolean sendMsm(HashMap<String, Object> map, String phone) {
if (StringUtils.isEmpty(phone))return false;
//参数1:地域节点
//参数2:AccessKey ID
//参数3:AccessKey Secret
DefaultProfile profile = DefaultProfile.getProfile("default", "写你自己的AccessKey ID", "写你自己的AccessKey Secret");
DefaultAcsClient client = new DefaultAcsClient(profile);
//设置相关固定参数
CommonRequest request = new CommonRequest();
//request.setProtocol(ProtocolType.HTTPS);
request.setSysMethod(MethodType.POST); //提交方式,默认不能改
request.setSysDomain("dysmsapi.aliyuncs.com");//请求阿里云哪里,默认不能改
request.setSysVersion("2017-05-25");//版本号
request.setSysAction("SendSms");//请求哪个方法
//设置发送相关参数
request.putQueryParameter("PhoneNumbers",phone);//设置要发送的【手机号】
request.putQueryParameter("SignName","写你自己的申请阿里云短信服务的【签名名称】");//申请阿里云短信服务的【签名名称】
request.putQueryParameter("TemplateCode","写你自己的申请阿里云短信服务的【模版中的 模版CODE】");//申请阿里云短信服务的【模版中的 模版CODE】
//要求传递的code验证码为jason格式,可以使用JSONObject.toJSONString()将map转为json格式
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
//最终发送
try {
CommonResponse response = client.getCommonResponse(request);
return response.getHttpResponse().isSuccess();
} catch (ClientException e) {
e.printStackTrace();
return false;
}
}
以上就完成了短信的发送!
6、代码扩展
为完善逻辑,引入redis作为验证码存储,保证验证码的有效性
//阿里云发送短信的方法
@GetMapping("/send/{phone}")
public R sendMsm(@PathVariable String phone){
//从redis获取验证码,如果能获取,直接返回
String code = redisTemplate.opsForValue().get(phone);
if (!StringUtils.isEmpty(code)){
return R.ok();
}
//获取不到就阿里云发送
//生成随机值,并传递给阿里云短信,让他转发给手机
code = RandomUtil.getSixBitRandom();
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
//调用service中发送短信的方法
boolean isSend = msmService.sendMsm(map, phone);
if (isSend){
//如果发送成功,把发送成功的code验证码保存到redis中,并设置有效时间,设置5分钟过期
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return R.ok();
}else {
return R.error().message("短信发送失败");
}
}
RandomUtil工具类
public class RandomUtil {
private static final Random random = new Random();
private static final DecimalFormat fourdf = new DecimalFormat("0000");
private static final DecimalFormat sixdf = new DecimalFormat("000000");
//生成4位随机数
public static String getFourBitRandom() {
return fourdf.format(random.nextInt(10000));
}
//生成6位随机数
public static String getSixBitRandom() {
return sixdf.format(random.nextInt(1000000));
}
/**
* 给定数组,抽取n个数据
* @param list
* @param n
* @return
*/
public static ArrayList getRandom(List list, int n) {
Random random = new Random();
HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
// 生成随机数字并存入HashMap
for (int i = 0; i < list.size(); i++) {
int number = random.nextInt(100) + 1;
hashMap.put(number, i);
}
// 从HashMap导入数组
Object[] robjs = hashMap.values().toArray();
ArrayList r = new ArrayList();
// 遍历数组并打印数据
for (int i = 0; i < n; i++) {
r.add(list.get((int) robjs[i]));
System.out.print(list.get((int) robjs[i]) + "\t");
}
System.out.print("\n");
return r;
}
}
7、总结
集成阿里云短信服务的过程还相对简单的,只是申请签名和申请模板相对麻烦点。希望你能快速实现。
学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
------不写代码不会凸的小刘