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")
publicMassMsgResultsendByOpenid()throwsException{
//根据OpenID列表群发图文消息
StringmediaPath1="C:/Users/phil/Pictures/image/8538572f61d7a94cf0b9fe0f290cdb28.jpg";
UploadMediasResultresult1=HttpReqUtil.uploadTempMedia("phil_token","image",mediaPath1);
StringmediaPath2="C:/Users/phil/Pictures/image/685977abgw1f8xqp46dgyj20qo0zktfi.jpg";
UploadMediasResultresult2=HttpReqUtil.uploadTempMedia("phil_token","image",mediaPath2);
Listarray=newArrayList<>();
UploadNewsMediaentity1=newUploadNewsMedia();
entity1.setAuthor("phil");
entity1.setContent("人生只有经历才会懂得,只有懂得才知道珍惜,一生中,总会有一个人让你笑得最甜,也总会有一个人让你痛得最深,忘记,是善待自己");
entity1.setContent_source_url("http://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);
UploadNewsMediaentity2=newUploadNewsMedia();
entity2.setAuthor("phil");
entity2.setContent("什么是幸福,幸福就是自己的一种愉快的心理状态和感受。时时、事事都能使自己快乐的人才是最幸福的人。最快乐的人,就是最幸福的人。笑口常开的人,是最幸福的。");
entity2.setContent_source_url("http://www.qq.com");
//entity2.setDigest("digest");
entity2.setShow_conver_pic(0);
entity2.setThumb_media_id(result2.getMedia_id());
entity2.setTitle("经典语录");
array.add(entity2);
UploadMediasResultur=HttpReqUtil.uploadNewsMedia("phil_token",array);
Listopenids=newArrayList<>();
openids.add("ovHQ5v9-ZsHUcax_nTCQwiP-sBcg");
openids.add("ovHQ5v6CW3INkWUsCl3olODif0cc");
MassMsgResultresult_news=wechatMsgService.sendMpnewsToOpenid("phil_token",openids,
ur.getMedia_id());
logger.debug("sendbyopenidmsg{}",result_news.getErrmsg());
//根据OpenID列表群发文字消息
MassMsgResultresult_text=wechatMsgService.sendTextToOpenid("phil_token",openids,
"什么是幸福,幸福就是自己的一种愉快的心理状态和感受。时时、事事都能使自己快乐的人才是最幸福的人。最快乐的人,就是最幸福的人。笑口常开的人,是最幸福的");
logger.debug("sendbyopenidmsg{}",result_text.getErrmsg());
returnnull;
}
七、部分用到的类和方法
群发方法
/**
*根据标签进行群发文本消息
*@paramaccessToken授权token
*@paramentity图文消息对象
*@return
*/
publicMassMsgResultsendTextToTag(StringaccessToken,inttagId,Stringcontent){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MaptextParams=newHashMap<>();
textParams.put("content",content);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("text",textParams);
dataParams.put("msgtype","text");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据标签进行群发图文消息
*@paramaccessToken授权token
*@paramtagId标签
*@parammediaIduploadMedia方法获得
*@return
*/
publicMassMsgResultsendMpnewsToTag(StringaccessToken,inttagId,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MapmpnewsParams=newHashMap<>();
mpnewsParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("mpnews",mpnewsParams);
dataParams.put("msgtype","mpnews");
dataParams.put("send_ignore_reprint",0);//不能省略
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据标签进行群发图片
*@paramaccessToken授权token
*@paramtagId标签
*@parammediaIduploadMedia方法获得
*@return
*/
publicMassMsgResultsendImageToTag(StringaccessToken,inttagId,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MapimageParams=newHashMap<>();
imageParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("image",imageParams);
dataParams.put("msgtype","image");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据标签进行群发语音/音频
*@paramaccessToken授权token
*@paramtagId标签
*@parammediaIduploadMedia方法获得
*@return
*/
publicMassMsgResultsendVoiceToTag(StringaccessToken,inttagId,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MapvoiceParams=newHashMap<>();
voiceParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("voice",voiceParams);
dataParams.put("msgtype","voice");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据标签进行群发视频
*@paramaccessToken授权token
*@paramtagId标签
*@parammediaIduploadMedia方法获得
*@return
*/
publicMassMsgResultsendVideoToTag(StringaccessToken,inttagId,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MapmpvideoParams=newHashMap<>();
mpvideoParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("mpvideo",mpvideoParams);
dataParams.put("msgtype","mpvideo");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据标签进行群发卡券
*@paramaccessToken授权token
*@paramtagId标签
*@paramcard_id
*@return
*/
publicMassMsgResultsendWxCardToTag(StringaccessToken,inttagId,StringcardId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapfilterParams=newHashMap<>();
filterParams.put("is_to_all",false);
filterParams.put("tag_id",tagId);
MapwxcardParams=newHashMap<>();
wxcardParams.put("card_id",cardId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("filter",filterParams);
dataParams.put("wxcard",wxcardParams);
dataParams.put("msgtype","wxcard");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_ALL_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发图文消息
*@paramaccessToken授权token
*@paramtagId标签
*@parammediaIduploadMedia方法获得
*@return
*/
publicMassMsgResultsendMpnewsToOpenid(StringaccessToken,Listopenids,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapmpnewsParams=newHashMap<>();
mpnewsParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("mpnews",mpnewsParams);
dataParams.put("msgtype","mpnews");
dataParams.put("send_ignore_reprint",0);
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发文本消息
*@paramaccessToken授权token
*@paramopenidsopenid
*@paramcontent
*@return
*/
publicMassMsgResultsendTextToOpenid(StringaccessToken,Listopenids,Stringcontent){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MaptextParams=newHashMap<>();
textParams.put("content",content);
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("text",textParams);
dataParams.put("msgtype","text");
Stringdata=JsonUtil.toJsonString(dataParams);
System.out.println(data);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发语音消息
*@paramaccessToken授权token
*@paramopenidsopenid
*@parammediaId
*@return
*/
publicMassMsgResultsendVocieToOpenid(StringaccessToken,Listopenids,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapvoiceParams=newHashMap<>();
voiceParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("voice",voiceParams);
dataParams.put("msgtype","voice");
Stringdata=JsonUtil.toJsonString(dataParams);
System.out.println(data);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发图片消息
*@paramaccessToken授权token
*@paramopenidsopenid
*@parammediaId
*@return
*/
publicMassMsgResultsendImageToOpenid(StringaccessToken,Listopenids,StringmediaId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapimageParams=newHashMap<>();
imageParams.put("media_id",mediaId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("image",imageParams);
dataParams.put("msgtype","image");
Stringdata=JsonUtil.toJsonString(dataParams);
System.out.println(data);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发视频消息
*@paramaccessToken授权token
*@paramopenidsopenid
*@parammpVideoMediauploadMediaVideo方法获得media
*@return
*/
publicMassMsgResultsendVideoToOpenid(StringaccessToken,Listopenids,MpVideoMediampVideoMedia){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("mpvideo",mpVideoMedia);
dataParams.put("msgtype","mpvideo");
Stringdata=JsonUtil.toJsonString(dataParams);
System.out.println(data);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*根据OpenId进行群发卡券消息
*@paramaccessToken授权token
*@paramopenidsopenid
*@parammediaId
*@return
*/
publicMassMsgResultsendWxcardToOpenid(StringaccessToken,Listopenids,StringcardId){
MassMsgResultresult=null;
TreeMapparams=newTreeMap<>();
params.put("access_token",accessToken);
//post提交的参数
MapwxcardParams=newHashMap<>();
wxcardParams.put("card_id",cardId);
TreeMapdataParams=newTreeMap<>();
dataParams.put("touser",openids);
dataParams.put("wxcard",wxcardParams);
dataParams.put("msgtype","wxcard");
Stringdata=JsonUtil.toJsonString(dataParams);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.SEND_MASS_MESSAGE_URL,params,data);
try{
result=JsonUtil.fromJsonString(json,MassMsgResult.class);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
视频post数据bean
/**
*视频post数据bean
*@authorphil
*@date2017年9月20日
*
*/
publicclassMpVideoMedia{
privateStringmedia_id;
privateStringtitle;
privateStringdescription;
}
获取群发视频post中的media_id
/**
*获取群发视频post中的media_id
*
*@paramaccessToken
*@paramuploadVideo
*@return
*/
publicstaticUploadMediasResultuploadMediaVideo(StringaccessToken,MpVideoMediampVideoMedia){
UploadMediasResultresult=null;
TreeMapparams=newTreeMap();
params.put("access_token",accessToken);
//post提交的参数
Stringdata=JsonUtil.toJsonString(mpVideoMedia);
Stringjson=HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,WechatConfig.UPLOAD_VIDEO_MEDIA_URL,
params,data);
result=JsonUtil.fromJsonString(json,UploadMediasResult.class);
returnresult;
}
群发返回的结果
packagecom.phil.wechat.msg.model.resp;
importcom.phil.wechat.base.result.ResultState;
/**
*群发消息返回的结果
*根据OpenID列表群发
*@authorphil
*@date2017年7月2日
*
*/
publicclassMassMsgResultextendsResultState{
privateStringtype;//媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb),次数为news,即图文消息
privateStringmsg_id;
privateStringmsg_data_id;
}
配置类
//按分组进行群发 publicstaticfinalStringSEND_ALL_MASS_MESSAGE_URL="https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; //按照openid进行群发消息(OpenID最少2个,最多10000个10000个) publicstaticfinalStringSEND_MASS_MESSAGE_URL="https://api.weixin.qq.com/cgi-bin/message/mass/send"; //上传图文消息素材 publicstaticfinalStringUPLOAD_NEWS_MEDIA_URL="https://api.weixin.qq.com/cgi-bin/media/uploadnews"; //获取群发视频post中的media_id publicstaticfinalStringUPLOAD_VIDEO_MEDIA_URL="https://api.weixin.qq.com/cgi-bin/media/uploadvideo";
关于源码,希望帮到了你
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。