1. 程式人生 > >微信公眾平臺開發教程Java版(六) 事件處理(選單點選/關注/取消關注)

微信公眾平臺開發教程Java版(六) 事件處理(選單點選/關注/取消關注)

前言:

事件處理是非常重要的,這一章講講常見的事件處理

  • 1、關注/取消關注
  • 2、選單點選
事件型別介紹:
  • 在微信中有事件請求是訊息請求中的一種。請求型別為:event
  • 而event事件型別又分多種事件型別,具體分
  • 關注:subscribe
  • 取消關注:unsubscribe
  • 自定義選單點選:CLICK

   根據上面的型別分類可建對應的常量

/**
	 * 請求訊息型別:事件
	 */
	public static final String REQ_MESSAGE_TYPE_EVENT = "event";

	/**
	 * 事件型別:subscribe(關注)
	 */
	public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";

	/**
	 * 事件型別:unsubscribe(取消關注)
	 */
	public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";

	/**
	 * 事件型別:CLICK(自定義選單點選事件)
	 */
	public static final String EVENT_TYPE_CLICK = "CLICK";
	
  • 再在CoreServiceImpl中處理對應事件型別,先上CoreServiceImpl的原始碼
  • package com.ifp.weixin.biz.core.impl;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Service;
    import com.ifp.weixin.biz.core.CoreService;
    import com.ifp.weixin.constant.Constant;
    import com.ifp.weixin.entity.Message.resp.Article;
    import com.ifp.weixin.entity.Message.resp.NewsMessage;
    import com.ifp.weixin.entity.Message.resp.TextMessage;
    import com.ifp.weixin.util.MessageUtil;
    
    @Service("coreService")
    public class CoreServiceImpl implements CoreService {
    
    	public static Logger log = Logger.getLogger(CoreServiceImpl.class);
    
    	@Override
    	public String processRequest(HttpServletRequest request) {
    		String respMessage = null;
    		try {
    			// xml請求解析
    			Map<String, String> requestMap = MessageUtil.parseXml(request);
    
    			// 傳送方帳號(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(Constant.RESP_MESSAGE_TYPE_TEXT);
    			textMessage.setFuncFlag(0);
    
    			String respContent = "";
    
    			// 文字訊息
    			if (msgType.equals(Constant.REQ_MESSAGE_TYPE_TEXT)) {
    				// 接收使用者傳送的文字訊息內容
    				String content = requestMap.get("Content");
    
    				// 建立圖文訊息
    				NewsMessage newsMessage = new NewsMessage();
    				newsMessage.setToUserName(fromUserName);
    				newsMessage.setFromUserName(toUserName);
    				newsMessage.setCreateTime(new Date().getTime());
    				newsMessage.setMsgType(Constant.RESP_MESSAGE_TYPE_NEWS);
    				newsMessage.setFuncFlag(0);
    
    				List<Article> articleList = new ArrayList<Article>();
    
    				// 單圖文訊息
    				if ("1".equals(content)) {
    					Article article = new Article();
    					article.setTitle("我是一條單圖文訊息");
    					article.setDescription("我是描述資訊,哈哈哈哈哈哈哈。。。");
    					article.setPicUrl("http://www.iteye.com/upload/logo/user/603624/2dc5ec35-073c-35e7-9b88-274d6b39d560.jpg");
    					article.setUrl("http://tuposky.iteye.com");
    					articleList.add(article);
    
    					// 設定圖文訊息個數
    					newsMessage.setArticleCount(articleList.size());
    					// 設定圖文訊息包含的圖文集合
    
    					newsMessage.setArticles(articleList);
    					// 將圖文訊息物件轉換成xml字串
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 多圖文訊息
    				else if ("3".equals(content)) {
    
    					Article article1 = new Article();
    					article1.setTitle("我是一條多圖文訊息");
    					article1.setDescription("");
    					article1.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20130913/2013091314543416032.jpg");
    					article1.setUrl("http://tuposky.iteye.com/blog/2008583");
    
    					Article article2 = new Article();
    					article2.setTitle("微信公眾平臺開發教程Java版(二)介面配置 ");
    					article2.setDescription("");
    					article2.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111243367254.jpg");
    					article2.setUrl("http://tuposky.iteye.com/blog/2008655");
    
    					Article article3 = new Article();
    					article3.setTitle("微信公眾平臺開發教程Java版(三) 訊息接收和傳送");
    					article3.setDescription("");
    					article3.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111291287031.jpg");
    					article3.setUrl("http://tuposky.iteye.com/blog/2017429");
    
    					articleList.add(article1);
    					articleList.add(article2);
    					articleList.add(article3);
    					newsMessage.setArticleCount(articleList.size());
    
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    
    				//事件處理開始
    			} else if (msgType.equals(Constant.REQ_MESSAGE_TYPE_EVENT)) {
    				// 事件型別
    				String eventType = requestMap.get("Event");
    
    				if (eventType.equals(Constant.EVENT_TYPE_SUBSCRIBE)) {
    					// 關注
    					respContent = "感謝您關注偶,這裡會給您提供最新的公司資訊和公告!\n";
    					StringBuffer contentMsg = new StringBuffer();
    					contentMsg.append("您還可以回覆下列數字,體驗相應服務").append("\n\n");
    					contentMsg.append("1  我就是個測試的").append("\n");
    					contentMsg.append("2  我木有").append("\n");
    					contentMsg.append("3  我是多圖文").append("\n");
    					respContent = respContent+contentMsg.toString();
    					
    				} else if (eventType.equals(Constant.EVENT_TYPE_UNSUBSCRIBE)) {
    					// 取消關注,使用者接受不到我們傳送的訊息了,可以在這裡記錄使用者取消關注的日誌資訊
    
    				}  else if (eventType.equals(Constant.EVENT_TYPE_CLICK)) {
    
    					// 事件KEY值,與建立自定義選單時指定的KEY值對應
    					String eventKey = requestMap.get("EventKey");
    
    					// 自定義選單點選事件
    					if (eventKey.equals("11")) {
    						respContent = "天氣預報選單項被點選!";
    					} else if (eventKey.equals("12")) {
    						respContent = "公交查詢選單項被點選!";
    					}
    				}
    				textMessage.setContent(respContent);
    				respMessage = MessageUtil.textMessageToXml(textMessage);
    
    			}
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return respMessage;
    	}
    }
    
     
  • 從第108行開始做事件處理,根據請求的事件型別,做出相應的反應。
  • 選單點選事件:

     單獨把選單點選事件拉出來詳細說說

     使用者點選自定義選單後,如果選單按鈕設定為click型別,則微信會把此次點選事件推送給開發者,注意view型別(跳轉到URL)的選單點選不會上報。

     引數說明:


  •  
  • 要注意的是 EventKey 這個引數,與選單建立的時候中的key值是對應的。

    寫出來的效果圖為:依次觸發的事件是

    關注,點選天氣預報選單,點選公交查詢選單


     
 

事件處理講到這裡就結束了,