From 7a0dd449cc2f49c18c2bc324a3ed283b5f1b3cf5 Mon Sep 17 00:00:00 2001 From: jiangqs <jiangqs> Date: 星期二, 09 五月 2023 17:43:38 +0800 Subject: [PATCH] Merge branch 'master' of ssh://sinata.cn:20202/java/HongRuiTang into master --- ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 104 insertions(+), 1 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..b425ba0 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 @@ -1,14 +1,29 @@ package com.ruoyi.auth.service; import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A; import com.ruoyi.auth.config.QywxInnerConfig; 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.apache.commons.lang3.ObjectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service public class QywxInnerService { @@ -18,21 +33,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; } @@ -96,4 +124,79 @@ return detailResponse; } + + + + public AgentConfigVo getAgentConfig(String url) { + + AgentConfigVo agentConfigVo = new AgentConfigVo(); + agentConfigVo.setAgentid(qywxInnerConfig.getAgentId()); + agentConfigVo.setCorpid(qywxInnerConfig.getCorpId()); + + //临时票据 + String ticket = getJsApiTicket(); + 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 accessToken = getAccessToken(); + String ticket = redisTemplate.opsForValue().get(Constants.QY_WX_TICKET_KEY); + if(!StringUtils.isEmpty(ticket)){ + return ticket; + } + String url = String.format(qywxInnerConfig.getJsapiTicketAgentUrl(), 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(Constants.QY_WX_TICKET_KEY, ticket, expiresIn, TimeUnit.SECONDS); + + return ticket; + } } -- Gitblit v1.7.1