springboot实现扫码登陆

ops/2024/11/14 13:05:47/

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

try {logger.info("进入微信登入方法,code为:{}", code);// 根据code获取access_token和openIdString getAccessTokenAndOpenIdUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code";// 向微信发送请求获取access_token与openidHttpResponse 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);//登陆机制获取tokenStpUtil.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);//登陆机制获取tokenStpUtil.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());}

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


http://www.ppmy.cn/ops/113382.html

相关文章

JVM 内存结构?

JVM 内存结构 这里的JVM内存结构&#xff0c;是指Runtime Data Areas(运行时数据区)。包含&#xff1a; 方法区&#xff08;Method Area&#xff09;虚拟机栈&#xff08;VM Stack&#xff09;本地方法栈&#xff08;Native Method&#xff09;堆&#xff08;Heap&#xff09…

五、I/O与网络编程-5.2、网络编程

5.2、网络编程 5.2.1、什么是网络四元组&#xff1f; 答&#xff1a; 网络四元组&#xff08;Network Quadruple&#xff09;是指在计算机网络中&#xff0c;用于标识通信连接的四个元素&#xff0c;分别是源IP地址、源端口号、目的IP地址和目的端口号。它们共同组成了网络通…

【Unity踩坑】UI Image的fillAmount不起作用

在游戏场景中&#xff0c;我们经常在界面上展示进度条&#xff0c;当然有各种形状的&#xff0c;线性的&#xff0c;长方形的&#xff0c;圆形&#xff0c;环形等等。 Unity中实现这种效果的话&#xff0c;最基本的方法说是改变Image的fillAmout属性。 如果你是初次使用UI Ima…

数据结构和算法之树形结构(1)

文章出处: 数据结构和算法之树形结构(1) 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01; 树形结构是数据结构四种逻辑结构之一&#xff0c;也是被广泛使用的一种逻辑结构&#xff0c;它描述的是数据元素之间一对多的逻辑关系。树是一种非线性的数据结构&a…

MATLAB基础:7.计算与编程策略

计算与编程策略 一、矢量化编程 MATLAB以矩阵为基本元素 什么是矢量化编程 将矩阵视为一个整体&#xff0c;对矩阵中的元素同时进行某种操作或运算&#xff0c;即整块的操作大量数据 矢量化编程的优点 代码大大简化&#xff0c;编程效率高&#xff0c;代码可读性高程序执行…

Git常用指令大全详解

Git常用指令大全详解 Git&#xff0c;作为目前最流行的分布式版本控制系统&#xff0c;其强大的功能和灵活性为开发者提供了极大的便利。无论是个人项目还是团队协作&#xff0c;Git都扮演着不可或缺的角色。本文将详细总结Git的常用指令&#xff0c;帮助大家更好地掌握这一工…

openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才

一、摘要 在技术革新的浪潮中&#xff0c;数据库技术是现代信息技术的基石&#xff0c;openGemini社区携手开发者&#xff0c;启动人才培养计划&#xff0c;旨在培养新一代云原生数据库技术人才&#xff0c;共同推动云原生数据库技术创新。 二、社区介绍 openGemini是一款开…

Unity引擎绘制多边形属性图

大家好&#xff0c;我是阿赵   在制作游戏的时候&#xff0c;经常会遇到需要绘制多边形属性图的需求&#xff0c;比如这种效果&#xff1a; 可以根据需要的属性的数量变化多边形的边数&#xff0c;然后每一个顶点从中心点开始到多边形的顶点的长度代表了该属性的强度&#xf…