From a7389e026856e7a2369ad2e928778b036894a96c Mon Sep 17 00:00:00 2001
From: jiangqs <jiangqs>
Date: 星期日, 13 八月 2023 01:21:20 +0800
Subject: [PATCH] bug
---
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×tamp=%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