在上一篇文章中,咱們實現了被關注回覆與關鍵詞回覆功能。在用戶關注的時候自動推送功能菜單,並根據用戶輸入的關鍵詞,回覆特定信息。可是,咱們只能回覆文本消息給用戶,如何纔回復一條圖文消息呢?本週,咱們一塊兒來學習一下微信公衆平臺開發之【圖文消息的發送與響應】java
一、瞭解圖文消息XML包結構微信
相信一直學習咱們系列博文的同窗,必定了解咱們的「套路」了,首先,咱們要來了解一下圖文消息的XML包結構。微信官方提供以下參數信息:微信公衆平臺
那麼,瞭解了圖文消息的XML包結構之後,咱們就須要參照文本消息的回覆,在咱們的Java後臺,組裝咱們的圖文消息實體類。curl
可是,組裝以前,咱們不難發現,ToUserName、FromUserName、CreateTime、MsgType等參數,在文本消息中也出現過,並且在以後各類消息中都會出現,那麼回想一下咱們封裝的文本消息實體類,很顯然,咱們須要將這些相同的內容,提取到一個父類中。下面,咱們使用代碼操做一下。工具
二、從新封裝文本消息&圖文消息實體類學習
① 提取文本消息實體類(子類)代碼至消息實體類(父類)url
首先,打開咱們以前寫好的文本消息實體類textMessage:spa
找到裏面共同的屬性,並將代碼提取到父類中:3d
新建一個父類,baseMessage.java,並將上述紅線區域內的代碼提取到父類中,讓咱們的textMessage類繼承此父類。code
接下來,咱們分析一下微信的圖文消息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); }