再次吐槽下,微信素材管理和群发这块文档对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

六、Junit测试

package com.phil.wechat.mass.service.impl;import com.google.gson.JsonObject;
import com.phil.WechatMainApplication;
import com.phil.wechat.mass.model.request.MassNews;
import com.phil.wechat.mass.model.request.send.MassUserImageData;
import com.phil.wechat.mass.model.request.send.MassUserMpnewsData;
import com.phil.wechat.mass.model.request.send.MassUserTextData;
import com.phil.wechat.mass.model.request.send.MassUserVoiceData;
import com.phil.wechat.mass.model.request.type.MassImageType;
import com.phil.wechat.mass.model.request.type.MassMpnewsType;
import com.phil.wechat.mass.model.request.type.MassTextType;
import com.phil.wechat.mass.model.request.type.MassVoiceType;
import com.phil.wechat.mass.service.WechatMassService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = WechatMainApplication.class)
@ActiveProfiles("dev")
public class WechatMassServiceImplTest {@Resourceprivate WechatMassService wechatMassService;private String accessToken = "15_wR_uy3F8vWem6JfB5uG6wvJo2C2Ok8I9D-i39kkaTP78D98O3hl-nPIiFhu-ylU0VDXWHBQmY_3gz4K8-Em7Ub3c5KXZj_W9cbXZT0D-NzA3uaVrc61QeOgjfKFeEm62cMG0IcCtPhFSkrGTHCEbAHAAVX";@Testpublic void uploadForMassNewsFile() {String filePath = "C:/Users/Phil/Desktop/820084947_副本2.jpg";System.out.println(wechatMassService.uploadForMassNewsFile(accessToken, "image", filePath));}@Testpublic void uploadMassNews() {MassNews massNews = new MassNews();String filePath1 = "C:/Users/Phil/Desktop/1034851200_副本_副本.jpg";String mediaId1 = wechatMassService.uploadForMassNewsFile(accessToken, "image", filePath1);MassNews.MassNewsArticle article1 = new MassNews.MassNewsArticle();article1.setAuthor("phil");article1.setContent("Hello");article1.setContentSourceUrl("");article1.setThumbMediaId(mediaId1);massNews.addArticle(article1);String filePath2 = "C:/Users/Phil/Desktop/23213.jpg";String mediaId2 = wechatMassService.uploadForMassNewsFile(accessToken, "image", filePath2);MassNews.MassNewsArticle article2 = new MassNews.MassNewsArticle();article2.setAuthor("phil");article2.setContent("Hello");article2.setContentSourceUrl("");article2.setThumbMediaId(mediaId2);massNews.addArticle(article2);System.out.println(wechatMassService.uploadMassNews(accessToken, massNews));}@Testpublic void sendNewsToOpenid() {String mediaId = "sdPeuaes30dsGRr-BJ1Ipnw-ntOCXJfYkui1weY-GWp4q5Ejy_uyjrs3tQUYYR83";MassUserMpnewsData data = new MassUserMpnewsData();data.addOpenid("ovHQ5v6CW3INkWUsCl3olODif0cc");data.addOpenid("ovHQ5v_btX6f7dtbTitqCOyC4aBw");data.addType(new MassMpnewsType(mediaId));System.out.println(wechatMassService.sendToOpenid(accessToken, data));}@Testpublic void sendTextToOpenid() {String content = "测试根据Openid群发文字消息" + UUID.randomUUID().toString().replace("-", "").substring(0, 8);MassUserTextData data = new MassUserTextData();data.addOpenid("ovHQ5v6CW3INkWUsCl3olODif0cc");data.addOpenid("ovHQ5v_btX6f7dtbTitqCOyC4aBw");data.addType(new MassTextType(content));System.out.println(wechatMassService.sendToOpenid(accessToken, data));}@Testpublic void sendVocieToOpenid() {String mediaId = "";MassUserVoiceData data = new MassUserVoiceData();data.addOpenid("ovHQ5v6CW3INkWUsCl3olODif0cc");data.addOpenid("ovHQ5v_btX6f7dtbTitqCOyC4aBw");data.addType(new MassVoiceType(mediaId));System.out.println(wechatMassService.sendToOpenid(accessToken, data));}@Testpublic void sendImageToOpenid() {String mediaId = "nLh_e0YCYBBHzPKWDm8St4vpuRRjMyVsM4QZsRmhlbnm6f4IKTigVydCOB07wO30";MassUserImageData data = new MassUserImageData();data.addOpenid("ovHQ5v6CW3INkWUsCl3olODif0cc");data.addOpenid("ovHQ5v_btX6f7dtbTitqCOyC4aBw");data.addType(new MassImageType(mediaId));System.out.println(wechatMassService.sendToOpenid(accessToken, data));}@Testpublic void sendVideoToOpenid() {}@Testpublic void sendWxcardToOpenid() {}@Testpublic void previewToOpenid() {String mediaId = "nLh_e0YCYBBHzPKWDm8St4vpuRRjMyVsM4QZsRmhlbnm6f4IKTigVydCOB07wO30";Map<String, String> map = new HashMap<>();map.put("touser", "ovHQ5v6CW3INkWUsCl3olODif0cc");map.put("media_id", mediaId);map.put("msgtype", "image");System.out.println(wechatMassService.previewToOpenid(accessToken, map));}@Testpublic void deleteMassMessage() {}@Testpublic void getMassMessageStatus() {JsonObject json = new JsonObject();json.addProperty("msg_id", "232132131");System.out.println(json.toString());}
}

