SpringBoot定时获取微信access_token

本文介绍了一种在SpringBoot环境下定时获取并管理微信公众号access_token的方法,通过将access_token保存在内存中,确保了微信接口调用的有效性和时效性。

微信公众号开发中的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 保存到内存中;

Spring Boot中开发微信素材永久上传接口需要进行以下步骤: 1. 导入必要的依赖:首先在pom.xml文件中添加相关的依赖,如Spring Web、Spring Boot DevTools以及第三方库如Apache HttpComponents等。 2. 创建Access Token获取接口:微信接口需要Access Token进行身份验证。可以创建一个Controller类,定义一个调用微信API获取Access Token的方法,并使用Scheduled定时任务来定期刷新Access Token。在该方法中,可以使用HttpComponents库来发送请求并解析返回的JSON数据,最后将获取到的Access Token存储在一个全局变量中。 3. 创建素材上传接口:同样,创建一个Controller类,并定义一个用于处理上传素材的方法。在该方法中,需要先获取到之前获取Access Token,然后使用HttpComponents库发送POST请求,将素材文件内容作为请求的Body发送给微信API。 4. 处理上传结果:根据微信API返回的结果,可以采取不同的处理方式。如果上传成功,可以将返回的MediaId等相关信息保存到数据库中。如果上传失败,可以返回相应的错误信息。 5. 配置文件设置:在application.properties或application.yml(根据实际使用的配置文件类型而定)中设置微信公众号的相关配置信息,如AppID、AppSecret等。在Controller类中可以通过@Value注解来读取并使用这些配置信息。 6. 异常处理:当出现异常情况时,可以使用Spring Boot的全局异常处理机制来统一处理异常,返回相应的错误信息。 通过以上步骤,我们可以在Spring Boot中开发一个用于微信素材永久上传的接口。接口可以通过访问URL来调用,将素材文件上传到微信服务器,并将上传结果返回给调用方。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值