您的位置:首页 > 移动开发 > 微信开发

微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)

2014-10-29 17:25 393 查看
前言:
事件处理是非常重要的,这一章讲讲常见的事件处理



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值是对应的。

写出来的效果图为:依次触发的事件是

关注,点击天气预报菜单,点击公交查询菜单






事件处理讲到这里就结束了,

大家可加我的微信公众号一起讨论

微信公众号:andedaohang

或扫描二维码







转载请注明出处:/article/3616551.html






大小: 38.1 KB




大小: 127.3 KB

查看图片附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: