在上一篇文章中,我們實現了被關注回復與關鍵詞回復功能。在用戶關注的時候自動推送功能菜單,並根據用戶輸入的關鍵詞,回復特定信息。但是,我們只能回復文本消息給用戶,如何才回復一條圖文消息呢?本周,我們一起來學習一下微信公眾平台開發之【圖文消息的發送與響應】
一、了解圖文消息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); }