微信公众平台开发4-access_token获取与保持有效性

转载请注明:http://blog.csdn.net/ly20116/article/details/51086662

一、access_token简介
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,每日调用限制2000次需定时刷新,重复获取将导致上次获取的access_token失效。
目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。
二、接口说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

注意是https协议,调用所有微信接口时均需使用https协议。

参数说明:
微信公众平台开发4-access_token获取与保持有效性_第1张图片
返回说明:
正确返回数据:

 {"access_token":"ACCESS_TOKEN","expires_in":7200}

参数说明:
微信公众平台开发4-access_token获取与保持有效性_第2张图片

错误返回数据:
{“errcode”:40013,”errmsg”:”invalid appid”}

三、创建AccessToken实体类

/**
 * 凭证类
 * @author 洋
 *
 */
public class AccessToken {
    private String token;//凭证
    private int expiresIn;//凭证有效时间
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
    public int getExpiresIn() {
        return expiresIn;
    }
    public void setExpiresIn(int expiresIn) {
        this.expiresIn = expiresIn;
    }

}

四、通过Https请求获取AccessToken对象

private static final String access_token_url="https://api.weixin.qq.com/cgi-bin/token?"
            + "grant_type=client_credential&appid=APPID&secret=APPSECRET";

/**
     * 获取Access_Token
     * @param appid
     * @param appsecret
     * @return
     */
    public static AccessToken getAccessToken(String appid,String appsecret){
        AccessToken accessToken=null;
        String requestUrl=access_token_url.replace("APPID",appid).replace("APPSECRET", appsecret);
        JSONObject jsonObject=httpsRequest(requestUrl, "GET", null);
        if(jsonObject!=null){
            accessToken=new AccessToken();
            accessToken.setToken(jsonObject.getString("access_token"));
            accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
        }
        return accessToken;

    }

五、access_token有效性的保持

由于access_token的有效期为2小时,且每天调用限制2000次,如果我们每次都调用接口生成新的access_token,这就会可能超出限制和资源浪费(需要重新调用接口)。(当然人只是测试时用肯定不到2000次)。所有需要定时刷新access_token,使它始终保持有效。

使用单例模式,创建单例类,运用线程定时刷新。

/**
 * AccessToken 单例类
 * @author 洋
 *
 */
public class SingleAccessToken {

    private static final String appid="APPID";//你自己的appid
    private static final String appsecret="APPSECRET";//你自己的appsecret

    private AccessToken accessToken;
    private static SingleAccessToken singleAccessToken;
    /**
     * 私有构造函数
     */
    private SingleAccessToken(){

        accessToken=HttpsUtil.getAccessToken(appid, appsecret);
        initThread();
    }
    /**
     * 获取SingleAccessToken对象
     * @return
     */
    public static SingleAccessToken getInstance(){
        if(singleAccessToken==null){
            singleAccessToken=new SingleAccessToken();
        }
        return singleAccessToken;
    }

    public AccessToken getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(AccessToken accessToken) {
        this.accessToken = accessToken;
    }
    /**
     * 开启线程,设置SingleAccessToken为空
     */
    private void initThread(){
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                   //睡眠7000秒
                    Thread.sleep(7000*1000);    
                    singleAccessToken=null;

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();
    }

}

你可能感兴趣的:(微信公众号开发)