上一篇文章總結了Java語言開發微信公眾平台的第一部分-環境搭建與開發接入,這篇總結訊息的接收與回應。
存取微信公眾平台的時候,微信將發送Get請求給我們的校驗方法。那麼當我們接收訊息的時候,微信將向我們發送Post請求,並以XML的格式發送與接收資料。
看一下微信發給我們的普通文字訊息的XML套件結構:
將接收到的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; }
類似上述方法,我們需要寫方法,將我們的訊息對象,轉成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格式 * @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); }
寫完上述兩個處理方法後,我們來實現【訊息的接收與回應】,
回到我們最開始的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(); } }
以上是Java+微信公眾號開發流程步驟詳解2的詳細內容。更多資訊請關注PHP中文網其他相關文章!