微信开发专题---4获取access_token
2016-12-14 15:32
573 查看
一.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 {
// 测
4000
试阶段
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();
}
}
}
}
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 {
// 测
4000
试阶段
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();
}
}
}
}
相关文章推荐
- 微信开发学习总结(二)—微信开发入门(公众号接入以及access_token获取)
- 微信第三方平台开发授权2:获取component_access_token,pre_auth_code
- 微信测试号开发之四 获取access_token和jsapi_ticket
- 微信开发之access_token获取
- 微信access_token的获取开发示例
- 微信&java 开发4 access_token获取
- [3]java微信开发-获取access_token
- java微信获取access_token(java微信开发学习笔记4)
- 微信第三方平台开发经验总结(二):获取component_access_token
- 微信开发——网页授权access_token与全局access_token获取用户信息的接口
- 微信开发者-主动请求-实际开发-(3)获取access_token(C#)
- 微信公众号开发-开发环境搭建并通过java代码获取微信access_token
- 微信程序开发--获取access_token和微信服务器ip出现的错误
- 微信测试号开发之四 获取access_token和jsapi_ticket
- 微信asp+sqlser开发实例——获取access_token
- [麦先生]TP3.2之微信开发那点事[基础篇](获取access_token)
- 微信开发第二篇:获取全局access_token
- 微信access_token的获取开发示例
- 微信java开发3——获取access_token
- 微信开发(四):获取access_token和微信服务器IP