上篇說完瞭如何接入微信公眾號,本文說一下微信公眾號的最基本功能:普通消息的接收和回复。說到普通消息,那麼什麼是微信公眾號所定義的普通消息呢,微信開發者文檔中提到的接收的普通消息包括如下幾類:
1.文本消息
2.圖片消息
3.語音消息
4.視頻消息
5.小視頻消息
6.地理位置消息
7.鏈接消息(被動回复的消息)
被動回复的普通消息包括:
1.回复文本消息
2.回复圖片消息
3.回复語音消息
4.回複視頻消息
5.回複音樂消息
6.回复圖文消息
其實接收消息和被動回复消息這兩個動作是不分家的,這本來就是一個交互場景,一般情況就是公眾號通過分析接收到的消息,會給出對應的回复。當然也不能排除一些特殊業務了。
如何接收消息
要接收的這7中消息的xml格式這裡就不列出了,請到官方文檔查看,有具體的格式定義和屬性說明。格式很簡單,基本共有屬性包括ToUserName、FromUserName、CreateTime、MsgType、MsgId,並且每種類型有自己特殊的屬性。
看到這裡,其實就很明白了,接收消息的過程其實就是獲取post請求的這個xml,然後對這個xml進行分析的過程。 post請求的入口還是之前提到的微信公眾號接入的那個地址,整個公眾號的所有請求都會走這個入口,只是接入時是get請求,其它情況下是post請求。處理xml這裡用了dom4j,xml處理代碼如下,在servlet的post方法中調用parseXml方法即可:
public static Map parseXml(HttpServletRequest request) throws Exception {// 將解析結果存儲在HashMap中Map map = new HashMap();// 從request中取得輸入流InputStream inputStream = request.getInputStream();/** 讀取request的body內容此方法會導致流讀取問題Premature end of file. Nested exception:* Premature end of file String requestBody =* inputStream2String(inputStream); System.out.println(requestBody);*/// 讀取輸入流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();// 得到根元素的所有子節點List<Element> elementList = root.elements();// 遍歷所有子節點for (Element e : elementList)map.put(e.getName(), e.getText());// 釋放資源inputStream.close();inputStream = null;return map;}private static String inputStream2String(InputStream is) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();int i = -1;while ((i = is.read()) != -1) {baos.write(i);}return baos.toString();}如何被動回复消息
下面我基於這樣一個邏輯來演示構造回复的消息,接收到文本消息"文本",回复文本消息;接收到“圖片”,回复圖片消息;接收到“語音”,回复語音消息;接收到“視頻”,回複視頻消息;接收到“音樂”,回複音樂消息;接收到“圖文”,回复圖文消息。
以回复文本消息作為說明:
<xml><ToUserName><![CDATA[發消息的人,即訂閱者]]></ToUserName><FromUserName><![CDATA[微信公眾號本身]]></FromUserName><CreateTime>消息創建時間(整形)</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[消息內容]]></Content></xml>
前兩個屬性可以從接收的消息中獲取,接收的消息格式如下:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a text]]></Content><MsgId>1234567890123456</MsgId></xml>
其中接收消息格式中的ToUserName便是回复消息的FromUserName,接收消息格式中的FromUserName便是回复消息的ToUserName。
CreateTime為消息發送的時間戳。 MsgType為消息類型,文本為text。 Content為消息內容。
具體每一種類型消息的回复,就是構造此種類型的xml格式內容,格式大同小異,只是音樂、視頻、語音、圖文格式相對於文本消息構造的xml內容稍微複雜一點。具體可參考官方文檔。這裡不做贅述,相信各位一看便明白。