微信公众号开发--群发图文消息,消息体包含图片地址

                       

今天实现了一下微信公众号的消息群发功能,整个过程还是比较麻烦的,而且有些坑。记录一下。

微信官方文档–高级群发接口

 

在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值