has no masssend quota hint 问题的处理

微信图文消息选择全部用户发放失败问题的处理

前言

    此处开发的系统使用了微信开发的图文消息方法功能, 本已开发完成的图文消息群发功能, 测试出现了异常, 报错消息如图1-1 所示:
    选择某个公众号后, 编辑图文消息, 保存到图文列表, 选择全部, 点击立即发送, 报错.
图1-1、选择全部用户群发图文消息报错图一
在这里插入图片描述
图1-2、选择全部用户群发图文消息报错图二

在这里插入图片描述

异常分析

    异常消息has no masssend quota hint 解释为没有批量发送配额提示.
    异常消息对应的errcode为45028

{ errcode: 45028, errmsg: ‘has no masssend quota hint: […]’ }

    全局errcode: 45028 在微信公众平台官方文档上还没有标注, 官方文档查不到该错误码.
    参考其他博文分析原因关键点在于官方文档下的群发接口与原创校验的注意内容.

为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限

    此处为服务号,即每月有4条群发权限, 即拥有4个模板配额quota , 下个自然月重置.
    调用微信群发接口, 会传参is_to_all 为 true, 此时微信接口执行全部用户群发. 选择全部发放超过四次则提示没有足够的模板配额.
    若传参is_to_all 为 false,此时不传参is_to_all; 此时传参为tag_id 标签ID, 即指定标签组群发, 可跳过此模板配额的验证. 因此可以创建一个标签组, 将全部用户打上此标签, 选择该标签组群发即可突破每月4 次全部发放的限制.

/*
* @param mediaId 素材ID
* @param isToAll 是否全部群发
群发的时候,认证的订阅号每天只能使用is_to_all群发一次或者在公众平台群发一次。
相应的,服务号每个月公众平台群发+is_to_all群发最多只能四次。
* @param tagId 按照标签群发
* @return ApiResult 群发结果
*/
public static ApiResult sendAllNews(String appId, String mediaId, 
				boolean isToAll, Integer tagId) {
   String url = sendAllUrl + AuthAccessTokenApi.getAuthAccessTokenStr(appId);

   Map<String, Object> mapData = new HashMap<String, Object>();
   mapData.put("msgtype", MsgType.mpnews);
   Map<String, Object> msgData = new HashMap<String, Object>();
   msgData.put("media_id", mediaId);
   mapData.put("mpnews", msgData);
   Map<String, Object> filterData = new HashMap<String, Object>();
   if (isToAll) {
      filterData.put("is_to_all", true);
   } else if (tagId != null) {
      filterData.put("tag_id", tagId);
   }
   mapData.put("filter", filterData);

   String jsonResult = HttpKit.post(url, JsonUtils.toJson(mapData));
   return new ApiResult(jsonResult);
}

问题处理

    分析下来, 该异常信息是微信群发接口发放功能的限制导致的.
    此处可以对该错误进行捕获, 处理errcode为45028 的errormsg.
    优化提示信息即可. 原提示信息has no masssend quota hint 没有批量发送配额,
    根据具体原因可优化为"全部发放次数已经超出限制,请指定标签组群发".
    标签组可跳过该验证, 则可以新建tag 标签, 将全部用户拉到该标签下, 或者对全部用户打新标签. 对新标签进行群发即可.
     注意本月已接收4 条消息的用户本月不会再收到该公众号的图文消息.

errcode与errmsg 微信接口全局资源类

(已将45028 考虑进来, 对该情况捕获优化客户端提示信息)

import java.util.HashMap;
import java.util.Map;

/**
* @Author niaonao
* @Description 微信接口全局返回码
* 群发接口和原创校验
*    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21
* 注意:
1、对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个标签;
2、对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
3、开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果;
4、群发过程中,微信后台会自动进行图文消息原创校验,请提前设置好相关参数(send_ignore等);
5、开发者可以主动设置 clientmsgid 来避免重复推送。
6、群发接口每分钟限制请求60次,超过限制的请求会被拒绝。
7、图文消息正文中插入自己帐号和其他公众号已群发文章链接的能力。
*/
public class ReturnCode {
	
