张国伟 发表于 2022-6-26 11:24:53

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

一. 短信发送

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

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

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

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


[*]方便快捷,无需注册直接登录
[*]无需记忆密码
[*]安全
流程:
输入手机号获取验证码后点击登录,登录成功。
用户模型使用一张表user表
https://img-blog.csdnimg.cn/ced6422f93614d44b545ae2b8169f759.png

[*] 在登录页面(front/page/loginhtml)输入手机号,点击【获取验证码】按钮,页面发送ajax请求,在服务端调用短信服务API给指定手机号发送验证码短信
[*]在登录页面输入验证码,点击【登录】按钮,发送ajax请求,在服务端处理登录请求
  
之前对PC端登录进行用户校验,同样移动端也需要进行登录校验,修改LoginCheckFilter.java:
      String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**",
                "/common/**",
                "/user/sendMsg",
                "/user/login"
      }; 添加移动用户session校验:
//4-2 判断登陆状态,若已经登陆直接放行(移动端)
if (request.getSession().getAttribute("user") != null) {
    log.info("用户已登录,id为:{}", request.getSession().getAttribute("user"));

    Long empId = (Long) request.getSession().getAttribute("user");
    BaseContext.setCurrentId(empId);
    long id = Thread.currentThread().getId();
    log.info("线程ID为:{}", id);
    filterChain.doFilter(request, response);
    return;
} 模拟验证码获取

由于使用阿里云获取短信需要收费,在这里只做模拟获取验证码的方式
API
https://img-blog.csdnimg.cn/2035a6a58b484cf4865d6392952ac269.png
 UserController.java
    /**
   * 移动端发送短信
   * @param user
   * @param session
   * @return
   */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
      // 获取手机号
      String phone = user.getPhone();
      if(StringUtils.isNotEmpty(phone)){
            // 生成验证码
            String code = ValidateCodeUtils.generateValidateCode4String(4).toString();
            log.info("瑞吉外卖验证码:code为:" + code);
            // 调用阿里云短信服务API完成发送短信
            // SMSUtils.sendMessage("瑞吉外卖","",phone,validateCode4String);
            // 将生成的验证码保存
            session.setAttribute(phone,code);
            return R.success("短信发送成功");
      }
      return R.error("短信发送失败");
    } 移动端用户登录

API
https://img-blog.csdnimg.cn/bfe3b5eecbc14718882283ef2c458f75.png
 UserController.java实现登录:
/**
* 移动端用户登录
* @param map
* @param session
* @return
*/
@PostMapping("/login")
public R<User> login(@RequestBody Map map, HttpSession session){
    log.info(map.toString());
    // 获取手机号
    String phone = (String) map.get("phone");
    // 获取验证码
    String code = (String) map.get("code");
    // session中获取验证码
    Object codeSession = session.getAttribute(phone);
    // 比对验证码
    if(codeSession!=null&&codeSession.equals(code)){
      // 成功,则登录
      // 判断当前用户是否为新用户,新用户自动完成注册
      LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
      // 手机号查询新用户
      queryWrapper.eq(User::getPhone, phone);
      User user = userService.getOne(queryWrapper);
      if(user==null){
             user = new User();
             user.setPhone(phone);
             user.setStatus(CommonsConst.EMPLOYEE_STATUS_YES);
             userService.save(user);
      }
      session.setAttribute("user",user);
      return R.success(user);
    }
    return R.error("登录失败,验证码有误");
} 测试要点:验证码是否生成正确,新用户是否完成注册。
最后测试成功,可以完成登录。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 瑞吉外卖项目:短信服务与手机验证码登录