SpringBoot定时获取微信access_token

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen15369337607/article/details/78401113

微信公众号开发中的access_token 是调用微信接口的唯一凭证,每次成功调用都会使上次的失效;每次调用次数限制为2000,每一个access_token的时长为7200s(2小时);
下图为微信公众平台的官方文档:
微信公众平台的说明
我们这时就需要解决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;

/**
 * <p>Company: B505信息技术研究所 </p> 
 * @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;

/**
 * <p>Company: B505信息技术研究所 </p> 
 * @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;

/**
 * <p>Company: B505信息技术研究所 </p> 
 * @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

这里写图片描述
运行后如下:

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

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

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

展开阅读全文

没有更多推荐了,返回首页