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-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java |  122 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 114 insertions(+), 8 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java
index 534a865..ee04163 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java
@@ -31,15 +31,15 @@
      * 鑾峰彇浼佷笟寰俊搴旂敤鐨凙ccessToken
      *
      * @param corpId 浼佷笟ID
-     * @param corpSecret 搴旂敤瀵嗛挜
+     * @param secret 搴旂敤瀵嗛挜鎴栧皬绋嬪簭瀵嗛挜
      * @return AccessToken
      */
     @Override
-    public String getAppAccessToken(String corpId, String corpSecret) {
+    public String getAppAccessToken(String corpId, String secret) {
         try {
             // 鍙傛暟鏍¢獙
-            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(corpSecret)) {
-                log.warn("浼佷笟寰俊閰嶇疆鍙傛暟涓嶅畬鏁达紝corpId鎴朿orpSecret涓虹┖");
+            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(secret)) {
+                log.warn("浼佷笟寰俊閰嶇疆鍙傛暟涓嶅畬鏁达紝corpId鎴杝ecret涓虹┖");
                 return null;
             }
 
@@ -77,7 +77,7 @@
             }
 
             // Token涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紝鍒锋柊Token
-            return refreshAppAccessToken(corpId, corpSecret);
+            return refreshAppAccessToken(corpId, secret);
         } catch (Exception e) {
             log.error("鑾峰彇浼佷笟寰俊AccessToken澶辫触", e);
             return null;
@@ -88,16 +88,16 @@
      * 鍒锋柊浼佷笟寰俊搴旂敤鐨凙ccessToken
      *
      * @param corpId 浼佷笟ID
-     * @param corpSecret 搴旂敤瀵嗛挜
+     * @param secret 搴旂敤瀵嗛挜鎴栧皬绋嬪簭瀵嗛挜
      * @return 鏂扮殑AccessToken
      */
     @Override
-    public String refreshAppAccessToken(String corpId, String corpSecret) {
+    public String refreshAppAccessToken(String corpId, String secret) {
         try {
             log.info("寮�濮嬪埛鏂颁紒涓氬井淇ccessToken");
 
             // 鏋勫缓璇锋眰URL
-            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + corpSecret;
+            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + secret;
 
             // 鍙戦�丠TTP璇锋眰鑾峰彇Token
             String response = sendHttpGetRequest(url);
@@ -135,6 +135,112 @@
     }
 
     /**
+     * 鑾峰彇浼佷笟寰俊灏忕▼搴忕殑AccessToken
+     *
+     * @param corpId 浼佷笟ID
+     * @param corpSecret 灏忕▼搴忓瘑閽�
+     * @return AccessToken
+     */
+    @Override
+    public String getQyMiniAccessToken(String corpId, String corpSecret) {
+        try {
+            // 鍙傛暟鏍¢獙
+            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(corpSecret)) {
+                log.warn("浼佷笟寰俊灏忕▼搴忛厤缃弬鏁颁笉瀹屾暣锛宑orpId鎴朿orpSecret涓虹┖");
+                return null;
+            }
+
+            // 妫�鏌ユ湇鍔℃槸鍚﹀惎鐢�
+            if (!isEnabled()) {
+                log.info("浼佷笟寰俊鏈嶅姟宸茬鐢紝鏃犳硶鑾峰彇灏忕▼搴廇ccessToken");
+                return null;
+            }
+
+            // 鏋勫缓閰嶇疆閿悕锛堜娇鐢ㄤ笉鍚岀殑閿悕浠ュ尯鍒嗘櫘閫氬簲鐢ㄥ拰灏忕▼搴忥級
+            String tokenKey = "qy_wechat.mini_access_token." + corpId;
+            String expiresKey = "qy_wechat.mini_access_token_expires." + corpId;
+
+            // 浠庨厤缃腑鑾峰彇Token鍜岃繃鏈熸椂闂�
+            String accessToken = configService.selectConfigByKey(tokenKey);
+            String expiresStr = configService.selectConfigByKey(expiresKey);
+
+            // 妫�鏌oken鏄惁瀛樺湪涓旀湭杩囨湡
+            if (StringUtils.isNotEmpty(accessToken) && StringUtils.isNotEmpty(expiresStr)) {
+                try {
+                    long expiresTime = Long.parseLong(expiresStr);
+                    long currentTime = System.currentTimeMillis();
+
+                    // 棰勭暀60绉掑畨鍏ㄨ竟鐣岋紝閬垮厤涓寸晫鐐硅繃鏈�
+                    if (currentTime < expiresTime - 60000) {
+                        log.debug("浣跨敤缂撳瓨鐨勪紒涓氬井淇″皬绋嬪簭AccessToken锛屽墿浣欐湁鏁堟椂闂�: {}绉�", 
+                            (expiresTime - currentTime) / 1000);
+                        return accessToken;
+                    } else {
+                        log.info("浼佷笟寰俊灏忕▼搴廇ccessToken宸茶繃鏈熸垨鍗冲皢杩囨湡锛岄渶瑕佸埛鏂�");
+                    }
+                } catch (NumberFormatException e) {
+                    log.warn("瑙f瀽浼佷笟寰俊灏忕▼搴廇ccessToken杩囨湡鏃堕棿澶辫触: {}", expiresStr);
+                }
+            }
+
+            // Token涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紝鍒锋柊Token
+            return refreshQyMiniAccessToken(corpId, corpSecret);
+        } catch (Exception e) {
+            log.error("鑾峰彇浼佷笟寰俊灏忕▼搴廇ccessToken澶辫触", e);
+            return null;
+        }
+    }
+
+    /**
+     * 鍒锋柊浼佷笟寰俊灏忕▼搴忕殑AccessToken
+     *
+     * @param corpId 浼佷笟ID
+     * @param corpSecret 灏忕▼搴忓瘑閽�
+     * @return 鏂扮殑AccessToken
+     */
+    public String refreshQyMiniAccessToken(String corpId, String corpSecret) {
+        try {
+            log.info("寮�濮嬪埛鏂颁紒涓氬井淇″皬绋嬪簭AccessToken");
+
+            // 鏋勫缓璇锋眰URL
+            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + corpSecret;
+
+            // 鍙戦�丠TTP璇锋眰鑾峰彇Token
+            String response = sendHttpGetRequest(url);
+            
+            if (StringUtils.isEmpty(response)) {
+                log.error("鑾峰彇浼佷笟寰俊灏忕▼搴廇ccessToken澶辫触锛屽搷搴斾负绌�");
+                return null;
+            }
+
+            // 瑙f瀽鍝嶅簲
+            QyWechatTokenResponse tokenResponse = parseTokenResponse(response);
+            
+            if (tokenResponse == null || StringUtils.isEmpty(tokenResponse.getAccessToken())) {
+                log.error("瑙f瀽浼佷笟寰俊灏忕▼搴廇ccessToken鍝嶅簲澶辫触: {}", response);
+                return null;
+            }
+
+            // 璁$畻杩囨湡鏃堕棿锛堝綋鍓嶆椂闂� + 鏈夋晥鏈� - 60绉掑畨鍏ㄨ竟鐣岋級
+            long expiresTime = System.currentTimeMillis() + (tokenResponse.getExpiresIn() * 1000L) - 60000L;
+
+            // 鏋勫缓閰嶇疆閿悕锛堜娇鐢ㄤ笉鍚岀殑閿悕浠ュ尯鍒嗘櫘閫氬簲鐢ㄥ拰灏忕▼搴忥級
+            String tokenKey = "qy_wechat.mini_access_token." + corpId;
+            String expiresKey = "qy_wechat.mini_access_token_expires." + corpId;
+
+            // 淇濆瓨鍒扮郴缁熼厤缃〃
+            configService.updateConfigValue(tokenKey, tokenResponse.getAccessToken());
+            configService.updateConfigValue(expiresKey, String.valueOf(expiresTime));
+
+            log.info("浼佷笟寰俊灏忕▼搴廇ccessToken鍒锋柊鎴愬姛锛屾湁鏁堟湡: {}绉�", tokenResponse.getExpiresIn());
+            return tokenResponse.getAccessToken();
+        } catch (Exception e) {
+            log.error("鍒锋柊浼佷笟寰俊灏忕▼搴廇ccessToken澶辫触", e);
+            return null;
+        }
+    }
+
+    /**
      * 妫�鏌ヤ紒涓氬井淇℃湇鍔℃槸鍚﹀惎鐢�
      *
      * @return true-鍚敤锛宖alse-绂佺敤

--
Gitblit v1.9.1