瑞吉外卖项目:短信服务与手机验证码登录

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

一. 短信发送

现在有很多第三方提供的短信服务,这些短信服务会与短信运营商所对接,我们只需按照提供的接口文档进行开发调用就可以发送短信服务,这个过程一般是需要收费的。
常用的第三方短信服务:
   阿里云,华为云,腾讯云,京东,梦网,乐信等。
  以阿里云短信服务为例:


阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。
调用API或用群发助手,即可发送验证码、通知类和营销类短信;国内验证短信秒级触达,到达率最高可达99%。
国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。
主要应用于验证码,短信通知,推广短信。
若是个人是无法使用阿里云短信服务的,添加签名时需要企业账号。


开发过程中,我们可以使用阿里云提供的API发送短信测试功能进行代码测试。
可以查看根据阿里云提供的短信服务的接口文档
二. 手机验证码登录

通常移动端通过使用手机验证码进行登录,主要有这些优点:


  • 方便快捷,无需注册直接登录
  • 无需记忆密码
  • 安全
流程:
输入手机号获取验证码后点击登录,登录成功。
用户模型使用一张表user表


  •  在登录页面(front/page/loginhtml)输入手机号,点击【获取验证码】按钮,页面发送ajax请求,在服务端调用短信服务API给指定手机号发送验证码短信
  • 在登录页面输入验证码,点击【登录】按钮,发送ajax请求,在服务端处理登录请求
  
之前对PC端登录进行用户校验,同样移动端也需要进行登录校验,修改LoginCheckFilter.java
  1.         String[] urls = new String[]{
  2.                 "/employee/login",
  3.                 "/employee/logout",
  4.                 "/backend/**",
  5.                 "/front/**",
  6.                 "/common/**",
  7.                 "/user/sendMsg",
  8.                 "/user/login"
  9.         };
复制代码
添加移动用户session校验:
  1. //4-2 判断登陆状态,若已经登陆直接放行(移动端)
  2. if (request.getSession().getAttribute("user") != null) {
  3.     log.info("用户已登录,id为:{}", request.getSession().getAttribute("user"));
  4.     Long empId = (Long) request.getSession().getAttribute("user");
  5.     BaseContext.setCurrentId(empId);
  6.     long id = Thread.currentThread().getId();
  7.     log.info("线程ID为:{}", id);
  8.     filterChain.doFilter(request, response);
  9.     return;
  10. }
复制代码
模拟验证码获取

由于使用阿里云获取短信需要收费,在这里只做模拟获取验证码的方式
API

 UserController.java
  1.     /**
  2.      * 移动端发送短信
  3.      * @param user
  4.      * @param session
  5.      * @return
  6.      */
  7.     @PostMapping("/sendMsg")
  8.     public R<String> sendMsg(@RequestBody User user, HttpSession session){
  9.         // 获取手机号
  10.         String phone = user.getPhone();
  11.         if(StringUtils.isNotEmpty(phone)){
  12.             // 生成验证码
  13.             String code = ValidateCodeUtils.generateValidateCode4String(4).toString();
  14.             log.info("瑞吉外卖验证码:code为:" + code);
  15.             // 调用阿里云短信服务API完成发送短信
  16.             // SMSUtils.sendMessage("瑞吉外卖","",phone,validateCode4String);
  17.             // 将生成的验证码保存
  18.             session.setAttribute(phone,code);
  19.             return R.success("短信发送成功");
  20.         }
  21.         return R.error("短信发送失败");
  22.     }
复制代码
移动端用户登录

API

 UserController.java实现登录:
  1. /**
  2. * 移动端用户登录
  3. * @param map
  4. * @param session
  5. * @return
  6. */
  7. @PostMapping("/login")
  8. public R<User> login(@RequestBody Map map, HttpSession session){
  9.     log.info(map.toString());
  10.     // 获取手机号
  11.     String phone = (String) map.get("phone");
  12.     // 获取验证码
  13.     String code = (String) map.get("code");
  14.     // session中获取验证码
  15.     Object codeSession = session.getAttribute(phone);
  16.     // 比对验证码
  17.     if(codeSession!=null&&codeSession.equals(code)){
  18.         // 成功,则登录
  19.         // 判断当前用户是否为新用户,新用户自动完成注册
  20.         LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
  21.         // 手机号查询新用户
  22.         queryWrapper.eq(User::getPhone, phone);
  23.         User user = userService.getOne(queryWrapper);
  24.         if(user==null){
  25.              user = new User();
  26.              user.setPhone(phone);
  27.              user.setStatus(CommonsConst.EMPLOYEE_STATUS_YES);
  28.              userService.save(user);
  29.         }
  30.         session.setAttribute("user",user);
  31.         return R.success(user);
  32.     }
  33.     return R.error("登录失败,验证码有误");
  34. }
复制代码
测试要点:验证码是否生成正确,新用户是否完成注册。
最后测试成功,可以完成登录。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表