使用Java语言开发微信公众平台(四)——图文消息的发送与响应

      在上一篇文章中我们实现了被关注回复与关键词回复功能。在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息。但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起来学习一下微信公众平台开发之图文消息的发送与响应

     、了解图文消息XML包结构

    相信一直学习我们系列博文的同学一定了解我们的“套路”了,首先,我们要来了解一下图文消息的XML包结构。微信官方提供如下参数信息:

 

 

      那么,了解了图文消息的XML包结构以后,我们就需要参照文本消息的回复,在我们的Java后台,组装我们的图文消息实体类。

     但是组装之前我们不难发现ToUserNameFromUserNameCreateTimeMsgType等参数在文本消息中也出现过而且在之后各种消息中都会出现那么回想一下我们封装的文本消息实体类很显然我们需要将这些相同的内容提取到一个父类中。下面,我们使用代码操作一下。

     、重新封装文本消息&图文消息实体类

    ① 提取文本消息实体类(子类)代码至消息实体类(父类)

     首先打开我们之前写好的文本消息实体类textMessage:

    找到里面共同的属性并将代码提取到父类中

     新建一个父类baseMessage.java,并将上述红线区域内的代码提取到父类中让我们的textMessage类继承此父类

    接下来我们分析一下微信的图文消息XML包结构

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>

     不难发现<Articles></Articles> 标签中可以有一个或多个<item></item>标签这也就对应着一条到多条图文消息。那么显然,在组装图文消息实体类时,我们需要构建两个实体类,分别为:News.Java 包含每条item(图文)中的TitleDescriptionPicUrlUrl 并组建一个NewsMessage.java ,继承自BaseMessage.java作为我们整个图文消息的多个item

    ② 构建单条item的实体类News.java 属性如下

    ③ 构建整个图文消息的实体类NewsMessage.java 属性如下

     、消息处理工具类MessageUtil中新增图文消息相关处理方法

    ① 新增图文消息转XML结构方法

     我们之前说过,微信只能接受XML结构的消息内容,那么我们可以参照之前文本消息转XML的方法,新建一个方法转化图文消息:

        ② 新增初始化图文消息方法

       、修改Servlet中的doPost方法发送图文消息

     此时我们就完成了图文消息的回复发送,有代码可知,当用户回复数字3时,可收到我们撰写的图文消息,点开后将跳转到指定网址,效果如下:

      【附录】 主要代码如下

      MessageUtil工具类图文消息转xml&初始化图文消息方法:

/**
     * 将图文消息对象转成XML
     * @param 
     * @return
     */
    public static String newsMessageToXml(NewsMessage newsMessage){
        XStream xstream = new XStream();
        //将xml的根节点替换成<xml>  默认为NewsMessage的包名
        xstream.alias("xml", newsMessage.getClass());
        //同理,将每条图文消息News类的报名,替换为<item>标签
        xstream.alias("item", new News().getClass());
        return xstream.toXML(newsMessage);
    }
    
    
    /**
     * 初始化图文消息
     */
    public static String initNewsMessage(String toUSerName,String fromUserName){
        List<News> newsList = new ArrayList<News>();
        NewsMessage newsMessage = new NewsMessage();
        //组建一条图文↓ ↓ ↓
        News newsItem = new News();
        newsItem.setTitle("欢迎来到杰瑞教育");
        newsItem.setDescription("杰瑞教育,中国高端互联网人才培训领导品牌!");
        newsItem.setPicUrl("http://www.jredu100.com/statics/images/index/top/logo.png");
        newsItem.setUrl("www.jredu100.com");
        newsList.add(newsItem);
        
        //组装图文消息相关信息
        newsMessage.setToUserName(fromUserName);
        newsMessage.setFromUserName(toUSerName);
        newsMessage.setCreateTime(new Date().getTime());
        newsMessage.setMsgType(MESSAGE_NEWS);
        newsMessage.setArticle(newsList);
        newsMessage.setArticleCount(newsList.size());
        
        //调用newsMessageToXml将图文消息转化为XML结构并返回
        return MessageUtil.newsMessageToXml(newsMessage);
    }
原文地址:https://www.cnblogs.com/jerehedu/p/6612214.html