使用Java語言開發微信公眾平台(四)——圖文消息的發送與響應


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

     、了解圖文消息XML包結構

    相信一直學習我們系列博文的同學一定了解我們的“套路”了,首先,我們要來了解一下圖文消息的XML包結構。微信官方提供如下參數信息:

 

 

      那么,了解了圖文消息的XML包結構以后,我們就需要參照文本消息的回復,在我們的Java后台,組裝我們的圖文消息實體類。

     但是組裝之前我們不難發現ToUserNameFromUserNameCreateTimeMsgType等參數在文本消息中也出現過而且在之后各種消息中都會出現那么回想一下我們封裝的文本消息實體類很顯然我們需要將這些相同的內容提取到一個父類中。下面,我們使用代碼操作一下。

     、重新封裝文本消息&圖文消息實體類

    ① 提取文本消息實體類(子類)代碼至消息實體類(父類)

     首先打開我們之前寫好的文本消息實體類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(圖文)中的TitleDescriptionPicUrlUrl 並組建一個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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM