校驗微信的返回access_token是否有效,並始終獲取配置文件中的有效的access_token

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


}

發佈了99 篇原創文章 · 獲贊 41 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章