From 8444084e6aa11efa23287e7f82474ac22378a5c4 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 01 四月 2025 16:03:19 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 106 insertions(+), 2 deletions(-)

diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java
index d36e18a..7e2954f 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java
@@ -5,10 +5,18 @@
 import com.ruoyi.auth.utils.RestUtils;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.system.api.model.AgentConfigVo;
+import org.apache.commons.codec.binary.Hex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.concurrent.TimeUnit;
 
 @Service
 public class QywxInnerService {
@@ -18,21 +26,34 @@
     @Autowired
     private QywxInnerConfig qywxInnerConfig;
 
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
 
     public String getAccessToken(){
+
+        String accessToken = redisTemplate.opsForValue().get(Constants.QY_WX_ACCESS_TOKEN_KEY);
+        if(!StringUtils.isEmpty(accessToken)){
+            return accessToken;
+        }
 
         String corpId = qywxInnerConfig.getCorpId();
         String agentSecret = qywxInnerConfig.getAgentSecret();
 
         String  accessTokenUrl = String.format(qywxInnerConfig.getAccessTokenUrl(), corpId, agentSecret);
         JSONObject response = RestUtils.get(accessTokenUrl);
+
         // 获取错误日志
         if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){
             logger.error(response.toString());
             throw new ServiceException("获取企业微信ACCESS_TOKEN异常");
         }
-        return response.getString(Constants.QY_WX_ACCESS_TOKEN);
+        accessToken = response.getString(Constants.QY_WX_ACCESS_TOKEN);
+        Long expiresIn = response.getLong(Constants.QY_WX_EXPIRES_IN);
+        expiresIn = expiresIn - 100;
+        redisTemplate.opsForValue().set(Constants.QY_WX_ACCESS_TOKEN_KEY, accessToken, expiresIn, TimeUnit.SECONDS);
 
+        return accessToken;
     }
 
 
@@ -93,7 +114,90 @@
         }
         logger.info("----------------userinfo detail -------------");
         logger.info(detailResponse.toString());
-
         return detailResponse;
     }
+
+
+
+    public AgentConfigVo getAgentConfig(String url, String type) {
+
+        AgentConfigVo agentConfigVo = new AgentConfigVo();
+        agentConfigVo.setAgentid(qywxInnerConfig.getAgentId());
+        agentConfigVo.setCorpid(qywxInnerConfig.getCorpId());
+
+        //临时票据
+        String ticket = getJsApiTicket(type);
+        if (StringUtils.isEmpty(ticket)) {
+           throw new ServiceException("获取票据异常");
+        }
+        //当前时间戳 转成秒
+        long timestamp = System.currentTimeMillis() / 1000;
+        //随机字符串
+        String nonceStr = Constants.QY_WX_NONCE_STR;
+        String signature = getSignature(ticket, nonceStr, timestamp, url);
+        agentConfigVo.setTimestamp(String.valueOf(timestamp));
+        agentConfigVo.setNonceStr(nonceStr);
+        agentConfigVo.setSignature(signature);
+
+        return agentConfigVo;
+    }
+
+
+    private String getSignature(String ticket, String nonceStr, long timestamp, String url) {
+        String unEncryptStrBase = "jsapi_ticket=%s&noncestr=%s&timestamp=%s&url=%s";
+        try {
+            String unEncryptStr = String.format(unEncryptStrBase, ticket, nonceStr, timestamp, url);
+
+            logger.info("----------------unEncryptStr-------------");
+            logger.info(unEncryptStr);
+
+            MessageDigest digest = MessageDigest.getInstance("SHA-1");
+            // 调用digest方法,进行加密操作
+            byte[] cipherBytes = digest.digest(unEncryptStr.getBytes());
+            String encryptStr = Hex.encodeHexString(cipherBytes);
+            logger.info("----------------getSignature-------------");
+            logger.info(encryptStr);
+            return encryptStr;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取ticket
+     * @paran type
+     * @return
+     */
+    public String getJsApiTicket(String type) {
+        String accessToken = getAccessToken();
+        String ticketKey = Constants.QY_WX_TICKET_KEY;
+
+        String jsapiTicketUrl = qywxInnerConfig.getJsapiTicketUrl();
+        if("agent_config".equals(type)){
+            ticketKey = ticketKey + type;
+            jsapiTicketUrl = qywxInnerConfig.getJsapiTicketAgentUrl();
+        }
+
+        String ticket = redisTemplate.opsForValue().get(ticketKey);
+        if(!StringUtils.isEmpty(ticket)){
+            return ticket;
+        }
+
+        String url = String.format(jsapiTicketUrl, accessToken);
+
+        JSONObject response = RestUtils.get(url);
+        if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){
+            logger.error(response.toString());
+            throw new ServiceException("获取企业微信信息异常");
+        }
+
+        ticket = response.getString(Constants.QY_WX_TICKET);
+        Long expiresIn = response.getLong(Constants.QY_WX_EXPIRES_IN);
+        expiresIn = expiresIn - 100;
+        redisTemplate.opsForValue().set(ticketKey, ticket, expiresIn, TimeUnit.SECONDS);
+
+        return ticket;
+    }
 }

--
Gitblit v1.7.1