今天实现了一下微信公众号的消息群发功能,整个过程还是比较麻烦的,而且有些坑。记录一下。
在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限。而对于某些具备开发能力的公众号运营者,可以通过高级群发接口,实现更灵活的群发能力。
由于群发的次数非常有限。这里是以预览的方式发送给自己。
先看效果
效果
发送成功的返回结果
{"errcode":0,"errmsg":"preview success"}
- 1
这个是预览,群发和预览差不多。
正式环境的效果(2016年9月21日补图)
思路
微信的正确思路
我的具体做法
一些代码
接口地址
// 图文内的图片地址获取接口地址 private String uploadImageUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"; // 图文封面图片获取接口地址 private String postImageMediaUrl = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=image"; // 图文素材上传接口地址 private String postNewsUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN"; // 群发接口地址 private String sendToAllUrl = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN"; // 预览接口地址 private String sendToPreviewUrl = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN";
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
关键代码
@Test public void testSendToAll() { String accessToken = accessTokenUtil.getAccessToken(); // 获取详情的新闻列表 List<NewsArticle> articleList = new ArrayList<>(); // 1.原始的新闻列表 List<NewsArticle> newsList = getArticleList(); if(newsList.size()==0){ logger.info("----------今天没有发文章,任务结束----------"); return; } // 2.封装新闻详情,并得到新闻列表 for (NewsArticle article : newsList) { NewsArticle articleNew = getArticleDetial(article.getUrl()); try { // 下载封面 String localImage = imageService.saveImageToDisk(articleNew.getImagUrl(), imageSavePath); // 上传封面 String jsonStr = HttpUtil.sendPost(postImageMediaUrl.replace("ACCESS_TOKEN", accessToken), new File(localImage)); JSONObject object = new JSONObject(); logger.info("----------上传封面返回结果:{}----------" + jsonStr); try { object = new JSONObject(jsonStr); logger.info("----------得到的图片media_id:{}----------", object.get("media_id")); articleNew.setImageMediaId((String) object.get("media_id")); } catch (Exception e) { logger.error("----------上传封面发生错误:{}", e.getMessage()); } } catch (Exception e) { logger.error("----------下载封面上传封面过程发生错误:{}", e.getMessage()); } articleList.add(articleNew); } logger.info("----------最终图文列表:{}----------", articleList); // 3.群发图文消息封装 List<GroupActicle> articles = new ArrayList<>(); for (NewsArticle NewsArticle : articleList) { GroupActicle article = new GroupActicle(); article.setThumb_media_id(NewsArticle.getImageMediaId()); article.setAuthor(NewsArticle.getAuthor()); article.setTitle(NewsArticle.getTitle()); article.setContent_source_url(NewsArticle.getUrl()); article.setContent(NewsArticle.getContent()); article.setShow_cover_pic(0); articles.add(article); } logger.info("----------图文消息:{}----------", articles); Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("articles", articles); logger.info("----------最终的图文消息json:{}----------", gson.toJson(jsonMap)); // 4.上传群发图文素材 String postNewsResult = HttpUtil.sendPost(postNewsUrl.replace("ACCESS_TOKEN", accessToken), gson.toJson(jsonMap)); logger.info("----------上传图文素材的返回结果:{}----------", postNewsResult); JSONObject object = new JSONObject(); String mediaId = ""; try { object = new JSONObject(postNewsResult); logger.info("----------得到的media_id:{}----------", object.get("media_id")); mediaId = (String) object.get("media_id"); } catch (Exception e) { logger.error("----------上传图文消息发生错误:{}----------", e.getMessage()); } // 5.选择发送的用户并发送 if (StringUtils.isNotEmpty(mediaId)) { Filter filter = new Filter(true); Mpnews mpnews = new Mpnews(mediaId); SendToAllNews sendAll = new SendToAllNews(); sendAll.setFilter(filter); sendAll.setMpnews(mpnews); sendAll.setMsgtype("mpnews"); // TODO 正式环境用sendToAll SendToOpenIdPreview sendToPreview = new SendToOpenIdPreview("omSsruLEtGPgxjaJTyurGQwQNh8Q"); sendToPreview.setMpnews(mpnews); sendToPreview.setMsgtype("mpnews"); logger.info("----------预览的json:{}----------", gson.toJson(sendToPreview)); // TODO 正式环境换成sendToAll