在上一篇文章中,我們實現了被關注回復與關鍵詞回復功能。在用戶關注的時候自動推送功能菜單,并根據用戶輸入的關鍵詞,回復特定信息。但是,我們只能回復文本消息給用戶,如何才回復一條圖文消息呢?本周,我們一起來學習一下微信公眾平臺開發之【圖文消息的發送與響應】
一、了解圖文消息XML包結構
相信一直學習我們系列博文的同學,一定了解我們的“套路”了,首先,我們要來了解一下圖文消息的XML包結構。微信官方提供如下參數信息:
那么,了解了圖文消息的XML包結構以后,我們就需要參照文本消息的回復,在我們的Java后臺,組裝我們的圖文消息實體類。
但是,組裝之前,我們不難發現,ToUserName、FromUserName、CreateTime、MsgType等參數,在文本消息中也出現過,而且在之后各種消息中都會出現,那么回想一下我們封裝的文本消息實體類,很顯然,我們需要將這些相同的內容,提取到一個父類中。下面,我們使用代碼操作一下。
二、重新封裝文本消息&圖文消息實體類
① 提取文本消息實體類(子類)代碼至消息實體類(父類)
首先,打開我們之前寫好的文本消息實體類textMessage:
找到里面共同的屬性,并將代碼提取到父類中:
新建一個父類,baseMessage.java,并將上述紅線區域內的代碼提取到父類中,讓我們的textMessage類繼承此父類。
接下來,我們分析一下微信的圖文消息XML包結構:
<![CDATA[title1]]>
<![CDATA[title]]>
不難發現,在 標簽中,可以有一個或多個標簽,這也就對應著一條到多條圖文消息。那么顯然,在組裝圖文消息實體類時,我們需要構建兩個實體類,分別為: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的根節點替換成 ?默認為NewsMessage的包名
xstream.alias("xml", newsMessage.getClass());
//同理,將每條圖文消息News類的報名,替換為標簽
xstream.alias("item", new News().getClass());
return xstream.toXML(newsMessage);
}
/**
* 初始化圖文消息
*/
public static String initNewsMessage(String toUSerName,String fromUserName){
List newsList = new ArrayList();
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);
}
原創內容,歡迎轉載!轉載請注明出處!需要源碼下載,請聯系博主!微博@小風飛魚