前一篇文章裡我們已經把微信公眾平台接口中消息及相關操作都進行了封裝,本章節將主要介紹如何接收微信服務器發送的消息並做出響應。
明確在哪接收消息
從微信公眾平台接口消息指南中可以了解到,當用戶向公眾帳號發消息時,微信服務器會將消息通過POST方式提交給我們在接口配置信息中填寫的URL,而我們就需要在URL所指向的請求處理類CoreServlet的doPost方法中接收消息、處理消息和響應消息。
接收、處理、響應消息
下面先來看我已經寫好的CoreServlet的完整代碼:
package org.liufeng.course.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.liufeng.course.service.CoreService; import org.liufeng.course.util.SignUtil; /** * 核心請求處理類 * * @author liufeng * @date 2013-05-18 */ public class CoreServlet extends HttpServlet { private static final long serialVersionUID = 4440739483644821986L; /** * 確認請求來自微信服務器 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信加密簽名 String signature = request.getParameter("signature"); // 時間戳 String timestamp = request.getParameter("timestamp"); // 隨機數 String nonce = request.getParameter("nonce"); // 隨機字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; } /** * 處理微信服務器發來的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 將請求、響應的編碼均設置為UTF-8(防止中文亂碼) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 調用核心業務類接收消息、處理消息 String respMessage = CoreService.processRequest(request); // 響應消息 PrintWriter out = response.getWriter(); out.print(respMessage); out.close(); } }
代碼說明:
1)第29行:調用消息工具類MessageUtil解析微信發來的xml格式的消息,解析的結果放在HashMap裡;
2)32~36行:從HashMap中取出消息中的字段;
3)39-44、84行:組裝要返回的文本消息對象;
4)47~82行:演示了如何接收微信發送的各類型的消息,根據MsgType判斷屬於哪種類型的消息;
5)85行:調用消息工具類MessageUtil將要返回的文本消息對象TextMessage轉化成xml格式的字符串;
關於事件推送(關注、取消關注、菜單點擊)
對於消息類型的判斷,像文本消息、圖片消息、地理位置消息、鏈接消息和語音消息都比較好理解,有很多剛接觸的朋友搞不懂事件推送消息有什麼用,或者不清楚該如何判斷用戶關注的消息。那我們就專門來看下事件推送,下圖是官方消息接口文檔中關於事件推送的說明:
這裡我們只要關心兩個參數:MsgType和Event。當MsgType=event時,就表示這是一條事件推送消息;而Event表示事件類型,包括訂閱、取消訂閱和自定義菜單點擊事件。也就是說,無論用戶是關注了公眾帳號、取消對公眾帳號的關注,還是在使用公眾帳號的菜單,微信服務器都會發送一條MsgType=event的消息給我們,而至於具體這條消息表示關注、取消關注,還是菜單的點擊事件,就需要通過Event的值來判斷了。(注意區分Event和event)
連載五篇教程總結
經過5篇的講解,已經把開發模式啟用,接口配置,消息相關工具類的封裝,消息的接收與響應全部講解完了,而且貼上了完整的源代碼,相信有一定Java基礎的朋友可以看的明白,能夠通過系列文章基本掌握微信公眾平台開發的相關技術知識。下面我把目前項目的完整結構貼出,方便大家對照: