一、在哪里接收這些消息
從微信公眾平臺接口消息指南中可以了解到,當用戶向公眾帳號發(fā)消息時,微信服務器會將消息通過POST方式提交給我們在接口配置信息中填寫的URL,而我們就需要在URL所指向的請求處理類CoreServlet的doPost方法中接收消息、處理消息和響應消息。
/**     * 處理微信服務器發(fā)來的消息     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {                // 微信服務器POST消息時用的是UTF-8編碼,在接收時也要用同樣的編碼,否則中文會亂碼;        request.setCharacterEncoding("UTF-8");        //在響應消息(回復消息給用戶)時,也將編碼方式設置為UTF-8,原理同上;        response.setCharacterEncoding("UTF-8");                // 調(diào)用CoreService類的PRocessRequest方法接收、處理消息,并得到處理結果;        String respMessage = CoreService.processRequest(request);                  // 調(diào)用response.getWriter().write()方法將消息的處理結果返回給用戶        PrintWriter out = response.getWriter();          out.print(respMessage);          out.close();      }二、怎么接收和響應這些消息
package com.souvc.weixin.service;import java.util.Date;import java.util.Map;import javax.servlet.http.HttpServletRequest;import com.souvc.weixin.message.resp.TextMessage;import com.souvc.weixin.util.MessageUtil;/** * * @ClassName: CoreService * @Description: 業(yè)務核心類 * @author: souvc * @date Jun 15, 2015 4:49:10 PM */public class CoreService { /** * 處理微信發(fā)來的請求 * * @param request * @return */ public static String processRequest(HttpServletRequest request) { String respMessage = null; try { // 默認返回的文本消息內(nèi)容 String respContent = "請求處理異常,請稍候嘗試!"; // 調(diào)用消息工具類MessageUtil解析微信發(fā)來的xml格式的消息,解析的結果放在HashMap里; Map<String, String> requestMap = MessageUtil.parseXml(request); // 從HashMap中取出消息中的FromUserName,ToUserName,MsgType字段; // 發(fā)送方帳號(open_id) String fromUserName = requestMap.get("FromUserName"); // 公眾帳號 String toUserName = requestMap.get("ToUserName"); // 消息類型 String msgType = requestMap.get("MsgType"); // 回復文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setFuncFlag(0); // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { respContent = "您發(fā)送的是文本消息!"; } // 圖片消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { respContent = "您發(fā)送的是圖片消息!"; } // 地理位置消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { respContent = "您發(fā)送的是地理位置消息!"; } // 鏈接消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { respContent = "您發(fā)送的是鏈接消息!"; } // 音頻消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { respContent = "您發(fā)送的是音頻消息!"; } // 事件推送 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { // 事件類型 String eventType = requestMap.get("Event"); // 訂閱 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { respContent = "謝謝您的關注!"; } // 取消訂閱 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { // TODO 取消訂閱后用戶再收不到公眾號發(fā)送的消息,因此不需要回復消息 } // 自定義菜單點擊事件 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) { // TODO 自定義菜單權沒有開放,暫不處理該類消息 } } textMessage.setContent(respContent); // 調(diào)用消息工具類MessageUtil將要返回的文本消息對象TextMessage轉化成xml格式的字符串; respMessage = MessageUtil.textMessageToXml(textMessage); } catch (Exception e) { e.printStackTrace(); } return respMessage; }}
微信服務器發(fā)送過來的消息,我們服務器回應響應的消息。
完整的源碼: http://yunpan.cn/cQyvhABdhNVR9 訪問密碼 2336
新聞熱點
疑難解答