`
tuposky
  • 浏览: 84569 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

微信公众平台开发教程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值是对应的。

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

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


     
 

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

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

微信公众号:andedaohang

或扫描二维码



 

我所有的博客都搬到csdn了,以后所有的博客都会在csdn上更新,

CSDN博客地址:http://blog.csdn.net/tuposky

     

  • 大小: 38.1 KB
  • 大小: 127.3 KB
分享到:
评论
1 楼 雨的印迹 2014-05-14  

相关推荐

    JAVA微信开发资料

    微信公众帐号开发教程第 14 篇-自定义菜单的创建及菜单事件响应..95 微信公众帐号开发教程第 15 篇-自定义菜单的 view 类型(访问网页).. 117 微信公众帐号开发教程第 16 篇-应用实例之历史上的今天.123 微信公众...

    微信公众帐号开发教程

    [038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应 - 柳峰的专栏 - 博客频道 - CSDN.NET [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天 - 柳峰的专栏 - 博客频道 - CSDN.NET [041] 微信...

    微信公众平台开发视频

    3. 微信公众平台开发之Struts2 (免费) 25:31 4. 微信公众平台开发之Spring MVC 27:12 5. 识别微信浏览器 24:40 6. 限制只允许微信浏览器访问 23:30 7. 一套程序服务多个账号---原始ID 17:46 8. 一套程序服务多个账号...

    微信公众账号开发教程

    经过这3个公众帐号的开发,对目前微信公众平台开放的api算是比较熟悉了,像文本消息、图文消息、音乐消息、语音消息、位置消息等全部用到过,菜单也使用过。所以,就有了写微信公众帐号开发教程的想法,将学习到的...

    微信公众平台开发视频教程,配套php代码(孟祥磊主讲)

    适合于初学者的微信公众平台开发视频教程,包括如何接入开发者模式,自定义菜单创建,多客服接入,自定义回复,还有天气查询实例教材等

    微信公众平台开发教程(含java代码)

    本文档对如何使用java进行公众号开发接入、消息与事件处理、自定义菜单处理等内容进行了代码示例。对于微信公众号开发的新手具有指导和借鉴意义。

    微信公众号开发教程 微信公众平台应用开发实践.zip

    微信公众平台应用开发实践教程.zip 1.php+html5+xml 第2章 微信公众平台API 第3章 第一个微信应用 第4章 带自定义菜单的微信应用 第5章 实战案例1 每日十幅图 第6章 实战案例2 人脸识别 第7章 实战案例3 游戏命运...

    微信服务号java版开发教程

    微信服务号Java版开发教程是针对使用Java语言进行微信服务号功能开发的全面指南。微信服务号是一个为企业和组织提供更强大的业务服务与用户管理能力的公众平台,它允许开发者通过API接口实现各种功能,例如自定义...

    手机微信公众平台开发视频教程

    微信公众平台开发视频教程全套API接口自定义微信菜单 百度网盘链接下载

    Java微信公众号开发 源码下载

    微信公众平台开发教程(java版本含代码),包含消息接收与发送、自定义菜单等。

    WeiXinMPSDK-NET4.0

    Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题 Senparc.Weixin.MP SDK 微信公众平台开发教程(八):...

    手把手教会你微信公众平台自定义菜单开发——创建菜单

    文档里面是详细教程和代码,不用什么基础都可以看懂,代码复制就可以用,立马解决你创建菜单的问题。这部分是微信公众账号自定义菜单的创建【完整的】。下一次教你高级进阶,内容在文档里底部。

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、CSDN等社区,CSDN博客专家,在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此...

    企业微信开发.net版[盛派微信SDK]

    微信公众平台SDK Senparc.Weixin for C#,支持.NET Framework及.NET Core。已支持微信公众号、小程序、小游戏、企业号、企业微信、开放平台、微信支付、JSSDK、微信周边等全平台。 WeChat SDK for C#. Senparc....

    微信公众号开发视频教程(附有配套php代码)

    网盘地址 微信公众平台开发视频教程,还附有相关配套php代码,api接口,自定义菜单,等等

    微信公众平台JavaSDKweixin-popular.zip

    简介: weixin-popular 包括微信公众平台基础API与支付API,提供便捷的API调用接口. ... 微信支付开发教程(商户平台版) 微信开放平台(公众号第三方平台开发) 标签:微信

    html+css仿微信底部自定义菜单

    1. **伪类**:利用`:hover`, `:active`, 和`:focus`等伪类,可以为菜单项添加鼠标悬停、点击和获得焦点时的样式变化。这增强了用户的交互体验,如: ```css .wechat-menu .menu-item:hover { background-color: #f...

Global site tag (gtag.js) - Google Analytics