Java语言微信公众平台之群发接口(高级群发)
龚超 2018-06-28 来源 : 阅读 1573 评论 0

摘要:再次吐槽下,微信素材管理和群发这块文档对Java语言很不友好,此文需要结合我前文和官方文档。希望对大家学习Java语言有所帮助。

再次吐槽下,微信素材管理和群发这块文档对Java语言很不友好,此文需要结合我前文和官方文档。希望对大家学习Java语言有所帮助。

测试号调试群发只需看是否群发消息是否能组装成功,不需要看结果如何(反正不会发送成功的),因为微信还没开放这个功能(估计也不会开放的)。

一、群发说明

在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限。

1、对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个标签;

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

3、开发者可以主动设置 clientmsgid 来避免重复推送。

4、群发接口每分钟限制请求60次,超过限制的请求会被拒绝。

5、图文消息正文中插入自己帐号和其他公众号已群发文章链接的能力。

二、群发图文消息过程

1、首先,预先将图文消息中需要用到的图片,使用上传图文消息内图片接口,上传成功并获得图片 URL;参考前文的上传图文消息内的图片获取URL方法
2、上传图文消息素材,需要用到图片时,请使用上一步获取的图片 URL;
3、使用对用户标签的群发,或对 OpenID 列表的群发,将图文消息群发出去,群发时微信会进行原创校验,并返回群发操作结果;
4、在上述过程中,如果需要,还可以预览图文消息、查询群发状态,或删除已群发的消息等。

三、群发图片、文本等其他消息类型的过程

1、如果是群发文本消息,则直接根据下面的接口说明进行群发即可;
2、如果是群发图片、视频等消息,则需要预先通过素材管理接口准备好 mediaID。

四、is_to_all说明

用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据tag_id发送给指定群组的用户。

五、两种群发方式

根据标签进行群发,订阅号与服务号必须通过认证

接口:https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN

根据OpenID列表群发,只适用于认证后的服务号

接口:https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN

post数据可以是图文消息、文本、语音/音频、图片、视频、卡券消息(所有使用到media_id的地方,现在都可以使用素材管理中的永久素材media_id了)

1、图文消息post数据中的media_id需要通过上传图文消息素材接口获取(https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN)
这个跟素材管理里的新增永久图文素材接口post数据一样,只是接口不一样、返回的json多了一个type和created_at,参考我前文的新增永久图文素材方法
2、语音/音频、图片post数据中的media_id需要通过上传下载多媒体文件接口获得,参考我前文的新增临时/永久素材方法

3、视频post数据中的media_id最麻烦,先得通过上传下载多媒体文件接口获取到media_id(经测试,永久的下一步报错提示无效media_id),然后再通过特别接口再获取到一个media_id,这才是群发所需要的media_id

六、群发示例Controller


@RequestMapping("/sendByOpenid")
public MassMsgResult sendByOpenid() throws Exception {
// 根据OpenID列表群发图文消息
String mediaPath1 = "C:/Users/phil/Pictures/image/8538572f61d7a94cf0b9fe0f290cdb28.jpg";
UploadMediasResult result1 = HttpReqUtil.uploadTempMedia("phil_token", "image", mediaPath1);
String mediaPath2 = "C:/Users/phil/Pictures/image/685977abgw1f8xqp46dgyj20qo0zktfi.jpg";
UploadMediasResult result2 = HttpReqUtil.uploadTempMedia("phil_token", "image", mediaPath2);
Listarray = new ArrayList<>();
UploadNewsMedia entity1 = new UploadNewsMedia();
entity1.setAuthor("phil");
entity1.setContent("人生只有经历才会懂得,只有懂得才知道珍惜,一生中,总会有一个人让你笑得最甜,也总会有一个人让你痛得最深,忘记,是善待自己");
entity1.setContent_source_url("//blog.csdn.net/phil_jing");
// entity1.setDigest("digest");
entity1.setShow_conver_pic(1);
entity1.setThumb_media_id(result1.getMedia_id());
entity1.setTitle("心灵鸡汤");
array.add(entity1);
UploadNewsMedia entity2 = new UploadNewsMedia();
entity2.setAuthor("phil");
entity2.setContent("什么是幸福,幸福就是自己的一种愉快的心理状态和感受。时时、事事都能使自己快乐的人才是最幸福的人。最快乐的人,就是最幸福的人。笑口常开的人,是最幸福的。");
entity2.setContent_source_url("//www.qq.com");
// entity2.setDigest("digest");
entity2.setShow_conver_pic(0);
entity2.setThumb_media_id(result2.getMedia_id());
entity2.setTitle(" 经典语录");
array.add(entity2);
UploadMediasResult ur = HttpReqUtil.uploadNewsMedia("phil_token", array);
Listopenids = new ArrayList<>();
openids.add("ovHQ5v9-ZsHUcax_nTCQwiP-sBcg");
openids.add("ovHQ5v6CW3INkWUsCl3olODif0cc");
MassMsgResult result_news = wechatMsgService.sendMpnewsToOpenid("phil_token", openids,
ur.getMedia_id());
logger.debug(" send by openid msg {} " ,result_news.getErrmsg());
// 根据OpenID列表群发文字消息
MassMsgResult result_text = wechatMsgService.sendTextToOpenid("phil_token", openids,
"什么是幸福,幸福就是自己的一种愉快的心理状态和感受。时时、事事都能使自己快乐的人才是最幸福的人。最快乐的人,就是最幸福的人。笑口常开的人,是最幸福的");
logger.debug(" send by openid msg {} " ,result_text.getErrmsg());
return null;
}