具体源码:https://github.com/philjing/my_wechat/tree/master/src/main/java/com/phil/wechat/mass

Java微信公众平台开发之群发接口(高级群发)相关推荐

  1. Java微信公众平台开发(一)--接入微信公众平台

    转载自崔用志博客:http://www.cuiyongzhi.com/ 前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我 ...

  2. Java微信公众平台开发(一)——接入微信公众平台

    前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 在 ...

  3. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  4. 微信信息回复 java,微信公众平台开发中使用Java如何实现一个消息回复功能

    微信公众平台开发中使用Java如何实现一个消息回复功能 发布时间:2020-11-17 16:11:11 来源:亿速云 阅读:82 作者:Leah 本篇文章给大家分享的是有关微信公众平台开发中使用Ja ...

  5. java微信公众平台开发接口_微信公众平台API的Java通讯实现

    微信公众平台 相信大家也不陌生,官方网站提供了一个简单的php程序Demo 因为微信平台采用HTTP方式承载微信的协议,而且不是双向通讯,也就是说只能由微信服务器主动请求我们的服务器.其实当你使用我开 ...

  6. Java微信公众平台开发(十)--微信自定义菜单的创建实现

    转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...

  7. 微信公众平台开发,自定义菜单,群发消息,网页授权(3)

    前两节说的都是微信开发的初级篇,这一节说高级篇.微信公众号关注以后,下面都是有菜单的,底部有三个一级菜单,每个一级菜单可以添加5个二级菜单.一级菜单最多四个汉字,二级菜单最多7个汉字,多出来的汉字用& ...

  8. Java微信公众平台开发_03_消息管理之被动回复消息

    GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...

  9. Java微信公众平台开发之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系 ...

  10. Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息

    转自:http://www.cuiyongzhi.com/post/78.html 好长时间没有写文章了,主要是最近的工作和生活上的事情比较多而且繁琐,其实到现在我依然还是感觉有些迷茫,最后还是决定静 ...

最新文章

  1. AssetManager asset使用
  2. docker 安装gitlab
  3. MaskRCNN要点
  4. mysql创建虚拟网卡_创建启动虚拟网卡
  5. Python 中Python 为什么要继承 object 类
  6. GZHU软件方向综合课程设计——课程管理系统(Qt+mysql)
  7. 拯救者Y9000P+因特尔11代+3060Ubuntu驱动安装
  8. python接入讯代理_[Python3网络爬虫开发实战] 9.3-付费讯代理、阿布云代理的使用...
  9. Is your horseshoe on the other hoof?
  10. 创建自己的WordPress主题的三种方法
  11. 将网站放到桌面快捷方式
  12. 比亚乔-截至2020年5月,全球两轮车销量同比下降21%
  13. 不可能得到的最短骰子序列
  14. mysql url查找_Superl-url:一款开源、强大的关键词URL采集工具
  15. 我的世界刷猪人塔java版_我的世界主世界僵尸猪人刷怪塔制作教程
  16. Android动画之帧动画
  17. 联想开机启动项按哪个_联想笔记本按哪个键进入u盘启动
  18. 常见硬件面试题(含答案)盘点,硬件工程师学习笔记
  19. 三星s8是否支持html,三星Galaxy S8支持什么视频格式
  20. coda 创建和删除虚拟环境

热门文章

  1. P4231 三步必杀
  2. css伪类加垂直分割线
  3. [源码和文档分享]基于JAVA的实现学生卡管理系统
  4. 【前端面试题】2021秋招+金九银十,看完这些就够了 最新前端面试总结 68道前端面试题,助你进大厂
  5. 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐
  6. 【用pandas_alive几行代码绘制竞赛动图】10.新南威尔士州 COVID 可视化(测试代码+数据集+绘图参数解析)
  7. 在线客服——各第三方的收费标准及服务提供
  8. psd文件转响应式html5,前端切图【PSD转静态页】响应式切图 html5+css3
  9. 2022年9月11日(星期天):(原创)骑行环草海
  10. 普惠微光汇聚暖阳,招联携手奋斗者筑梦前行