@Slf4j
public class QiYeWeChatUtil {
/**
* 缓存企业微信accessToken
*/
public static final String QY_WX_TOKEN_kEY = "qy_wx_token:";
@Autowired
private QyWxConfig qyWxConfig;
@Resource
private RestService restService;
@Autowired
private RedisCache redisCache;
/**
* 获取企业微信 AccessToken
*
* @return
*/
public String getAccessToken() {
if (!redisCache.hasKey(QY_WX_TOKEN_kEY)) {
//请求头
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
//请求信息,传入header
HttpEntity<Map<String, String>> formEntity = new HttpEntity<>(header);
StringBuilder urlBuilder = new StringBuilder(qyWxConfig.getUrl());
urlBuilder.append("?").append("corpid=").append(qyWxConfig.getCorpid());
urlBuilder.append("&").append("corpsecret=").append(qyWxConfig.getCorpsecret());
try {
ResponseEntity<Map> entity = restService.getForEntity(urlBuilder.toString(), formEntity, Map.class);
log.info("请求企业微信,得到响应:{}", entity);
Map body = entity.getBody();
String accessToken = (String) body.get("access_token");
Integer expires_in = (Integer) body.get("expires_in");
redisCache.setCacheObject(QY_WX_TOKEN_kEY,accessToken, 7200, TimeUnit.SECONDS);
log.info("请求企业微信,获取accessToken成功有效时间为:{}", expires_in + "分钟");
return accessToken;
} catch (Exception e) {
log.error("获取token失败:{}", e);
throw new RuntimeException("获取AccessToken失败:{}", e);
}
}
log.info("从Redis缓存中获取的accessToken");
return redisCache.getCacheObject(QY_WX_TOKEN_kEY);
}
}
网络请求工具,使用的是okhttp,集成见链接:RestTemplate技术
package com.ruoyi.system.qiwechat.rest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Slf4j
@Service
public class RestService {
@Autowired
private RestTemplate restTemplate;
public <T> ResponseEntity<T> getForEntity(String url, HttpEntity<?> request, Class<T> responseType) {
try {
log.debug("[GET] request:[{}],URL:{}", request, url);
ResponseEntity<T> getForEntity = restTemplate.exchange(url, HttpMethod.GET, request, responseType);
return getForEntity;
} catch (Exception e) {
log.error("[GET] error URL:{}", url, e);
throw new RuntimeException(e);
}
}
public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType) {
try {
log.debug("[POST] request:[{}],URL:{}", request, url);
ResponseEntity<T> postForEntity = restTemplate.postForEntity(url, request, responseType);
return postForEntity;
} catch (Exception e) {
log.error("[POST] error URL:{}", url, e);
throw new RuntimeException(e);
}
}
}
在配置文件添加如下配置:
# 企业微信配置
qiyewx:
url: XXXXXXX
corpid: XXXXXXX
corpsecret: XXXXXXX
@Data
@Configuration
public class QyWxConfig {
/**
* 请求路径
*/
@Value("${qiyewx.url}")
private String url;
/**
* 企业微信ID
*/
@Value("${qiyewx.corpid}")
private String corpid;
/**
* 企业应用的凭证密钥
*/
@Value("${qiyewx.corpsecret}")
private String corpsecret;
spring Redis工具类
@Component
public class RedisCache
{
@Autowired
public RedisTemplate redisTemplate;
/**
* 判断 key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public Boolean hasKey(String key)
{
return redisTemplate.hasKey(key);
}
/**
* 缓存基本的对象,Integer、String、实体类等
*
* @param key 缓存的键值
* @param value 缓存的值
* @param timeout 时间
* @param timeUnit 时间颗粒度
*/
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
{
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}
/**
* 获得缓存的基本对象。
*
* @param key 缓存键值
* @return 缓存键值对应的数据
*/
public <T> T getCacheObject(final String key)
{
ValueOperations<String, T> operation = redisTemplate.opsForValue();
return operation.get(key);
}
}