代码获取编号:001
功能说明官方文档地址是:https://developers.weixin.qq.com/doc/offiaccount/openApi/clear_quota.html 分为3部分
- 查询 openAPI 调用quota
- 清空 api 的调用quota
- 查询 rid 信息
进入公众号后台,在“基本配置”中,将调用接口的IP地址添加为白名单。 需要先获取access_token,作为所有接口调用的参数。
查询配额不太清楚为什么官方文档一定要把配额写成quota,个人觉得中文更好理解。 上一篇写到每个api都有调用额度限制,比如最常用的获取access_token,一天最多获取2000次;又比如上一篇用到的网络检测接口,限制每天调用1440次。查询配额接口就是用来查询剩余配额情况的,方便再配额即将用光或者已经用光的情况下进行清空(会恢复到最大值)。
// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
// 查询网络检测配额
url = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=" + accessToken;
JSONObject param = new JSONObject();
param.put("cgi_path", "/cgi-bin/callback/check");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
如果运行正常,会打印出剩余的配额。返回格式大体为:
{"errcode":0,"errmsg":"ok","quota":{"daily_limit":1440,"used":1,"remain":1439}}
清空配额
每个月可调用10次清零机会,避免配额耗尽引发异常。 清空配额的含义就是当已分配的配额比如获取ip地址的每天1440次用光以后,调用一下又恢复到1440次。官方有了次数限制,这个必然不能作为长期使用的方式。 还是用上面获取ip地址为例:
- 调用一次网络检测接口
- 查询网络检测接口配额(已使用不是0了)
- 清空配额
- 查询网络检测接口配额(恢复已使用是0,未使用1440)
// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
// 调用一次网络检测接口,用于测试查询配额剩余情况
url = "https://api.weixin.qq.com/cgi-bin/callback/check?access_token=" + accessToken;
JSONObject param = new JSONObject();
param.put("action", "all");
param.put("check_operator", "DEFAULT");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 查询网络检测配额
url = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=" + accessToken;
param = new JSONObject();
param.put("cgi_path", "/cgi-bin/callback/check");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 清空配额
url = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=" + accessToken;
param = new JSONObject();
param.put("appid", APPID);
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 必须暂停下,微信端生效需要一定时间
Thread.sleep(2000);
// 查询配额
url = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=" + accessToken;
param = new JSONObject();
param.put("cgi_path", "/cgi-bin/callback/check");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
打印结果为
{"errcode":0,"errmsg":"ok","quota":{"daily_limit":1440,"used":2,"remain":1438}}
{"errcode":0,"errmsg":"ok"}
{"errcode":0,"errmsg":"ok","quota":{"daily_limit":1440,"used":0,"remain":1440}}
可以发现最终配额又恢复到了最大值。
查询rid信息对接微信公众号的时候,难免看到错误信息,同时伴随着一条含有rid的errmsg。可以根据这个rid,查询最近7天对应详细错误,方便排查。 举个例子:清空配额的时候,需要传递appid,如果把appid传递错误,就肯定会返回错误信息,我们把错误信息信息中rid提取出来,就可以使用 查询rid信息 接口获知详细原因了。 这个不适合收到错误rid就立刻调用,需要微信缓存一阵子才能查询到。
// 这部分测试获取rid信息。先调用清空配额接口,故意把appid写错
url = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=" + accessToken;
param = new JSONObject();
param.put("appid", APPID+"234");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
String rid = JSON.parseObject(result).getString("errmsg").split(":")[1].trim();
// 这里必须暂停,给微信点时间缓一下
Thread.sleep(6000);
// 查询上面rid对应的详细错误信息
url = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token=" + accessToken;
param = new JSONObject();
param.put("rid", rid);
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
打印结果:
{"errcode":40013,"errmsg":"invalid appid rid: 6326ce0a-33d0d6d0-672a95dd"}
{"errcode":0,"errmsg":"ok","request":{"invoke_time":1663487498,"cost_in_ms":6,"request_url":"access_token=60_Yx0by_JLDemp4tieyd71fzTmdblS9QVQXLViBCFRN-VISqEFZwuEHd0HaxcygqGU7LH8S5qaKcZHODMAbueqA6DukWaefOs-wFnpuZKcBtcEoBg6qN2GsrS8psUnpbZwMXkp_7_KcJ6rVRRfVDWiAAAFNG","request_body":"{\"appid\":\"wx276049d6a7551dca234\"}","response_body":"{\"errcode\":40013,\"errmsg\":\"invalid appid rid: 6326ce0a-33d0d6d0-672a95dd\"}","client_ip":"106.47.67.229"}}
完整代码
上面提到的步骤所有代码如下
package com.lootaa.wechat;
import org.jsoup.Jsoup;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Connection.Method;
/**
* 前置条件:公众号后台设置ip白名单
*/
public class Test001 {
public static final String APPID = "wx276049d6a7551dca";
public static final String SECRET = "cbe109fdf6f399bd72ed3a4afafa21b1";
/**
* 完整项目源码可关注公众号"lootaayun"(洛塔),回复001获取
*/
public static void main(String[] args) throws Exception {
// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
// 调用一次网络检测接口,用于测试查询配额剩余情况
url = "https://api.weixin.qq.com/cgi-bin/callback/check?access_token=" + accessToken;
JSONObject param = new JSONObject();
param.put("action", "all");
param.put("check_operator", "DEFAULT");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 查询网络检测配额
url = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=" + accessToken;
param = new JSONObject();
param.put("cgi_path", "/cgi-bin/callback/check");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 清空配额
url = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=" + accessToken;
param = new JSONObject();
param.put("appid", APPID);
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 必须暂停下,微信端生效需要一定时间
Thread.sleep(2000);
// 查询配额
url = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=" + accessToken;
param = new JSONObject();
param.put("cgi_path", "/cgi-bin/callback/check");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
// 这部分测试获取rid信息。先调用清空配额接口,故意把appid写错
url = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=" + accessToken;
param = new JSONObject();
param.put("appid", APPID+"234");
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
String rid = JSON.parseObject(result).getString("errmsg").split(":")[1].trim();
// 这里必须暂停,给微信点时间缓一下
Thread.sleep(6000);
// 查询上面rid对应的详细错误信息
url = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token=" + accessToken;
param = new JSONObject();
param.put("rid", rid);
result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
System.out.println(result);
}
}