微信开发中许多接口需要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实现
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;
}
}
其中用到了
commons-lang-2.6.jar
发送http请求请参见