From 7de1396e315896dbc72a9d54e44f77434ea90f18 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 14 十二月 2025 23:47:34 +0800
Subject: [PATCH] feat:增加企业微信自动登录

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QyWechatLoginController.java |  210 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 210 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QyWechatLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QyWechatLoginController.java
new file mode 100644
index 0000000..7cd5e5a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QyWechatLoginController.java
@@ -0,0 +1,210 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.framework.web.service.QyWechatLoginService;
+import com.ruoyi.system.service.IQyWechatAccessTokenService;
+import com.ruoyi.system.service.IQyWechatService;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+
+/**
+ * 浼佷笟寰俊鍏嶇櫥鎺у埗鍣�
+ * 
+ * @author ruoyi
+ * @date 2025-12-14
+ */
+@RestController
+@RequestMapping("/system/qywechat")
+public class QyWechatLoginController extends BaseController {
+    
+    private static final Logger log = LoggerFactory.getLogger(QyWechatLoginController.class);
+    
+    @Autowired
+    private IQyWechatAccessTokenService qyWechatAccessTokenService;
+    
+    @Autowired
+    private IQyWechatService qyWechatService;
+    
+    @Autowired
+    private ISysConfigService configService;
+    
+    @Autowired
+    private ISysUserService userService;
+    
+    @Autowired
+    private QyWechatLoginService qyWechatLoginService;
+    
+    /**
+     * 浼佷笟寰俊鍏嶇櫥鎺ュ彛
+     * 
+     * @param params 浼佷笟寰俊鎺堟潈code
+     * @return 鐧诲綍缁撴灉
+     */
+    @Anonymous
+    @PostMapping("/autoLogin")
+    public AjaxResult autoLogin(@RequestBody Map<String, String> params) {
+        try {
+            String code = params.get("code");
+            
+            if (code == null || code.isEmpty()) {
+                return AjaxResult.error("缂哄皯鎺堟潈code鍙傛暟");
+            }
+            
+            // 鑾峰彇浼佷笟寰俊閰嶇疆
+            String corpId = configService.selectConfigByKey("qy_wechat.corp_id");
+            // 鑾峰彇浼佷笟寰俊灏忕▼搴忕殑secret锛堢敤浜庤幏鍙朅ccessToken锛�
+            String miniProgramSecret = configService.selectConfigByKey("qy_wechat.miniprogram_secret");
+            
+            if (corpId == null || miniProgramSecret == null) {
+                return AjaxResult.error("浼佷笟寰俊閰嶇疆涓嶅畬鏁达紝璇锋鏌orp_id鍜宮iniprogram_secret閰嶇疆");
+            }
+            
+            // 鑾峰彇AccessToken锛堜娇鐢ㄥ皬绋嬪簭鐨剆ecret锛�
+            String accessToken = qyWechatAccessTokenService.getQyMiniAccessToken(corpId, miniProgramSecret);
+            if (accessToken == null) {
+                return AjaxResult.error("鑾峰彇浼佷笟寰俊AccessToken澶辫触");
+            }
+            
+            // 閫氳繃code鑾峰彇鐢ㄦ埛淇℃伅
+            Map<String, Object> userInfo = getUserInfoByCode(accessToken, code);
+            if (!((Boolean) userInfo.get("success"))) {
+                return AjaxResult.error((String) userInfo.get("message"));
+            }
+            
+            // 鑾峰彇鐢ㄦ埛ID
+            String userId = (String) userInfo.get("userid");
+            
+            // 鏍规嵁浼佷笟寰俊鐢ㄦ埛ID鏌ユ壘绯荤粺鐢ㄦ埛
+            SysUser sysUser = userService.selectUserByQyWechatUserId(userId);
+            if (sysUser == null) {
+                return AjaxResult.error("璇ヤ紒涓氬井淇¤处鍙锋湭缁戝畾绯荤粺鐢ㄦ埛");
+            }
+            
+            // 妫�鏌ョ敤鎴风姸鎬�
+            if ("1".equals(sysUser.getStatus())) {
+                return AjaxResult.error("鐢ㄦ埛宸茶鍋滅敤锛岃鑱旂郴绠$悊鍛�");
+            }
+            
+            if ("1".equals(sysUser.getDelFlag())) {
+                return AjaxResult.error("鐢ㄦ埛宸茶鍒犻櫎锛岃鑱旂郴绠$悊鍛�");
+            }
+            
+            // 浣跨敤QyWechatLoginService鐢熸垚token
+            String token = qyWechatLoginService.loginByQyUserId(userId, corpId);
+            
+            // 鏋勯�犺繑鍥炵粨鏋�
+            Map<String, Object> result = new HashMap<>();
+            result.put("token", token);
+            result.put("user", sysUser);
+            
+            return AjaxResult.success("鐧诲綍鎴愬姛", result);
+        } catch (Exception e) {
+            log.error("浼佷笟寰俊鍏嶇櫥寮傚父", e);
+            return AjaxResult.error("鐧诲綍寮傚父锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鏍规嵁code鑾峰彇鐢ㄦ埛淇℃伅
+     * 
+     * @param accessToken AccessToken
+     * @param code 鎺堟潈code
+     * @return 鐢ㄦ埛淇℃伅
+     */
+    private Map<String, Object> getUserInfoByCode(String accessToken, String code) {
+        try {
+            Map<String, Object> result = new HashMap<>();
+            
+            // 鏋勯�犺姹俇RL - 浣跨敤浼佷笟寰俊灏忕▼搴忎笓鐢ㄦ帴鍙�
+            String url = "https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=" + accessToken + "&js_code=" + code + "&grant_type=authorization_code";
+            
+            // 鍙戦�丠TTP GET璇锋眰
+            String response = sendHttpGetRequest(url);
+            if (response == null || response.isEmpty()) {
+                result.put("success", false);
+                result.put("message", "鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛屽搷搴斾负绌�");
+                return result;
+            }
+            
+            // 浣跨敤FastJSON瑙f瀽鍝嶅簲
+            JSONObject jsonResponse = JSON.parseObject(response);
+            
+            // 妫�鏌ユ槸鍚︽湁閿欒
+            Integer errcode = jsonResponse.getInteger("errcode");
+            if (errcode != null && errcode != 0) {
+                String errmsg = jsonResponse.getString("errmsg");
+                result.put("success", false);
+                result.put("message", "鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛岄敊璇爜锛�" + errcode + "锛岄敊璇俊鎭細" + errmsg);
+                return result;
+            }
+            
+            // 妫�鏌ユ槸鍚﹀寘鍚玼serid瀛楁
+            String userId = jsonResponse.getString("userid");
+            if (userId == null || userId.isEmpty()) {
+                result.put("success", false);
+                result.put("message", "鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛屾湭鎵惧埌鐢ㄦ埛ID");
+                return result;
+            }
+            
+            result.put("success", true);
+            result.put("userid", userId);
+            result.put("corpid", jsonResponse.getString("corpid"));
+            result.put("session_key", jsonResponse.getString("session_key"));
+            
+            return result;
+        } catch (Exception e) {
+            log.error("鑾峰彇鐢ㄦ埛淇℃伅寮傚父", e);
+            Map<String, Object> result = new HashMap<>();
+            result.put("success", false);
+            result.put("message", "鑾峰彇鐢ㄦ埛淇℃伅寮傚父锛�" + e.getMessage());
+            return result;
+        }
+    }
+    
+    /**
+     * 鍙戦�丠TTP GET璇锋眰
+     * 
+     * @param url 璇锋眰URL
+     * @return 鍝嶅簲鍐呭
+     */
+    private String sendHttpGetRequest(String url) {
+        try {
+            java.net.HttpURLConnection conn = (java.net.HttpURLConnection) new java.net.URL(url).openConnection();
+            conn.setRequestMethod("GET");
+            conn.setConnectTimeout(5000);
+            conn.setReadTimeout(5000);
+            
+            int responseCode = conn.getResponseCode();
+            if (responseCode == 200) {
+                java.io.BufferedReader reader = new java.io.BufferedReader(
+                    new java.io.InputStreamReader(conn.getInputStream(), "UTF-8"));
+                StringBuilder response = new StringBuilder();
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    response.append(line);
+                }
+                reader.close();
+                return response.toString();
+            } else {
+                log.error("HTTP璇锋眰澶辫触锛屽搷搴旂爜: {}", responseCode);
+                return null;
+            }
+        } catch (Exception e) {
+            log.error("鍙戦�丠TTP璇锋眰澶辫触", e);
+            return null;
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1