Java+微信公眾號開發過程步驟詳解2

來源:互聯網
上載者:User
上一篇文章總結了Java語言開發公眾平台的第一部分—— 環境搭建與開發接入,這一篇總結 訊息的接收與響應。

接入公眾平台的時候,將發送Get請求給我們的校正方法。那當我們接收訊息的時候,將向我們發送Post請求,並以XML的格式發送與接收資料。

看一下發給我們的普通簡訊的XML包結構:

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1348831860</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[this is a test]]></Content>

<MsgId>1234567890123456</MsgId>

</xml>

官方文檔說明:

瞭解之後,開始敲代碼:

1.將接收到的XML格式,轉為集合對象(Map)

在Util包下,建立一個MessageUtil工具類:

將接收到的XML格式,轉化為Map格式需要一個叫dom4j的jar包。並將其放置在Web-INF下的lib包中,在文章的末尾我會放上所需的所有jar包。藉助dom4j的jar包,我們可以編寫方法,將XML格式,轉化對Map對象格式,方法實現如下:

/** * 建立方法,將接收到的XML格式,轉化為Map對象 * @param request 將request對象,通過參數傳入 * @return 返迴轉換後的Map對象 */public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{Map<String, String> map = new HashMap<String, String>();//從dom4j的jar包中,拿到SAXReader對象。SAXReader reader = new SAXReader();InputStream is = request.getInputStream();//從request中,擷取輸入資料流Document doc =  reader.read(is);//從reader對象中,讀取輸入資料流Element root = doc.getRootElement();//擷取XML文檔的根項目List<Element> list = root.elements();//獲得根項目下的所有子節點for (Element e : list) {map.put(e.getName(), e.getText());//遍曆list對象,並將結果儲存到集合中}is.close();return map;}

2、 類似上述方法,我們需要編寫方法,將我們的訊息對象,轉成XML。

此處,我們仍需藉助一個jar包:xstream.jar,匯入方式同dom4j。(另說明一點,之前我匯入的xstream是1.4的版本,回複訊息總是缺少內容,於是在各種嘗試後將jar包版本換成1.3後回複訊息成功,特此說明一下,具體原因暫時未知,將此坑告訴後面學習的人以防浪費時間)

當然,首先,我們需要建立一個實體類TextMessage,用於承載訊息對象,實體類中6個屬性,分別對應上述給我們發送的XML文本的6個參數,並提供對應Get/Set方法以及空參/全參構造,此處不做贅述:

private String ToUserName;//開發人員號private String FromUserName;//發送方帳號private Long CreateTime;//訊息建立時間private String MsgType;//訊息類型private String Content;//簡訊內容private String MsgId;//訊息id,64位整型

接下來,我們編寫方法,來轉換此簡訊類的對象,將其轉換為XML格式返回:

/*** 將簡訊對象轉化成XML格式* @param message 簡訊對象* @return 返迴轉換後的XML格式*/public static String textMessageToXml(TextMessage message){XStream xs = new XStream();//由於轉換後xml根節點預設為class類,需轉化為<xml>xs.alias("xml", message.getClass());return xs.toXML(message);}

3、 寫完上述兩個處理方法後,我們來實現【訊息的接收與響應】,

回到我們最開始的Servlet中,在doPost方法中進行編寫操作:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();try {//將request請求,傳到Message工具類的轉換方法中,返回接收到的Map對象Map<String, String> map = MessageUtil.xmlToMap(request);//從集合中,擷取XML各個節點的內容String ToUserName = map.get("ToUserName");String FromUserName = map.get("FromUserName");String CreateTime = map.get("CreateTime");String MsgType = map.get("MsgType");String Content = map.get("Content");String MsgId = map.get("MsgId");if(MsgType.equals("text")){//判斷訊息類型是否是簡訊(text)TextMessage message = new TextMessage();                //原來【接收訊息使用者】變為回複時【發送訊息使用者】message.setFromUserName(ToUserName);message.setToUserName(FromUserName);message.setMsgType("text");message.setCreateTime(new Date().getTime());//建立目前時間為訊息時間message.setContent("您好,"+FromUserName+"\n我是:"+ToUserName+"\n您發送的訊息類型為:"+MsgType+"\n您發送的時間為"+CreateTime+"\n我回複的時間為:"+message.getCreateTime()+"\n您發送的內容是:"+Content);//調用Message工具類,將對象轉為XML字串                str = MessageUtil.textMessageToXml(message); System.out.println(str);out.print(str);}} catch (DocumentException e) {e.printStackTrace();}finally{out.close();}} catch (DocumentException e) {e.printStackTrace();}finally{out.close();}}

這樣,我們就成功的完成了簡訊的接收與響應。

項目所需jar包:

連結:https://pan.baidu.com/s/1n7WXoDXN97AwQPjgiyz5gw 密碼:m5ne

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.