From bb839b724afdaf9b4ea8a80c2d8963d2b9c2934c Mon Sep 17 00:00:00 2001 From: Houjie <714924425@qq.com> Date: 星期四, 17 七月 2025 09:50:06 +0800 Subject: [PATCH] 企业微信静默登录修改手动授权登录 --- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java | 138 +++++++++++++++++++++++++++++++++++++-------- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java | 12 ++-- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java | 5 + lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java | 3 + 4 files changed, 127 insertions(+), 31 deletions(-) diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java index a76732e..18317b2 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java @@ -9,7 +9,6 @@ import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.utils.AuthStateUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; @@ -17,7 +16,6 @@ import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.RestUtil; import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.shiro.JwtToken; import org.jeecg.config.thirdapp.ThirdAppConfig; import org.jeecg.config.thirdapp.ThirdAppTypeItemVo; import org.jeecg.modules.base.service.BaseCommonService; @@ -203,7 +201,7 @@ String token = JwtUtil.sign(user.getUsername(), user.getPassword()); redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); // 璁剧疆瓒呮椂鏃堕棿 - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); return token; } @@ -308,15 +306,17 @@ // 浼佷笟鐨凜orpID builder.append("?appid=").append(config.getClientId()); // 鎺堟潈鍚庨噸瀹氬悜鐨勫洖璋冮摼鎺ュ湴鍧�锛岃浣跨敤urlencode瀵归摼鎺ヨ繘琛屽鐞� - String redirectUri ="https://fastwoke.cn:8087/jeecg-boot/sys/thirdLogin/oauth2/wechat_enterprise/callback"; + String redirectUri = "https://fastwoke.cn:8087/jeecg-boot/sys/thirdLogin/oauth2/wechat_enterprise/callback"; builder.append("&redirect_uri=").append(URLEncoder.encode(redirectUri, "UTF-8")); // 杩斿洖绫诲瀷锛屾鏃跺浐瀹氫负锛歝ode builder.append("&response_type=code"); // 搴旂敤鎺堟潈浣滅敤鍩熴�� // snsapi_base锛氶潤榛樻巿鏉冿紝鍙幏鍙栨垚鍛樼殑鐨勫熀纭�淇℃伅锛圲serId涓嶥eviceId锛夛紱 - builder.append("&scope=snsapi_base"); +// builder.append("&scope=snsapi_base"); + builder.append("&scope=snsapi_privateinfo"); // 鎵嬪姩鎺堟潈浣滅敤鍩� // 閲嶅畾鍚戝悗浼氬甫涓妔tate鍙傛暟锛岄暱搴︿笉鍙秴杩�128涓瓧鑺� builder.append("&state=").append(state); + builder.append("&agentid=").append(config.getAgentId()); // 琛ュ厖AgentID // 缁堢浣跨敤姝ゅ弬鏁板垽鏂槸鍚﹂渶瑕佸甫涓婅韩浠戒俊鎭� builder.append("#wechat_redirect"); url = builder.toString(); @@ -399,7 +399,7 @@ } String token = saveToken(loginUser); - state += "/oauth2-app/login?oauth2LoginToken=" + URLEncoder.encode(token, "UTF-8"); + state += "/h5/oauth2-app/login?oauth2LoginToken=" + URLEncoder.encode(token, "UTF-8"); //update-begin---author:wangshuai ---date:20220613 for锛歔issues/I5BOUF]oauth2 閽夐拤鏃犳硶鐧诲綍------------ state += "&thirdType=" + source; //state += "&thirdType=" + "wechat_enterprise"; diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java index f3b583f..715cd7b 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java @@ -77,4 +77,7 @@ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private java.util.Date updateTime; + /**鎵嬫満鍙�*/ + @Excel(name = "鎵嬫満鍙�", width = 15) + private java.lang.String phone; } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java index 4f6cc27..5fcd449 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java @@ -33,6 +33,11 @@ private String avatar; /** + * 绗笁鏂圭櫥褰� 鎵嬫満鍙� + */ + private String phone; + + /** * 璐﹀彿 鍚庣紑绗笁鏂圭櫥褰� 闃叉璐﹀彿閲嶅 */ private String suffix; diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java index f98789b..720544c 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java @@ -1031,31 +1031,31 @@ /** * OAuth2鐧诲綍锛屾垚鍔熻繑鍥炵櫥褰曠殑SysUser锛屽け璐ヨ繑鍥瀗ull */ - public SysUser oauth2Login(String code) { - String accessToken = this.getAppAccessToken(); - if (accessToken == null) { - return null; - } - String appUserId = this.getUserIdByThirdCode(code, accessToken); - if (appUserId != null) { - // 鍒ゆ柇绗笁鏂圭敤鎴疯〃鏈夋病鏈夎繖涓汉 - LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysThirdAccount::getThirdUserUuid, appUserId); - queryWrapper.or().eq(SysThirdAccount::getThirdUserId, appUserId); - queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); - SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); - if (thirdAccount != null) { - return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken); - } else { - // 鐩存帴鍒涘缓鏂拌处鍙� - User appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); - ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar()); - thirdAccount = sysThirdAccountService.saveThirdUser(tlm); - return this.getSysUserByThird(thirdAccount, appUser, null, null); - } - } - return null; - } +// public SysUser oauth2Login(String code) { +// String accessToken = this.getAppAccessToken(); +// if (accessToken == null) { +// return null; +// } +// String appUserId = this.getUserIdByThirdCode(code, accessToken); +// if (appUserId != null) { +// // 鍒ゆ柇绗笁鏂圭敤鎴疯〃鏈夋病鏈夎繖涓汉 +// LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysThirdAccount::getThirdUserUuid, appUserId); +// queryWrapper.or().eq(SysThirdAccount::getThirdUserId, appUserId); +// queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); +// SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); +// if (thirdAccount != null) { +// return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken); +// } else { +// // 鐩存帴鍒涘缓鏂拌处鍙� +// User appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); +// ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar()); +// thirdAccount = sysThirdAccountService.saveThirdUser(tlm); +// return this.getSysUserByThird(thirdAccount, appUser, null, null); +// } +// } +// return null; +// } /** * 鏍规嵁绗笁鏂硅处鍙疯幏鍙栨湰鍦拌处鍙凤紝濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓 @@ -1093,4 +1093,92 @@ } } + + + + /** + * OAuth2鐧诲綍锛屾垚鍔熻繑鍥炵櫥褰曠殑SysUser锛屽け璐ヨ繑鍥瀗ull + */ + public SysUser oauth2Login(String code) { + String accessToken = this.getAppAccessToken(); + if (accessToken == null) { + return null; + } + + // 閫氳繃code鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_ticket锛� + JSONObject userInfoResult = this.getUserInfoByCode(code, accessToken); + if (userInfoResult == null || userInfoResult.getInteger("errcode") != 0) { + log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛淇℃伅澶辫触锛宑ode: {}", code); + return null; + } + + String appUserId = userInfoResult.getString("UserId"); + String userTicket = userInfoResult.getString("user_ticket"); // 鎵嬪姩鎺堟潈杩斿洖鐨勭敤鎴风エ鎹� + + if (appUserId != null) { + // 鍒ゆ柇绗笁鏂圭敤鎴疯〃鏈夋病鏈夎繖涓汉 + LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysThirdAccount::getThirdUserUuid, appUserId); + queryWrapper.or().eq(SysThirdAccount::getThirdUserId, appUserId); + queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); + SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); + + // 閫氳繃user_ticket鑾峰彇鐢ㄦ埛璇︾粏淇℃伅锛堝寘鍚墜鏈哄彿绛夋晱鎰熶俊鎭級 + JSONObject userDetail = this.getUserDetailByTicket(userTicket, accessToken); + String mobile = userDetail.getString("mobile"); + + if (thirdAccount != null) { + // 鏇存柊鎵嬫満鍙凤紙濡傛灉鏈夛級 + if (mobile != null && !mobile.isEmpty()) { + thirdAccount.setPhone(mobile); + sysThirdAccountService.updateById(thirdAccount); + } + return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken); + } else { + // 鐩存帴鍒涘缓鏂拌处鍙凤紝鍖呭惈鎵嬫満鍙蜂俊鎭� + User appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); + ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar()); + tlm.setPhone(mobile); // 璁剧疆鎵嬫満鍙� + thirdAccount = sysThirdAccountService.saveThirdUser(tlm); + return this.getSysUserByThird(thirdAccount, appUser, null, null); + } + } + return null; + } + + /** + * 閫氳繃code鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_ticket锛� + */ + private JSONObject getUserInfoByCode(String code, String accessToken) { + String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo" + + "?access_token=" + accessToken + + "&code=" + code; + + try { + + String result = String.valueOf(RestUtil.get(url)); + return JSONObject.parseObject(result); + } catch (Exception e) { + log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛淇℃伅寮傚父", e); + return null; + } + } + + /** + * 閫氳繃user_ticket鑾峰彇鐢ㄦ埛璇︾粏淇℃伅锛堝寘鍚墜鏈哄彿绛夋晱鎰熶俊鎭級 + */ + private JSONObject getUserDetailByTicket(String userTicket, String accessToken) { + String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail"; + JSONObject params = new JSONObject(); + params.put("user_ticket", userTicket); + + try { + String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, JSONObject.parseObject(params.toJSONString()))); +// String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, params.toJSONString())); + return JSONObject.parseObject(result); + } catch (Exception e) { + log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛璇︾粏淇℃伅寮傚父", e); + return new JSONObject(); // 杩斿洖绌哄璞¢伩鍏峃PE + } + } } -- Gitblit v1.9.3