目的是集成阿里云短信服务,完成验证码的发送和接收。
目 录
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>
逻辑实现
//发送短信的方法@Overridepublic boolean sendMsm(HashMap<String, Object> map, String phone) {if (StringUtils.isEmpty(phone))return false;//参数1:地域节点//参数2:AccessKey ID//参数3:AccessKey SecretDefaultProfile 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>();// 生成随机数字并存入HashMapfor (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、总结
集成阿里云短信服务的过程还相对简单的,只是申请签名和申请模板相对麻烦点。希望你能快速实现。
学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
------不写代码不会凸的小刘