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×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