zoukankan      html  css  js  c++  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

    六、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 {
    
        @Resource
        private WechatMassService wechatMassService;
    
        private String accessToken = "15_wR_uy3F8vWem6JfB5uG6wvJo2C2Ok8I9D-i39kkaTP78D98O3hl-nPIiFhu-ylU0VDXWHBQmY_3gz4K8-Em7Ub3c5KXZj_W9cbXZT0D-NzA3uaVrc61QeOgjfKFeEm62cMG0IcCtPhFSkrGTHCEbAHAAVX";
    
        @Test
        public void uploadForMassNewsFile() {
            String filePath = "C:/Users/Phil/Desktop/820084947_副本2.jpg";
            System.out.println(wechatMassService.uploadForMassNewsFile(accessToken, "image", filePath));
        }
    
        @Test
        public 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));
        }
    
        @Test
        public 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));
        }
    
        @Test
        public 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));
        }
    
        @Test
        public 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));
        }
    
        @Test
        public 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));
        }
    
        @Test
        public void sendVideoToOpenid() {
        }
    
        @Test
        public void sendWxcardToOpenid() {
        }
    
        @Test
        public 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));
        }
    
        @Test
        public void deleteMassMessage() {
    
    
        }
    
        @Test
        public 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

    扫一扫加群

    本文为Phil Jing原创文章,未经博主允许不得转载,如有问题请直接回复或者加群。
  • 相关阅读:
    P3444 [POI2006]ORK-Ploughing
    p4555&bzoj2565 最长双回文串
    bzoj2563 阿狸和桃子的游戏
    p4503&bzoj3555 企鹅QQ
    p3627&bzoj1179 抢掠计划(ATM)
    p2279&bzoj1217 消防局的设立
    p2661 信息传递(Tarjan模板)
    p2071 座位安排
    2B The least round way
    JSK 糟糕的bug
  • 原文地址:https://www.cnblogs.com/phil_jing/p/15615871.html
Copyright © 2011-2022 走看看