1.什么是短信验证
在我们日常生活中经常会遇到短信验证功能,像上网购票或者注册网站账号等场景需要手机验证码,而验证码短信是商家为用户提供用于注册、信息变更等的安全凭证,通过手机验证码短信的内容来帮助用户安全使用账号。短信验证码应用到的场景:安全登录、用户注册、忘记密码、信息变更、活动确认、登录异常等。
2.开通服务
搜索阿里云官网 https://www.aliyun.com/ ,登录进去之后选择产品,搜索短信服务并开通此服务
2.1 添加签名
按照要求,输入合法信息并提交
2.2 添加模板
按照要求,输入合法模板信息并提交
最后等待审核成功之后就可以使用阿里云短信验证功能了
3.代码实现
3.1 导入依赖
使用阿里云短信验证需要导入以下两个依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.26</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.1</version> </dependency>
3.2 编写代码
这里我将随机生成一个六位数的字符串抽离成了一个工具类CodeUtil
public class CodeUtil { public static String getCode() { String content = "qwertyuiopasdfghjklzxcvbnm1234567890ZXCVBNMQWERTYUIOPASDFGHJKL"; Random random = new Random(); String result = ""; for (int i = 0; i < 6; i++) { int index = random.nextInt(content.length()); char c = content.charAt(index); result += c; } return result; } }
然后创建MsmController,提供发送验证码的接口
@RestController @RequestMapping("edumsm/msm") @CrossOrigin public class MsmController { @Autowired private MsmService msmService; @Autowired private RedisTemplate<String, String> template; @GetMapping("send/{phone}") public R sendMsmCode(@PathVariable String phone) { String code = template.opsForValue().get(phone); if (!StringUtils.isEmpty(code)) { return R.ok().data("msg","请五分钟后再试"); } code = CodeUtil.getCode(); Map<String, Object> map = new HashMap<String, Object>(); map.put("code", code); boolean isSend = msmService.sendCode(map, phone); if (isSend) { template.boundValueOps(phone).set(code, 5, TimeUnit.MINUTES); } return R.ok(); } }
创建MsmService,实现发送短信验证码
@Service public class MsmServiceImpl implements MsmService { public boolean sendCode(Map<String, Object> map, String phone) { if (StringUtils.isEmpty(phone)) { return false; } DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", 换成自己的KeyID, 换成自己的secret); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); request.setDomain("dysmsapi.aliyuncs.com"); request.setVersion("2017-05-25"); request.setAction("SendSms"); request.putQueryParameter("RegionId", "cn-hangzhou"); // 发给谁 ---- request.putQueryParameter("PhoneNumbers", phone); // 签名名称 request.putQueryParameter("SignName", 换成自己的); // 模板名称 request.putQueryParameter("TemplateCode", 换成自己的); // 验证码 ---- //request.putQueryParameter("TemplateParam", "{"code":"" + map.get("code") + ""}"); request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map).toString()); try { CommonResponse response = client.getCommonResponse(request); boolean success = response.getHttpResponse().isSuccess(); return success; } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } }
当我们访问controller接口的时候携带手机号就可以发送短信验证码了。