自己写扫码登录

二维码扫码登录

获取二维码

自己公司要做的扫码登录,又用不了微信官方扫码,逻辑较为简单,就自己写呗,哈哈哈哈哈,第一篇博客,不是分享


获取二维码,生成uuid

    @ApiOperation(value = "获取登录二维码", notes = "获取登录二维码")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid"),
    })
    @GetMapping("getQrCode")
    public Msg getQrCode(String uuid, HttpServletResponse response) {
        QrCode qrCode = new QrCode().setCode(QrCode.S_THREE)
            .setTime(new Date());
        stringRedisTemplate.opsForValue()
            .set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        createQrCode(response,uuid);
        return success("操作成功");
    }

二维码客户端实时回调

获二维码客户端实时回调

     @ApiOperation(value = "客户端实时获取登录状态", notes = "客户端实时获取登录状态")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @GetMapping("pcQrCodeLoginState")
    public Msg pcQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(QrCode.S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);

        //如果状态为已过期,直接返回
        String code = qrCode.getCode();
        if (ObjectUtil.isEmpty(code) || code.equals(S_SIX)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }

        //如果状态为登录成功
        if (ObjectUtil.isEmpty(code) || S_ONE.equals(code)) {
            TeacherDto teacherDto = qrCode.getTeacherDto();
            if (ObjectUtil.isEmpty(teacherDto)) {
                stringRedisTemplate.opsForValue()
                    .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_TWO)), S_CAN_TIME, TimeUnit.SECONDS);
                return new Msg<>(S_TWO, "登录失败");
            }
            return new Msg<>(S_ONE, teacherDto, "登录成功");
        }
        //没有过期就重新设置二维码过期时间
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return new Msg<>(qrCode.getCode(), "操作成功");
    }

客户端和微信端取消扫码

客户端和微信端取消扫码,另一端回调自动取消

     /**
     * @param uuid 唯一标识
     * @return com.amdox.common.vo.Msg
     * @author huboxin
     * @description: TODO 取消扫码登录
     * @date 14:07 2020/5/14
     **/
    @ApiOperation(value = "取消扫码登录", notes = "取消扫码登录")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "唯一标识", paramType = "_query"),
    })
    @GetMapping("cancelCodeLogin")
    public Msg cancelCodeLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_FIVE)), S_CAN_TIME, TimeUnit.SECONDS);
        return success("取消成功");
    }

扫码端实时获取二维码状态

扫码端实时获取二维码状态

    @ApiOperation(value = "微信实时扫码端获取二维码状态", notes = "微信实时扫码端获取二维码状态")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @GetMapping("wxQrCodeLoginState")
    public Msg wxQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        Date time = qrCode.getTime();
        //如果二维码创建时间,超过2分钟 ,修改二维码状态为已过期,返回过期
        if (ObjectUtil.isEmpty(time) || DateUtil.compare(time, DateUtil.offsetMinute(new Date(), -2)) < 0) {
            stringRedisTemplate.opsForValue()
                .set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_SIX)), S_CAN_TIME, TimeUnit.SECONDS);
            return new Msg<>(S_SIX, "二维码已过期");
        }
        return new Msg(qrCode.getCode(), "获取成功");
    }

扫码

微信端扫码,获取openid,判断是否绑定,未绑定则跳转绑定

    @ApiOperation(value = "扫码之后调用", notes = "扫码之后调用")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
        @ApiImplicitParam(name = "code", value = "授权后的code", paramType = "_query"),
    })
    @PostMapping("scanCode")
    public Msg scanCode(@NotNull(message = "唯一标识不可为空") String uuid, @NotNull(message = "授权信息不可为空") String code) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        String getOpenUrl = UriComponentsBuilder.fromHttpUrl(uri)
            .queryParam("appid", appId)
            .queryParam("secret", secret)
            .queryParam("code", code)
            .queryParam("grant_type", "authorization_code")
            .build()
            .toUriString();
