赞
踩
背景:目前在很多项目中都出现使用短信验证码来实现注册、登录、购买、支付、转账等功能,发短信功能几乎已经成为项目中不可或缺的技术之一。
写代码时需要特别注意短信验证码的安全性,例如防止短信轰炸、重复发送或被恶意利用等问题。
1.注册阿里云账号
2.点击右上角的控制台后,搜索短信服务
3.申请签名
添加签名:
4.申请模板
短信模板包含短信发送内容、场景、变量信息
添加模板:
申请后的模板详情:
申请签名和申请模板都需要人工审核的,一般1到2个工作日,其实还是挺快的。
5.设置AccessKey
相当于用户名的密码(自己记住和使用)
将鼠标移到右上角的头像,就会弹出以下对话框:
妥善保管好自己的AccessKey的密码,一旦泄漏出去,别人使用你的短信验证,耗费自己的费用。
创建自己的用户
勾选openApI调用,相当于使用编程访问
创建好后,显示AccessKeyID和AccessKey Secrect,将密码保存到自己找的到的地方,方便后续使用。
官方提示:若开通 OpenAPI 调用访问,请及时保存 AccessKey 信息,页面关闭后将无法再次获取信息。
设置权限:
点击新增授权
这两个权限是如果你的AccessKey泄漏出去了,别人也只能调用你短信验证的功能,不能使用其他的功能。
如果你不使用了,或者泄漏出去了,你也可以把AccessKey禁用或者删除。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.2.1</version>
</dependency>
可以在文档帮助中心找相应语言的SDK,可以将代码改造一下,通过Api就可以调用短信验证服务了。
/** * 短信发送工具类 */ public class SMSUtils { /** * 发送短信 * @param signName 签名 * @param templateCode 模板 * @param phoneNumbers 手机号 * @param param 参数 */ public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){ DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", ""); //getProfile(地域编码,AccessKeyId,AccessKeySecret) IAcsClient client = new DefaultAcsClient(profile); SendSmsRequest request = new SendSmsRequest(); request.setSysRegionId("cn-hangzhou");//设置地域编码 request.setPhoneNumbers(phoneNumbers); request.setSignName(signName); request.setTemplateCode(templateCode); request.setTemplateParam("{\"code\":\""+param+"\"}"); try { SendSmsResponse response = client.getAcsResponse(request); System.out.println("短信发送成功"); }catch (ClientException e) { e.printStackTrace(); } } }
/** * 随机生成验证码工具类 */ public class ValidateCodeUtils { /** * 随机生成验证码 * @param length 长度为4位或者6位 * @return */ public static Integer generateValidateCode(int length){ Integer code =null; if(length == 4){ code = new Random().nextInt(9999);//生成随机数,最大为9999 if(code < 1000){ code = code + 1000;//保证随机数为4位数字 } }else if(length == 6){ code = new Random().nextInt(999999);//生成随机数,最大为999999 if(code < 100000){ code = code + 100000;//保证随机数为6位数字 } }else{ throw new RuntimeException("只能生成4位或6位数字验证码"); } return code; } /** * 随机生成指定长度字符串验证码 * @param length 长度 * @return */ public static String generateValidateCode4String(int length){ Random rdm = new Random(); String hash1 = Integer.toHexString(rdm.nextInt()); String capstr = hash1.substring(0, length); return capstr; } }
@PostMapping("/sendMsg") public R<String> sendMsg(@RequestBody User user, HttpSession session){ //获取手机号 String phone = user.getPhone(); if (StringUtils.isNotEmpty(phone)){ //生成随机的4位验证码 String code = ValidateCodeUtils.generateValidateCode(4).toString(); log.info("code={}",code); //调用阿里云提供的短信服务api完成发送短信 // SMSUtils.sendMessage("模板签名","模板id",phone,code); //需要将生成的验证码保存到Session session.setAttribute(phone,code); return R.success("手机短信验证码发送成功"); } return R.error("短信发送失败"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。