微信开发专题---4获取access_token

本文介绍微信公众号接口调用的基础——AccessToken的获取与管理方法,包括其重要性、有效期限及存储需求,并提供了多种实现自动刷新AccessToken的技术方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.access_token简介
    1. access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
    2. 公众平台的API调用所需的access_token的使用及生成方式说明
        为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

     3. 公众号可以使用AppID和AppSecret调用本接口来获取access_token, 注意调用所有微信接口时均需使用https协议。 如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新access_token,那么就可能会产生冲突,导致服务不稳定。

     

二.获取accessToken的刷新和获取(2H时就会自动刷新)

  3.1  采用HttpClient的框架

/**
 * 模拟Get请求,获取access_token
 * @author liuhang
 *
 */
public class TestHttp {

	// 测试获取access_token,2小时就会自动刷新
	@Test
	public void testSendGet() {
		try {
			CloseableHttpClient client = HttpClients.createDefault();
			String url = WeixinFinalValue.ACCESS_TOKEN_URL;
			url = url.replaceAll("APPID", WeixinFinalValue.APPID);
			url = url.replaceAll("APPSECRET", WeixinFinalValue.APPSECRET);
			//System.out.println(url);
			HttpGet get = new HttpGet(url);
			CloseableHttpResponse resp = client.execute(get);
			int status = resp.getStatusLine().getStatusCode();
			if(status>=200&&status<300) {
				HttpEntity entity = resp.getEntity();
				String content = EntityUtils.toString(entity);
				AccessToken at = (AccessToken)JsonUtil.getInstance().json2obj(content, AccessToken.class);
				System.out.println(at.getAccess_token()+","+at.getExpires_in());	
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


  3.2 使用timer类实现  

// 使用Timer来执行任务
public class TestTimer {
	
	public static void main(String[] args) {
		new TestTimer(4); // 每隔4s执行一次
	}
	
	public TestTimer(int second) {
		Timer timer = new Timer();
		timer.schedule(new MyTimeTask(), 0, second*1000);
	}
	
	private class MyTimeTask extends TimerTask {
		@Override
		public void run() {
			System.out.println("timetask is run!");
		}
	}
	
}

3.3 使用框架整合spring实现,spring quartz 来进行任务调度

bean.xml配置

<!-- ==============配置Spring任务调度,定时获取刷新的accessToken========================= -->
	<bean name="weixinJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass" value="com.hd.weixin.quartz.WeixinQuartzJob" />
		<property name="jobDataAsMap">
			<map>
				<entry key="refreshAccessTokenTask" value-ref="refreshAccessTokenTask" />
			</map>
		</property>
	</bean>
	
	<!-- 测试使用  -->
	<bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="weixinJob" />	<!-- 运行的任务  -->
		<property name="repeatInterval" value="6000000" /> <!-- 2H要重写获取一次 重复执行的时间(6千秒 = 100min = 1H40min)	单位ms   1min = 60-->
		<property name="startDelay" value="1000" />	<!-- 服务器启动1s后在执行任务  -->
	</bean>
	
	<!-- cronTrigger -->
	<!-- 
	<bean id="cronTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="weixinJob" />
		<property name="cronExpression" value="0/5 * * * * ?" />
	</bean> 
	-->

	<!-- 可以运行多个JOB -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<!-- 执行任务  -->
		<property name="jobDetails">
		   <list>
		      <ref bean="weixinJob" />
		   </list>
		</property>
		<!-- 触发器 -->
		<property name="triggers">
		    <list>
			<ref bean="simpleTrigger" />
		    </list>
		</property>
   </bean> 

实现代码

/**
 * 进行执行的任务:刷新注入access_token
 * @author liuhang
 */
@Component
public class RefreshAccessTokenTask {
	// 测试阶段
	public static final String at = "Z79W9xD2LbjUAJuhyee-dBdvxm9pRfQfh2K8vsHZL_0CdtTX8p4ePxlvuVx2vkCVxZzQEnfle7j2h5T7pt4ePfV0HXdVrSNN-w-TDcGDo0UKIPfADAECJ";
									 
	// 正式发布打开
	public void refreshToken() {
		// WeixinContext.setAccessToken(at);
		
		System.out.println("refrensh,进行刷新获取access_token");
		HttpGet get = null;
		CloseableHttpResponse resp = null;
		CloseableHttpClient client = null;
		try {
			client = HttpClients.createDefault();
			String url = WeixinFinalValue.ACCESS_TOKEN_URL;
			url = url.replaceAll("APPID", WeixinFinalValue.APPID);
			url = url.replaceAll("APPSECRET", WeixinFinalValue.APPSECRET);
			get = new HttpGet(url);
			resp = client.execute(get);
			int statusCode = resp.getStatusLine().getStatusCode();
			if(statusCode>=200&&statusCode<300) {
				HttpEntity entity = resp.getEntity();
				String content = EntityUtils.toString(entity);
				try {
					AccessToken at = (AccessToken)JsonUtil.getInstance().json2obj(content, AccessToken.class);
					System.out.println(at.getAccess_token());
					WeixinContext.setAccessToken(at.getAccess_token());
				} catch (Exception e) {
					ErrorEntity err = (ErrorEntity)JsonUtil.getInstance().json2obj(content, ErrorEntity.class);
					System.out.println("获取token异常:"+err.getErrcode()+","+err.getErrmsg());
					refreshToken();
				}
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(resp!=null) resp.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(client!=null) client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

}


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值