//        Map wx = JSONUtil.toBean(HttpUtil.get(getOpenUrl), Map.class);
//        HttpUtil.get(getOpenUrl);
//        if (ObjectUtil.isEmpty(wx)) {
//            return fail("获取用户信息失败,请稍后重试");
//        }
//        Object openid = wx.get("openid");
        Object openid = "oxSg0wVk7FWV7jZy1DDjWtQeOc";
        if (ObjectUtil.isEmpty(openid)) {
            return new Msg<>(S_TWO, "登录失败");
        }
        //拿openId查询数据,有则登录,无则绑定用户
        String url = ServicePath.SERVICE_PUBLIC_API_LOGIN + "lanclazzLoginByOpenId";
        url = UriComponentsBuilder.fromHttpUrl(url)
            .queryParam("openId", openid)
            .build()
            .toUriString();

        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (ObjectUtil.isEmpty(qrCode)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        qrCode.setOpenId(openid.toString())
            .setCode(S_FOUR);

        //修改状态为已扫码
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        Msg msg = restTemplate.postForObject(url, null, Msg.class);
        if (!Msg.isSuccess(msg)) {
            return new Msg<>(S_SEVEN, "未绑定用户");
        }
        TeacherDto teacherDto = Msg.toObjectMsg(msg, TeacherDto.class);
        if (teacherDto == null || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return new Msg<>(S_SEVEN, "未绑定用户");
        }
        qrCode.setTeacherDto(teacherDto.setPassword(""));
        //修改状态为已扫码
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return success("操作成功");
    }

确认登录

用户手动确认登录

     @ApiOperation(value = "确定登录", notes = "确定登录")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @PostMapping("affirmLogin")
    public Msg affirmLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return fail("二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (ObjectUtil.isEmpty(qrCode)) {
            return fail("二维码已过期");
        }
        if (S_FIVE.equals(qrCode.getCode())) {
            return fail("扫码已取消");
        }
        TeacherDto teacherDto = qrCode.getTeacherDto();
        if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return fail("登录失败,请稍后重试");
        }
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_ONE)), S_CAN_TIME, TimeUnit.SECONDS);
        return success("登录成功");
    }

用户绑定openid

用户绑定openid,自动登录

    @ApiOperation(value = "微信openid 绑定教师", notes = "微信openid 绑定教师")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "telephone", value = "手机号", paramType = "_query"),
        @ApiImplicitParam(name = "password", value = "密码", paramType = "_query"),
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @PostMapping("bindingTeacherLogin")
    public Msg bindingTeacherLogin(@NotNull(message = "手机号不可为空") String telephone,
                                   @NotNull(message = "密码不可为空") String password,
                                   @NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return fail("二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (S_FIVE.equals(qrCode.getCode())) {
            return fail("扫码已取消");
        }
        String openId = qrCode.getOpenId();
        if (ObjectUtil.isEmpty(openId)) {
            return fail("用户信息不存在,请重新扫描二维码");
        }
        String url = ServicePath.SERVICE_PUBLIC_API_CLAZZ_TEACHER_V1 + "login";
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.set("telephone", telephone);
        map.set("password", MD5Utils.getMD5String(password));
        Msg forObject = restTemplate.postForObject(url, map, Msg.class);
        if (!Msg.isSuccess(forObject)) {
            return fail("请确认手机号或密码是否正确");
        }
        Map tokenMap = Msg.toObjectMsg(forObject, Map.class);
        TeacherDto teacherDto = JSONUtil.toBean(JSONUtil.toJsonStr(tokenMap.get("teacher")), TeacherDto.class);
        if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return fail("绑定失败,请稍后重试");
        }
        String bindUrl = ServicePath.SERVICE_COMMON_LONGIN + "addWechatTeacherLoginWay";
        String bindReqUrl = UriComponentsBuilder.fromHttpUrl(bindUrl)
            .queryParam("teacherId", teacherDto.getTeacherId())
            .queryParam("openId", openId)
            .build()
            .toUriString();
        Msg msg = restTemplate.postForObject(bindReqUrl, null, Msg.class);
        if (ObjectUtil.isEmpty(msg)) {
            return fail("绑定失败,请稍后重试");
        }
        if (!Msg.isSuccess(msg)) {
            return fail("绑定失败,请稍后重试");
        }
        qrCode.setCode(S_ONE);
        qrCode.setTeacherDto(teacherDto.setPassword(""));
        //修改状态为登录
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return success("登录成功");
    }

