在上一篇文章中,我们实现了被关注回复与关键词回复功能。在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息。但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起来学习一下微信公众平台开发之【图文消息的发送与响应】
一、了解图文消息XML包结构
相信一直学习我们系列博文的同学,一定了解我们的“套路”了,首先,我们要来了解一下图文消息的XML包结构。微信官方提供如下参数信息:
那么,了解了图文消息的XML包结构以后,我们就需要参照文本消息的回复,在我们的Java后台,组装我们的图文消息实体类。
但是,组装之前,我们不难发现,ToUserName、FromUserName、CreateTime、MsgType等参数,在文本消息中也出现过,而且在之后各种消息中都会出现,那么回想一下我们封装的文本消息实体类,很显然,我们需要将这些相同的内容,提取到一个父类中。下面,我们使用代码操作一下。
二、重新封装文本消息&图文消息实体类
① 提取文本消息实体类(子类)代码至消息实体类(父类)
首先,打开我们之前写好的文本消息实体类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(图文)中的Title、Description、PicUrl、Url ,并组建一个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);
}