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