生成二维码

生成二维码

     /**
     * 生成二维码
     * @param response response
     * @param uuid uuid
     */
    private void createQrCode(HttpServletResponse response,String uuid){
        // Set to expire far in the past.
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
        } catch (IOException e) {
            System.out.println(1);
        }
        QrCodeUtil.generate(//
            "http://192.168.5.148:8081/?uuid=" + uuid + "&code=123456",
            QrConfig.create()
                .setImg("C:/Users/15290/Desktop/测试文件/download.jpg"),
            "jpg", Objects.requireNonNull(outputStream)
        );
        try {
            outputStream.close();
        } catch (IOException ignored) {
            System.out.println(1);
        }
    }

二维码扫码登录

获取二维码

获取二维码,生成uuid

    @ApiOperation(value = "获取登录二维码", notes = "获取登录二维码")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid"),
    })
    @GetMapping("getQrCode")
    public Msg getQrCode(String uuid, HttpServletResponse response) {
        QrCode qrCode = new QrCode().setCode(QrCode.S_THREE)
            .setTime(new Date());
        stringRedisTemplate.opsForValue()
            .set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        createQrCode(response,uuid);

        CronUtil.start(false);
        CronUtil.setMatchSecond(true);
        CronUtil.schedule("0/2 * * * * ? ", (Task) () -> {
            Msg msg = pcQrCodeLoginState(uuid);
            System.out.println(msg);
        });
        return success("操作成功");
    }

二维码客户端实时回调

获二维码客户端实时回调

     @ApiOperation(value = "客户端实时获取登录状态", notes = "客户端实时获取登录状态")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @GetMapping("pcQrCodeLoginState")
    public Msg pcQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(QrCode.S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);

        //如果状态为已过期,直接返回
        String code = qrCode.getCode();
        if (ObjectUtil.isEmpty(code) || code.equals(S_SIX)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }

        //如果状态为登录成功
        if (ObjectUtil.isEmpty(code) || S_ONE.equals(code)) {
            TeacherDto teacherDto = qrCode.getTeacherDto();
            if (ObjectUtil.isEmpty(teacherDto)) {
                stringRedisTemplate.opsForValue()
                    .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_TWO)), S_CAN_TIME, TimeUnit.SECONDS);
                return new Msg<>(S_TWO, "登录失败");
            }
            return new Msg<>(S_ONE, teacherDto, "登录成功");
        }
        //没有过期就重新设置二维码过期时间
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return new Msg<>(qrCode.getCode(), "操作成功");
    }

客户端和微信端取消扫码

客户端和微信端取消扫码,另一端回调自动取消

     /**
     * @param uuid 唯一标识
     * @return com.amdox.common.vo.Msg
     * @author huboxin
     * @description: TODO 取消扫码登录
     * @date 14:07 2020/5/14
     **/
    @ApiOperation(value = "取消扫码登录", notes = "取消扫码登录")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "唯一标识", paramType = "_query"),
    })
    @GetMapping("cancelCodeLogin")
    public Msg cancelCodeLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_FIVE)), S_CAN_TIME, TimeUnit.SECONDS);
        return success("取消成功");
    }

扫码端实时获取二维码状态

