此处以保存用户授权access_token为例,接口调用access_token可在项目启动时进行缓存。部分代码如下:
@Autowired
private RedisTemplate redisTemplate;
@Value("${myapp.redisWxUserAccessToken}")
private String redisWxUserAccessToken;
// 获取
public String getUserAccessToken(Object userId) {
String accessToken = null;
if(StringUtils.isEmpty(userId)) return accessToken;
String accessTokenStr = (String) redisTemplate.opsForHash().get(redisWxUserAccessToken, String.valueOf(userId));
long now = (new Date()).getTime();
if(!StringUtils.isEmpty(accessTokenStr)) {
String[] arr = accessTokenStr.split("#");
if(now < Long.valueOf(arr[1])) {
accessToken = arr[0];
}
}
if(StringUtils.isEmpty(accessToken)) {
accessToken = getUserAccessTokenByRefreshToken(userId);
}
return accessToken;
}
// 重新获取
Object expiresIn = accessTokenMap.get("expires_in"); // 调用微信授权接口后,返回的expires_in参数
String value = accessTokenNew + "#" + getNowExpiresIn(expiresIn); // 此处是设置有效期
redisTemplate.opsForHash().put(redisWxUserAccessToken, String.valueOf(userId), value);
public Long getNowExpiresIn(Object expiresIn) {
long now = (new Date()).getTime();
if(expiresIn == null) return now;
Long expiresMs = Long.valueOf(String.valueOf(expiresIn)) - 15 * 60;
return expiresMs * 1000 + now;
}