校验微信的返回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;
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值