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

微信开发--获取access token

2016-01-16 19:05 531 查看
微信开发中许多接口需要access_token

今天说一下如何获取access_token

其实微信开发者文档中已经写的很详细了,这里只是给出程序的实现方式

对于access_token最重要的莫过于使用次数了,因为每天只能由2000次的机会。

公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到如下错误返回码:


{“errcode”:45009,”errmsg”:”api freq out of limit”}

其实2000已经足够了。关键是access_token如何保存。

基本思路是在获取access_token的时候首先判断access_token是否存在,如果不存在则获取新的aceess_token,如果存在则判断当前时间跟上一次获取的时间是否大于access_token的有效期,如果大于有效期了则重新获取,如果在有效期内则直接返回access_token。

下面是简单的Java实现

[code]import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;

import com.gwc.wechat.utils.HttpUtil;

public class AccessTokenTool {
    private static Logger log = Logger.getLogger(AccessTokenTool.class);

    public static final String AppId = "你的AppId";
    public static final String AppSecret = "你的AppSecret";

    public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
            + AppId + "&secret=" + AppSecret;
    public static String access_token = "";

    /**
     * 过期时间7200秒, 因为微信token过期时间为2小时,即7200秒
     */
    private static int expireTime = 7200 * 1000;
    private static long refreshTime;

    /**
     * 获取微信accesstoken
     * 
     * @return
     */
    public static synchronized String getAccessToken() {
        return getAccessToken(false);
    }

    public static synchronized String getAccessToken(boolean refresh) {
        if (StringUtils.isBlank(access_token) || (System.currentTimeMillis() - refreshTime) > expireTime || refresh) {
            access_token = initAccessToken();
            refreshTime = System.currentTimeMillis();
        }

        return access_token;
    }

    private static String initAccessToken() {
        String responseContent = HttpUtil.sendGet(GET_ACCESS_TOKEN_URL);
        JSONObject object = new JSONObject();
        try {
            object = new JSONObject(responseContent);
            return (String) object.get("access_token");
        } catch (JSONException e) {
            try {
                log.error("获取token失败 errcode:" + object.get("errcode") + " errmsg:" + object.getString("errmsg"));
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
        return null;
    }
}


其中用到了

[code]commons-lang-2.6.jar


发送http请求请参见

Java工具类–通过HttpClient发送http请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: