公众号openApi管理

代码获取编号: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);
		
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lootaa

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值