package com.ruoyi.weixin;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.WeiXinToken;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service
public class WeiXinPublicService {
@Autowired
private SysConfigMapper sysConfigMapper;
//配置服务
@Autowired
private ISysConfigService sysConfigService;
/**
* 正常情况下,微信会返回下述JSON数据包给公众号:
* 更新配置文件表中键为accessTokenAndTime的记录
*
* @param json {"access_token":"ACCESS_TOKEN","expires_in":7200}
* @return
*/
public Integer saveWeiXinTokenConfig(String json) {
JSONObject jsonObject = JSON.parseObject(json);
String accessToken = jsonObject.getString("access_token");
int expiresIn = jsonObject.getIntValue("expires_in");
//有效时间=当前时间+7200秒
Date now = new Date();
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String validTime = sd.format(DateUtils.addSeconds(now, expiresIn));
String accessTokenAndTime = accessToken + "," + validTime;
SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("accessTokenAndTime");
sysConfig.setConfigValue(accessTokenAndTime);
int result = sysConfigMapper.updateConfig(sysConfig);
return result;
}
/**
* 重新获取access_token的方法
* 该方法是当系统配置表的token失效,才需要调用该方法重新请求微信接口,获取新的token,并将新的access_token保存到系统配置表
*
* @return true更新成功,false更新失败
*/
public boolean getAccessToken() {
String appId = sysConfigService.selectConfigByKey("APPID");
String appSecret = sysConfigService.selectConfigByKey("APPSECRET");
String json = WeiXinToken.getAccessToken("client_credential", appId, appSecret);
//更新配置文件中已过期的access_token
Integer result = this.saveWeiXinTokenConfig(json);
return result > 0 ? true : false;
}
/**
* 判断系统配置表的accessToken是否有效,始终获取有效token
* 每次取accessToken时,先判断当前时间是否大于数据库里保存的时间,如果大于,则表明过期了
*
* @return 返回access_token,是公众号的全局唯一接口调用凭据
*/
public String accessTokenIsValid() {
String accessTokenAndTime = sysConfigService.selectConfigByKey("accessTokenAndTime");
String[] tokenTimeArray = accessTokenAndTime.split(",");
String accessToken = tokenTimeArray[0];
String validTime = tokenTimeArray[1];
//获取当前时间
Date nowTime = new Date();
//获取系统参数表中的有效时间
Date validDateTime = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
validDateTime = sdf.parse(validTime);
} catch (ParseException e) {
e.printStackTrace();
}
//当前时间大于有效时间,token过期
if (nowTime.getTime() > validDateTime.getTime()) {
//重新获取token
String newAccessToken = null;
boolean bln = this.getAccessToken();
if(bln){
String newAccessTokenAndTime = sysConfigService.selectConfigByKey("accessTokenAndTime");
String[] newTokenTimeArray = newAccessTokenAndTime.split(",");
newAccessToken=newTokenTimeArray[0];
}
return newAccessToken;
} else {
//系统配置表中的token未过期,可以使用
return accessToken;
}
}
}
来源:CSDN
作者:zhengTornado
链接:https://blog.csdn.net/zhengTornado/article/details/103618461