| | |
| | | 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 { |
| | |
| | | @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; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | 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; |
| | | } |
| | | } |