扫码端实时获取二维码状态

    @ApiOperation(value = "微信实时扫码端获取二维码状态", notes = "微信实时扫码端获取二维码状态")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @GetMapping("wxQrCodeLoginState")
    public Msg wxQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg(S_SIX, "二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        Date time = qrCode.getTime();
        //如果二维码创建时间,超过2分钟 ,修改二维码状态为已过期,返回过期
        if (ObjectUtil.isEmpty(time) || DateUtil.compare(time, DateUtil.offsetMinute(new Date(), -2)) < 0) {
            stringRedisTemplate.opsForValue()
                .set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_SIX)), S_CAN_TIME, TimeUnit.SECONDS);
            return new Msg<>(S_SIX, "二维码已过期");
        }
        return new Msg(qrCode.getCode(), "获取成功");
    }

扫码

微信端扫码,获取openid,判断是否绑定,未绑定则跳转绑定

    @ApiOperation(value = "扫码之后调用", notes = "扫码之后调用")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
        @ApiImplicitParam(name = "code", value = "授权后的code", paramType = "_query"),
    })
    @PostMapping("scanCode")
    public Msg scanCode(@NotNull(message = "唯一标识不可为空") String uuid, @NotNull(message = "授权信息不可为空") String code) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        String getOpenUrl = UriComponentsBuilder.fromHttpUrl(uri)
            .queryParam("appid", appId)
            .queryParam("secret", secret)
            .queryParam("code", code)
            .queryParam("grant_type", "authorization_code")
            .build()
            .toUriString();
//        Map wx = JSONUtil.toBean(HttpUtil.get(getOpenUrl), Map.class);
//        HttpUtil.get(getOpenUrl);
//        if (ObjectUtil.isEmpty(wx)) {
//            return fail("获取用户信息失败,请稍后重试");
//        }
//        Object openid = wx.get("openid");
        Object openid = "oxSg0wVk7FWV7jZy1DDjWtQeOc";
        if (ObjectUtil.isEmpty(openid)) {
            return new Msg<>(S_TWO, "登录失败");
        }
        //拿openId查询数据,有则登录,无则绑定用户
        String url = ServicePath.SERVICE_PUBLIC_API_LOGIN + "lanclazzLoginByOpenId";
        url = UriComponentsBuilder.fromHttpUrl(url)
            .queryParam("openId", openid)
            .build()
            .toUriString();

        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (ObjectUtil.isEmpty(qrCode)) {
            return new Msg<>(S_SIX, "二维码已过期");
        }
        qrCode.setOpenId(openid.toString())
            .setCode(S_FOUR);

        //修改状态为已扫码
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        Msg msg = restTemplate.postForObject(url, null, Msg.class);
        if (!Msg.isSuccess(msg)) {
            return new Msg<>(S_SEVEN, "未绑定用户");
        }
        TeacherDto teacherDto = Msg.toObjectMsg(msg, TeacherDto.class);
        if (teacherDto == null || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return new Msg<>(S_SEVEN, "未绑定用户");
        }
        qrCode.setTeacherDto(teacherDto.setPassword(""));
        //修改状态为已扫码
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return success("操作成功");
    }

确认登录

用户手动确认登录

     @ApiOperation(value = "确定登录", notes = "确定登录")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @PostMapping("affirmLogin")
    public Msg affirmLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return fail("二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (ObjectUtil.isEmpty(qrCode)) {
            return fail("二维码已过期");
        }
        if (S_FIVE.equals(qrCode.getCode())) {
            return fail("扫码已取消");
        }
        TeacherDto teacherDto = qrCode.getTeacherDto();
        if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return fail("登录失败,请稍后重试");
        }
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_ONE)), S_CAN_TIME, TimeUnit.SECONDS);
        return success("登录成功");
    }

用户绑定openid

