您的位置:首页 > 移动开发 > 微信开发

微信开发专题---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();
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: