springboot实现扫码登陆

实际项目需求,用户登陆方式用到微信扫码登陆,本次用到微信开发平台。经过实践终于实现

try {
            logger.info("进入微信登入方法,code为:{}", code);
            // 根据code获取access_token和openId
            String getAccessTokenAndOpenIdUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code";
            // 向微信发送请求获取access_token与openid
            HttpResponse response = HttpRequest.get(getAccessTokenAndOpenIdUrl).execute();
            logger.info("进入微信登入方法,code为:{}", response);
            Map<String, Object> accessTokenResult = JSONUtil.toBean(response.body(), Map.class);
            logger.info("进入微信登入方法,code为:{}", accessTokenResult);
            if (accessTokenResult != null && accessTokenResult.containsKey("access_token") && accessTokenResult.containsKey("refresh_token")) {
                String accessToken = (String) accessTokenResult.get("access_token");
                String refreshToken = (String) accessTokenResult.get("refresh_token");
                String openId = (String) accessTokenResult.get("openid");
                logger.info("进入微信登入方法,code为:{}", refreshToken);
                String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
                UserDto userDto = userService.selectUserByOpenId(openId);
                if(ObjectUtil.isEmpty(userDto)){
                     //新用户注册
                    logger.info("进入微信登入方法新用户注册,code为:{}", refreshToken);
                    HttpResponse userInfoResponse = HttpRequest.get(getUserInfoUrl).execute();
                    Map<String, Object> userInfo = JSONUtil.toBean(userInfoResponse.body(), Map.class);
                    String nickName = (String) userInfo.get("nickname");
                    String avatar = (String) userInfo.get("headimgurl");
                    UserDto addDto = userService.registerQr(openId, nickName, avatar);
                    if (ObjectUtil.isNotEmpty(addDto)) {
                        UserDto dto = userService.selectUserByOpenId(openId);
                        if (ObjectUtil.isEmpty(dto)) {
                            return AjaxResult.error("获取用户失败");
                        }
                        UserVo userVo = new UserVo();
                        BeanUtil.copyProperties(addDto, userVo);
                        logger.info("UserController {}", userVo);
                        //登陆机制获取token
                        StpUtil.login(userVo.getId());
                        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                        logger.info("token信息 {}", tokenInfo);
                        userVo.setToken(tokenInfo.getTokenValue());
                        return AjaxResult.success("获取成功", userVo);
                    }
                    return AjaxResult.error("注册失败");
                }else {
                    logger.info("进入微信登入方法老用户注册,code为:{}", refreshToken);
                    if(StrUtil.equals(userDto.getStatus(),"normal")){
                        UserVo userVo = new UserVo();
                        BeanUtil.copyProperties(userDto, userVo);
                        logger.info("UserController {}", userVo);
                        //登陆机制获取token
                        StpUtil.login(userVo.getId());
                        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                        logger.info("token信息 {}", tokenInfo);
                        userVo.setToken(tokenInfo.getTokenValue());
                        return AjaxResult.success("获取成功", userVo);
                    }else {
                        return AjaxResult.error("用户禁用");
                    }
                }
            }
            return AjaxResult.error("扫码登陆失败");

        }catch (Exception e){
            return AjaxResult.error("系统错误"+e.getMessage());
        }

欢迎点赞收藏转发————一个三线老码农

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值