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