SpringBoot定时获取微信access_token

微信公众号开发中的access_token 是调用微信接口的唯一凭证,每次成功调用都会使上次的失效;每次调用次数限制为2000,每一个access_token的时长为7200s(2小时);
下图为微信公众平台的官方文档:
SpringBoot定时获取微信access_token_第1张图片
我们这时就需要解决access_token的有效时间,思路有两个:
1.定时获取access_token ,将其保存在内存中;
2.定时获取access_token,将其保存到数据库中;
在sprigBoot下的定时任务很简单,实例如下:
先创建一个task类,负责将获取到的access_token 保存到内存中:

/**
 * 微信的accessToken有效时间为两个小时,调用微信接口很多都要用到accessToken所以需要将accessToken保存(保存到内存中或者保存到数据库中)这里使用保存到内存中的方式实现
 */
package com.b505.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.b505.weixin.pojo.WeixinAccessToken;
import com.b505.weixin.util.WeixinCommenUtil;
import com.b505.weixin.util.WeixinConstants;

/**
 * 

Company: B505信息技术研究所

* @Description: 定时获取微信accessToken(7100s)保存到内存中 * @Create Date: 2017年10月23日上午10:47:32 * @Version: V1.00 * @Author: 追到乌云的尽头找太阳 */ @Component public class WeixinAccessTokenTask { Logger logger = LoggerFactory.getLogger(WeixinAccessTokenTask.class); @Autowired private WeixinCommenUtil weixinCommenUtil; // 第一次延迟1秒执行,当执行完后7100秒再执行 @Scheduled(initialDelay = 1000, fixedDelay = 7000*1000 ) public void getWeixinAccessToken(){ try { String token = weixinCommenUtil.getToken(WeixinConstants.APPID, WeixinConstants.APPSECRET).getAccess_token(); WeixinAccessToken.setToken(token); logger.info("获取到的微信accessToken为"+token); } catch (Exception e) { logger.error("获取微信adcessToken出错,信息如下"); e.printStackTrace(); this.getWeixinAccessToken(); // 此处可能陷入死循环 } } }

这里需要注意的是使用了一个@Component注解,将其标注为一个bean ,注册到Spring容器中; 一个@Scheduled(initialDelay = 1000, fixedDelay = 7000*1000 ) 注解标注此为一个定时任务,第一次延迟1秒执行,然后每7100s执行一次,但是此时定时任务并不能真正执行,需要开启定时任务,找到程序的入口,有@SpringBootApplication注解的启动类,添加@EnableScheduling注解开启定时任务;就可以在SpringBoot项目中开启定时任务了;

/**
 * SpringBoot程序的启动入口
 */
package com.b505;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * 

Company: B505信息技术研究所

* @Description: 程序的入口(一些需要在程序启动就需要加载的配置) * @Create Date: 2017年9月14日下午1:11:05 * @Version: V1.00 * @Author: 追到乌云的尽头找太阳 */ @SpringBootApplication // 组合注解,加载SpringBoot @EnableScheduling // 开启定时任务 public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } }

此时在SpringBoot中开启定时任务就完成了;
获取access_token 的代码如下:

/**
 * 微信公用操作的类,获取accessToken
 */
package com.b505.weixin.util;

import net.sf.json.JSONObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.b505.util.HttpRequestUtil;
import com.b505.weixin.pojo.AccessToken;

/**
 * 

Company: B505信息技术研究所

* @Description: 微信公用和常用的操作类 * @Create Date: 2017年10月18日下午2:07:56 * @Version: V1.00 * @Author: 追到乌云的尽头找太阳 */ @Component public class WeixinCommenUtil { Logger logger = LoggerFactory.getLogger(WeixinCommenUtil.class); @Autowired private HttpRequestUtil httpRequestUtil; // 获取access_token的接口地址(GET) 限2000(次/天) private static String url=WeixinConstants.ACCESS_TOKEN_URL; public AccessToken getToken(String appid, String appsecret){ AccessToken token=null; //访问微信服务器的地址 String requestUrl=url.replace("APPID", appid).replace("APPSECRET", appsecret); //HttpRequestUtil httpRequestUtil=new HttpRequestUtil(); //创建一个json对象 JSONObject json =httpRequestUtil.httpsRequest(requestUrl,"GET",null); System.out.println("获取到的json格式的Token为:"+json); //判断json是否为空 if (json!=null){ try{ token=new AccessToken(); //将获取的access_token放入accessToken对象中 token.setAccess_token(json.getString("access_token")); //将获取的expires_in时间放入accessToken对象中 token.setExpires_in(json.getInt("expires_in")); } catch (Exception e){ token=null; e.printStackTrace(); System.out.println("系统出错了!"); } }else { token=null; // 获取token失败 logger.error("获取token失败 errcode:{} errmsg:{}"); } return token; } }

获取access_token 的url为:
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

SpringBoot定时获取微信access_token_第2张图片
运行后如下:

这里写图片描述
这里定时任务已经执行,并且已经获取到了access_token,为了增强效果可以将时间改为每5秒获取一次

// 第一次延迟1秒执行,当执行完后5秒再执行
    @Scheduled(initialDelay = 1000, fixedDelay = 5000 )

,效果如下:
这里写图片描述
根据时间间隔可以看出每5秒获取一次access_token;
这是将access_token 保存到内存中;

你可能感兴趣的:(【,SprintBoot,篇,】,【,微信开发,篇,】)