    @SuppressWarnings("serial")
	private static final Map<Integer, String> errCodeToErrMsg = new HashMap<Integer, String>(){{
    	put(-1, "系统繁忙");
    	put(0, "请求成功");
    	put(40001, "获取access_token时AppSecret错误,或者access_token无效");
    	put(40002, "不合法的凭证类型");
    	put(40003, "不合法的OpenID");
    	put(40004, "不合法的媒体文件类型");
    	put(40005, "不合法的文件类型");
    	put(40006, "不合法的文件大小");
    	put(40007, "不合法的媒体文件id");
    	put(40008, "不合法的消息类型");
    	put(40009, "不合法的图片文件大小");
    	put(40010, "不合法的语音文件大小");
    	put(40011, "不合法的视频文件大小");
    	put(40012, "不合法的缩略图文件大小");
    	put(40013, "不合法的APPID");
    	put(40014, "不合法的access_token");
    	put(40015, "不合法的菜单类型");
    	put(40016, "不合法的按钮个数");
    	put(40017, "不合法的按钮个数");
    	put(40018, "不合法的按钮名字长度");
    	put(40019, "不合法的按钮KEY长度");
    	put(40020, "不合法的按钮URL长度");
    	put(40021, "不合法的菜单版本号");
    	put(40022, "不合法的子菜单级数");
    	put(40023, "不合法的子菜单按钮个数");
    	put(40024, "不合法的子菜单按钮类型");
    	put(40025, "不合法的子菜单按钮名字长度");
    	put(40026, "不合法的子菜单按钮KEY长度");
    	put(40027, "不合法的子菜单按钮URL长度");
    	put(40028, "不合法的自定义菜单使用用户");
    	put(40029, "不合法的oauth_code");
    	put(40030, "不合法的refresh_token");
    	put(40031, "不合法的openid列表");
    	put(40032, "不合法的openid列表长度");
    	put(40033, "不合法的请求字符,不能包含\\uxxxx格式的字符");
    	put(40035, "不合法的参数");
    	put(40038, "不合法的请求格式");
    	put(40039, "不合法的URL长度");
    	put(40050, "不合法的分组id");
    	put(40051, "分组名字不合法");
    	put(41001, "缺少access_token参数");
    	put(41002, "缺少appid参数");
    	put(41003, "缺少refresh_token参数");
    	put(41004, "缺少secret参数");
    	put(41005, "缺少多媒体文件数据");
    	put(41006, "缺少media_id参数");
    	put(41007, "缺少子菜单数据");
    	put(41008, "缺少oauth code");
    	put(41009, "缺少openid");
    	put(42001, "access_token超时");
    	put(42002, "refresh_token超时");
    	put(42003, "oauth_code超时");
    	put(43001, "需要GET请求");
    	put(43002, "需要POST请求");
    	put(43003, "需要HTTPS请求");
    	put(43004, "需要接收者关注");
    	put(43005, "需要好友关系");
    	put(44001, "多媒体文件为空");
    	put(44002, "POST的数据包为空");
    	put(44003, "图文消息内容为空");
    	put(44004, "文本消息内容为空");
    	put(45001, "多媒体文件大小超过限制");
    	put(45002, "消息内容超过限制");
    	put(45003, "标题字段超过限制");
    	put(45004, "描述字段超过限制");
    	put(45005, "链接字段超过限制");
    	put(45006, "图片链接字段超过限制");
    	put(45007, "语音播放时间超过限制");
    	put(45008, "图文消息超过限制");
    	put(45009, "接口调用超过限制");
    	put(45010, "创建菜单个数超过限制");
    	put(45015, "回复时间超过限制");
    	put(45016, "系统分组,不允许修改");
    	put(45017, "分组名字过长");
    	put(45018, "分组数量超过上限");
        /*put(45028, "has no masssend quota hint[45028]"); 微信号群发功能超过限制 */
        put(45028, "全部发放次数已经超过限制,请指定标签组群发");
    	put(46001, "不存在媒体数据");
    	put(46002, "不存在的菜单版本");
    	put(46003, "不存在的菜单数据");
    	put(46004, "不存在的用户");
    	put(47001, "解析JSON/XML内容错误");
    	put(48001, "api功能未授权");
    	put(50001, "用户未授权该api");
    	put(45157, "标签名非法,请注意不能和其他标签重名");
    	put(45158, "标签名长度不得超过10个汉字或30个字符");
    	put(45056, "创建的标签数过多,请注意不能超过100个");
    	put(45159, "非法的标签");
    	put(45059, "有粉丝身上的标签数已经超过限制");
    	put(49003, "传入的openid不属于此AppID");
    	
		/* 微信小程序错误码封装 */
		put(85013,"无效的自定义配置");
		put(85014,"无效的模板编号");
		put(85015,"版本输入错误");
		put(85043,"模板错误");
		put(85044,"代码包超过大小");
		put(85045,"ext_json有不存在的路径");
		put(85046,"tabBar中缺少path");
		put(85047,"pages字段为空");
		put(85048,"ext_json解析失败");
		put(86000,"不是由第三方代小程序进行调用");
		put(86001,"不存在第三方的已经提交的代码");
		put(85006,"标签格式错误");
		put(85007,"页面路径错误");
		put(85008,"类目填写错误");
		put(85009,"已经有正在审核的版本");
		put(85010,"item_list有项目为空");
		put(85011,"标题填写错误");
		put(85012,"无效的审核id");
		put(85015,"该账号不是小程序账号");
		put(85017,"没有新增域名,请确认小程序已经添加了域名或该域名是否没有在第三方平台添加");
		put(85018,"域名没有在第三方平台设置");
		put(85019,"没有审核版本");
		put(85020,"审核状态未满足发布");
		put(85021,"状态不可变");
		put(85022,"action非法");
		put(85023,"审核列表填写的项目数不在1-5以内");
		put(85064,"找不到模版");
		put(85065,"模版库已满");
		put(85066,"链接错误");
		put(85068,"测试链接不是子链接");
		put(85069,"校验文件失败");
		put(85070,"链接为黑名单");
		put(85071,"已添加该链接,请勿重复添加");
		put(85072,"该链接已被占用");
		put(85073,"二维码规则已满");
		put(85074,"小程序未发布, 小程序必须先发布代码才可以发布二维码跳转规则");
		put(85075,"个人类型小程序无法设置二维码规则");
		put(85076,"链接没有ICP备案");
		put(85077,"小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)");
		put(86002,"小程序还未设置昵称、头像、简介。请先设置完后再重新提交");
		put(85085,"近7天提交审核的小程序数量过多,请耐心等待审核完毕后再次提交");
		put(85086,"提交代码审核之前需提前上传代码");
		put(87011,"现网已经在灰度发布,不能进行版本回退");
		put(87012,"该版本不能回退,可能的原因:1:无上一个线上版用于回退 2:此版本为已回退版本,不能回退 3:此版本为回退功能上线之前的版本,不能回退");
		put(89007,"小程序本月被关联的名额已用完");
		put(89008,"小程序为海外帐号,不允许关联");
		put(89009,"小程序关联达到上限");
		put(89010,"已经发送关联邀请");
		put(89011,"在附近中展示的小程序不能取消关联");
		put(89012,"门店、小店小程序不能取消关联");
		put(89013,"小程序被封禁");
		put(89015,"已经关联该小程序");
		put(89016,"公众号本月关联相同主体达到上限");
		put(89017,"公众号本月关联不同主体达到上限");
		put(89018,"已经发送解除关联申请");
		put(89019,"业务域名无更改,无需重复设置");
		put(89020,"尚未设置小程序业务域名,请先在第三方平台中设置小程序业务域名后在调用本接口");
		put(89021,"请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名");
		put(89035,"已经从公众平台后台发起关联申请,处于小程序管理员确认中,无法从第三方重复发起关联申请");
		put(89231,"个人小程序不支持调用setwebviewdomain接口");
		/*待扩展*/

    }};
    
    /**
     * 通过返回码获取返回信息
     */
    public static String get(int errCode){
    	String result = errCodeToErrMsg.get(errCode);
    	return result;
    }

	/**
	 * 微信小程序获取错误信息方法
	 * @param errCode
	 * @param errMsg
	 * @return
	 */
	public static String get(Integer errCode, String errMsg){
		if(null != errCode){
			errMsg = null != errCodeToErrMsg.get(errCode) ? errCodeToErrMsg.get(errCode) : errMsg;
		}
		return errMsg;
	}
}

扩展知识点

     上面提到本月已接收4 条消息的用户本月不会再收到该公众号的图文消息.

对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;

    当前公众号为认证服务号, 每个用户每月最多接收4 条群发接口的群发消息.
    多于4 条则发送失败. 由于发放消息限制, 存在用户本月已接收4 条记录时, 选择全部进行群发, 提示没有批量发送配额, 配额没有了, 需要等到下个月重置此配额, 再次使用该功能.
    而指定标签组可跳过该验证, 因为标签组是群发功能的最小用户单位. 选择标签组进行群发可完成发放, 但该标签组内本月已接收4 条消息的用户将不能接收到此群发消息. 因为此时微信群发接口对该用户群发结果为发放失败,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

niaonao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值