复制代码

七、部分用到的类和方法

群发方法


/**
* 根据标签进行群发文本消息
* @param accessToken 授权token
* @param entity 图文消息对象
* @return
*/
public MassMsgResult sendTextToTag(String accessToken, int tagId, String content){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MaptextParams = new HashMap<>();
textParams.put("content", content);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("text", textParams);
dataParams.put("msgtype", "text");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进行群发图文消息
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia方法获得
* @return
*/
public MassMsgResult sendMpnewsToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MapmpnewsParams = new HashMap<>();
mpnewsParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("mpnews", mpnewsParams);
dataParams.put("msgtype", "mpnews");
dataParams.put("send_ignore_reprint", 0);//不能省略
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进行群发图片
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia方法获得
* @return
*/
public MassMsgResult sendImageToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MapimageParams = new HashMap<>();
imageParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("image", imageParams);
dataParams.put("msgtype", "image");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进行群发语音/音频
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia方法获得
* @return
*/
public MassMsgResult sendVoiceToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MapvoiceParams = new HashMap<>();
voiceParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("voice", voiceParams);
dataParams.put("msgtype", "voice");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进行群发视频
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia方法获得
* @return
*/
public MassMsgResult sendVideoToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MapmpvideoParams = new HashMap<>();
mpvideoParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("mpvideo", mpvideoParams);
dataParams.put("msgtype", "mpvideo");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进行群发卡券
* @param accessToken 授权token
* @param tagId 标签
* @param card_id
* @return
*/
public MassMsgResult sendWxCardToTag(String accessToken, int tagId, String cardId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapfilterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
MapwxcardParams = new HashMap<>();
wxcardParams.put("card_id", cardId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("wxcard", wxcardParams);
dataParams.put("msgtype", "wxcard");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发图文消息
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia方法获得
* @return
*/
public MassMsgResult sendMpnewsToOpenid(String accessToken, Listopenids, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapmpnewsParams = new HashMap<>();
mpnewsParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("mpnews", mpnewsParams);
dataParams.put("msgtype", "mpnews");
dataParams.put("send_ignore_reprint", 0);
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发文本消息
* @param accessToken 授权token
* @param openids openid
* @param content
* @return
*/
public MassMsgResult sendTextToOpenid(String accessToken, Listopenids, String content){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MaptextParams = new HashMap<>();
textParams.put("content", content);
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("text", textParams);
dataParams.put("msgtype", "text");
String data = JsonUtil.toJsonString(dataParams);
System.out.println(data);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发语音消息
* @param accessToken 授权token
* @param openids openid
* @param mediaId
* @return
*/
public MassMsgResult sendVocieToOpenid(String accessToken, Listopenids, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapvoiceParams = new HashMap<>();
voiceParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("voice", voiceParams);
dataParams.put("msgtype", "voice");
String data = JsonUtil.toJsonString(dataParams);
System.out.println(data);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发图片消息
* @param accessToken 授权token
* @param openids openid
* @param mediaId
* @return
*/
public MassMsgResult sendImageToOpenid(String accessToken, Listopenids, String mediaId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapimageParams = new HashMap<>();
imageParams.put("media_id", mediaId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("image", imageParams);
dataParams.put("msgtype", "image");
String data = JsonUtil.toJsonString(dataParams);
System.out.println(data);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发视频消息
* @param accessToken 授权token
* @param openids openid
* @param mpVideoMedia uploadMediaVideo方法获得media
* @return
*/
public MassMsgResult sendVideoToOpenid(String accessToken, Listopenids, MpVideoMedia mpVideoMedia){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("mpvideo", mpVideoMedia);
dataParams.put("msgtype", "mpvideo");
String data = JsonUtil.toJsonString(dataParams);
System.out.println(data);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据OpenId进行群发卡券消息
* @param accessToken 授权token
* @param openids openid
* @param mediaId
* @return
*/
public MassMsgResult sendWxcardToOpenid(String accessToken, Listopenids, String cardId){
MassMsgResult result = null;
TreeMapparams = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
MapwxcardParams = new HashMap<>();
wxcardParams.put("card_id", cardId);
TreeMapdataParams = new TreeMap<>();
dataParams.put("touser", openids);
dataParams.put("wxcard", wxcardParams);
dataParams.put("msgtype", "wxcard");
String data = JsonUtil.toJsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}


复制代码

视频post数据bean


/**
* 视频post数据bean
* @author phil
* @date 2017年9月20日
*
*/
public class MpVideoMedia {
private String media_id;
private String title;
private String description;
}
复制代码
获取群发视频post中的media_id
/**
* 获取群发视频post中的media_id
*
* @param accessToken
* @param uploadVideo
* @return
*/
public static UploadMediasResult uploadMediaVideo(String accessToken, MpVideoMedia mpVideoMedia) {
UploadMediasResult result = null;
TreeMapparams = new TreeMap();
params.put("access_token", accessToken);
// post 提交的参数
String data = JsonUtil.toJsonString(mpVideoMedia);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_VIDEO_MEDIA_URL,
params, data);
result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
return result;
}

复制代码

群发返回的结果


package com.phil.wechat.msg.model.resp;
import com.phil.wechat.base.result.ResultState;
/**
* 群发消息返回的结果
* 根据OpenID列表群发
* @author phil
* @date 2017年7月2日
*
*/
public class MassMsgResult extends ResultState{
private String type; //媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb),次数为news,即图文消息
private String msg_id;
private String msg_data_id;
}

复制代码

配置类

// 按分组进行群发
public static final String SEND_ALL_MASS_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall";
// 按照openid进行群发消息(OpenID最少2个,最多10000个 10000个)
public static final String SEND_MASS_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send";
//上传图文消息素材
public static final String UPLOAD_NEWS_MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews";
//获取群发视频post中的media_id
public static final String UPLOAD_VIDEO_MEDIA_URL = " https://api.weixin.qq.com/cgi-bin/media/uploadvideo";

复制代码

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

擅长针对企业软件开发的产品设计及开发的细节与流程设计课程内容。座右铭:大道至简!

  • 370
    文章
  • 45106
    人气
  • 83%
    受欢迎度

已有24人表明态度,83%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 资料领取 资料领取 资料领取
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
WEB前端必须会的基本知识题目
经验技巧 93% 的用户喜欢
Java语言中四种遍历List的方法总结(推荐)
经验技巧 91% 的用户喜欢
Java语言之SHA-256加密的两种实现方法详解
经验技巧 75% 的用户喜欢
java语言实现把两个有序数组合并到一个数组的实例
经验技巧 75% 的用户喜欢
通过Java语言代码来创建view的方法
经验技巧 80% 的用户喜欢
其他海同师资 更多>>
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
孔庆琦
孔庆琦 联系TA
对MVC模式和三层架构有深入的研究
戴懿颢​
戴懿颢​ 联系TA
20年+嵌入式开发经验,精多语言 / 云 / 安全 / 数据库
郭自琦
郭自琦 联系TA
16年物联网经验,涉多项目,多校授课,出版书籍并研发IT教程
余承民
余承民 联系TA
8年开发+5年教学经验,指导数千名学员高薪就业
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved