用java開發微信公衆號:接收和被動回覆普通消息(三)

上篇說完了如何接入微信公衆號,本文說一下微信公衆號的最基本功能:普通消息的接收和回覆。說到普通消息,那麼什麼是微信公衆號所定義的普通消息呢,微信開發者文檔中提到的接收的普通消息包括以下幾類:html

1.文本消息
2.圖片消息
3.語音消息
4.視頻消息
5.小視頻消息
6.地理位置消息
7.連接消息(被動回覆的消息)java

被動回覆的普通消息包括:git

1.回覆文本消息
2.回覆圖片消息
3.回覆語音消息
4.回覆視頻消息
5.回覆音樂消息
6.回覆圖文消息github

其實接收消息和被動回覆消息這兩個動做是不分家的,這原本就是一個交互場景,通常狀況就是公衆號經過分析接收到的消息,會給出對應的回覆。固然也不能排除一些特殊業務了。微信

如何接收消息微信開發

要接收的這7中消息的xml格式這裏就不列出了,請到官方文檔查看,有具體的格式定義和屬性說明。格式很簡單,基本共有屬性包括ToUserName、FromUserName、CreateTime、MsgType、MsgId,而且每種類型有本身特殊的屬性。dom

看到這裏,其實就很明白了,接收消息的過程其實就是獲取post請求的這個xml,而後對這個xml進行分析的過程。post請求的入口仍是以前提到的微信公衆號接入的那個地址,整個公衆號的全部請求都會走這個入口,只是接入時是get請求,其它狀況下是post請求。處理xml這裏用了dom4j,xml處理代碼以下,在servlet的post方法中調用parseXml方法便可:post

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();
    }

如何被動回覆消息this

下面我基於這樣一個邏輯來演示構造回覆的消息,接收到文本消息"文本",回覆文本消息;接收到「圖片」,回覆圖片消息;接收到「語音」,回覆語音消息;接收到「視頻」,回覆視頻消息;接收到「音樂」,回覆音樂消息;接收到「圖文」,回覆圖文消息。scala

以回覆文本消息做爲說明:

<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內容稍微複雜一點。具體可參考官方文檔。這裏不作贅述,相信各位一看便明白。

一樣,接收消息能夠參看這裏

代碼已更新到github

相關文章
相關標籤/搜索