用户绑定openid,自动登录

    @ApiOperation(value = "微信openid 绑定教师", notes = "微信openid 绑定教师")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "telephone", value = "手机号", paramType = "_query"),
        @ApiImplicitParam(name = "password", value = "密码", paramType = "_query"),
        @ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
    })
    @PostMapping("bindingTeacherLogin")
    public Msg bindingTeacherLogin(@NotNull(message = "手机号不可为空") String telephone,
                                   @NotNull(message = "密码不可为空") String password,
                                   @NotNull(message = "唯一标识不可为空") String uuid) {
        String value = stringRedisTemplate.opsForValue()
            .get(S_CAN_CODE + uuid);
        if (ObjectUtil.isEmpty(value)) {
            return fail("二维码已过期");
        }
        QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
        if (S_FIVE.equals(qrCode.getCode())) {
            return fail("扫码已取消");
        }
        String openId = qrCode.getOpenId();
        if (ObjectUtil.isEmpty(openId)) {
            return fail("用户信息不存在,请重新扫描二维码");
        }
        String url = ServicePath.SERVICE_PUBLIC_API_CLAZZ_TEACHER_V1 + "login";
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.set("telephone", telephone);
        map.set("password", MD5Utils.getMD5String(password));
        Msg forObject = restTemplate.postForObject(url, map, Msg.class);
        if (!Msg.isSuccess(forObject)) {
            return fail("请确认手机号或密码是否正确");
        }
        Map tokenMap = Msg.toObjectMsg(forObject, Map.class);
        TeacherDto teacherDto = JSONUtil.toBean(JSONUtil.toJsonStr(tokenMap.get("teacher")), TeacherDto.class);
        if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
            return fail("绑定失败,请稍后重试");
        }
        String bindUrl = ServicePath.SERVICE_COMMON_LONGIN + "addWechatTeacherLoginWay";
        String bindReqUrl = UriComponentsBuilder.fromHttpUrl(bindUrl)
            .queryParam("teacherId", teacherDto.getTeacherId())
            .queryParam("openId", openId)
            .build()
            .toUriString();
        Msg msg = restTemplate.postForObject(bindReqUrl, null, Msg.class);
        if (ObjectUtil.isEmpty(msg)) {
            return fail("绑定失败,请稍后重试");
        }
        if (!Msg.isSuccess(msg)) {
            return fail("绑定失败,请稍后重试");
        }
        qrCode.setCode(S_ONE);
        qrCode.setTeacherDto(teacherDto.setPassword(""));
        //修改状态为登录
        stringRedisTemplate.opsForValue()
            .set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
        return success("登录成功");
    }

生成二维码

生成二维码

     /**
     * 生成二维码
     * @param response response
     * @param uuid uuid
     */
    private void createQrCode(HttpServletResponse response,String uuid){
        // Set to expire far in the past.
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
        } catch (IOException e) {
            System.out.println(1);
        }
        QrCodeUtil.generate(//
            "http://192.168.5.148:8081/?uuid=" + uuid + "&code=123456",
            QrConfig.create()
                .setImg("C:/Users/15290/Desktop/测试文件/download.jpg"),
            "jpg", Objects.requireNonNull(outputStream)
        );
        try {
            outputStream.close();
        } catch (IOException ignored) {
            System.out.println(1);
        }
    }

二维码实体类

二维码实体类

    
@Data
@Accessors(chain = true)
public class QrCode implements Serializable {


    /**
     * redis前缀
     */
    public static String S_CAN_CODE = "scan_qr_code::";

    /**
     * 二维码redis过期时间 分钟
     */
    public static Integer S_CAN_TIME = 5;

    /**
     * 1登录成功
     */
    public static String S_ONE = "1";

    /**
     * 2登录失败
     */
    public static String S_TWO = "2";
    /**
     * 未扫码
     */
    public static String S_THREE = "3";
    /**
     * 4已扫码
     */
    public static String S_FOUR = "4";
    /**
     * 已取消
     */
    public static String S_FIVE = "5";
    /**
     * 二维码过期
     */
    public static String S_SIX = "6";

    /**
     * 未绑定用户
     */
    public static String S_SEVEN = "7";

    /**
     * 状态码
     */
    private String code;

    /**
     * 登录教师
     */
    private TeacherDto teacherDto;

    /**
     * 生成二维码时间
     */
    private Date time;

    /**
     * openId
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd hh:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private String openId;

    /**
     * 唯一标识
     */
    private String uuid;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值