在申请token时并不是每发送一次消息就要申请一次token,因为token是有次数限制的,规则就是下面
主动调用的频率限制
当你获取到AccessToken时,你的应用就可以成功调用企业号后台所提供的各种接口以管理或访问企业号后台的资源或给企业号成员发消息。
为了防止企业应用的程序错误而引发企业号服务器负载异常,默认情况下,每个企业号调用接口都有一定的频率限制,当超过此限制时,调用对应接口会收到相应错误码。
以下是当前默认的频率限制,企业号后台可能会根据运营情况调整此阈值:
- 基础频率
每企业调用单个cgi/api不可超过1000次/分,30000次/小时
每ip调用单个cgi/api不可超过2000次/分,60000次/小时
第三方应用提供商由于需要同时服务于多个企业,ip频率限制如下:每ip调用单个cgi/api不可超过20000次/分,600000次/小时
- 发消息频率
每企业不可超过帐号上限数*30人次/天
- 创建帐号频率
每企业创建帐号数不可超过帐号上限数*3/月
- 创建应用频率
每企业最大应用数限制为30个,创建应用次数不可超过30*3/月
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
那么我们处理token的时候,就可以使用static进行处理,定义两个变量
<pre name="code" class="java"> //主动调用:发送消息获得token
public static String access_token;
//主动调用:请求token的时间
public static Date access_token_date;
在每次请求token的时候:
1、判断jsapi_ticket是否存在,不存在的话直接申请;
2、判断时间是否过期,过期(>=7000秒)则重新申请token,否则不用请求直接返回之前的token。
这样可以避免请求token频繁导致的系统不能使用的问题
/**
* 从微信获得access_token
* @return
*/
public String getTokenFromWx(){
//微信企业号标识
String corpid=RESP_MESSAGE_CORPID;
//管理组凭证密钥
String corpsecret=RESP_MESSAGE_SECRET;
//获取的标识
String token="";
//1、判断access_token是否存在,不存在的话直接申请
//2、判断时间是否过期,过期(>=7200秒)申请,否则不用请求直接返回以后的token
if(null==access_token||"".equals(access_token)||(new Date().getTime()-access_token_date.getTime())>=(7000*1000)){
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
//利用get形式获得token
HttpGet httpget = new HttpGet("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret);
// Create a custom response handler
ResponseHandler<JSONObject> responseHandler = new ResponseHandler<JSONObject>() {
public JSONObject handleResponse(
final HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
if(null!=entity){
String result= EntityUtils.toString(entity);
//根据字符串生成JSON对象
JSONObject resultObj = JSONObject.fromObject(result);
return resultObj;
}else{
return null;
}
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
}
};
//返回的json对象
JSONObject responseBody = httpclient.execute(httpget, responseHandler);
if(null!=responseBody){
token= (String) responseBody.get("access_token");//返回token
}
httpclient.close();
//设置全局变量
access_token=token;
access_token_date=new Date();
}catch (Exception e) {
e.printStackTrace();
}
}else{
token=access_token;
}
return token;
}