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;
}
}
}
校驗微信的返回access_token是否有效,並始終獲取配置文件中的有效的access_token
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.