微信开发三 使用反射根据消息类型自动调用不同方法
来源:互联网 发布:淘宝美工怎么做 编辑:程序博客网 时间:2024/06/05 17:44
使用反射根据消息类型自动调用不同方法
微信只会向我们一个地方推送消息,如果全部逻辑都写到一起,代码会非常多,所以我们可以通过消息类型, 来实现不同的消息类型使用不同的处理方法,降低代码的耦合性
先定义一个用于处理请求的基类
/// <summary> /// 处理微信请求的基类 /// </summary> public class BaseProcess { //处理微信请求的虚方法 public virtual void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response) { } }
然后不同的处理方法都去实现这个基类
例如:处理事件请求的处理方法 (消息类型为event)
/// <summary> /// 处理用户点击的事件处理方法 /// </summary public class EventProcess : BaseProcess { public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response) { _response.Write("我是处理事件的请求方法"); _response.End(); } }
例如:处理用户发送的文本消息方法(消息类型为text)
/// <summary> /// 处理用户发送的文本消息方法 /// </summary> public class TextProcess : BaseProcess { public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response) { _response.Write("这是处理用户发送的文本信息"); _response.End(); } }
然后在入口点用反射处理下就行了
/// <summary> /// 处理微信的请求 /// </summary> public JsonResult Index() { try { //读取微信发送的xml数据 StreamReader reader = new StreamReader(Request.InputStream); string xmldata = reader.ReadToEnd(); XElement xl = XElement.Parse(xmldata); //取出消息类型 string MsgType = xl.Elements().Where(a => a.Name == "MsgType").FirstOrDefault().Value; //把微信推送的请求类型首字母转大写 MsgType = FirstToUpper(MsgType); //得到需要的类型 Type needtype = Type.GetType("MvcApplication1.Process." + MsgType + "Process"); //通过反射调用实例化对应的处理类 BaseProcess process = Activator.CreateInstance(needtype) as BaseProcess; //调用处理方法 process.Process(xl, Request, Response); return Json("请求成功"); } catch (Exception e) { //请求失败进行日志记录...略 return Json("请求失败"); } }
我们把用户点击的菜单事件真正实现以下
/// <summary> /// 处理用户点击的事件处理方法 /// </summary public class EventProcess : BaseProcess { public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response) { //取出消息类型 string MsgType = xl.Elements().Where(a => a.Name == "MsgType").FirstOrDefault().Value; string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value; string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value; //取出事件标识 string EventKey = xl.Elements().Where(a => a.Name == "EventKey").FirstOrDefault().Value; string Event = xl.Elements().Where(a => a.Name == "Event").FirstOrDefault().Value; //消息类型为空就没必要记录日志了 if (!string.IsNullOrEmpty(MsgType)) { AddLog(EventKey, MsgType, Event, ToUserName, FromUserName); } //用户推送的是一个事件请求 ReMsgModel rsm = new ReMsgModel(); rsm.MsgType = MsgType; rsm.Content = "用户点击了菜单按钮"; rsm.ToUserName = FromUserName; rsm.FromUserName = ToUserName; GetTextMesXml(_response, rsm); } }
效果如下
微信开发四 接受用户普通消息与回复消息
阅读全文
0 0
- 微信开发三 使用反射根据消息类型自动调用不同方法
- 微信开发三 使用反射根据消息类型自动调用不同方法
- Java反射 根据不同方法名动态调用不同的方法
- 微信消息自动回复开发
- 微信公众平台开发入门教程(三)消息类型讲解
- 从零开发微信公众号系列 【三】接收和自动回复消息
- 微信开发三: 消息管理
- 微信开发三 接收普通消息
- 微信开发后台处理消息时使用反射,去掉繁琐的if判断
- 微信企业号开发三:主动调用模式之发送news消息
- 根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
- XML:根据浏览器类型屏幕分辨率自动调用不同CSS的代码
- 根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
- js实现根据浏览器类型自动调用不同CSS文件[收藏]
- 根据判断PC浏览器类型和手机屏幕像素自动调用不同CSS的代码
- 根据判断PC浏览器类型和手机屏幕像素自动调用不同CSS
- 根据判断PC浏览器类型和手机屏幕像素自动调用不同CSS的代码
- 根据不同的数据库调用不同的DBHelper(反射机制)
- 使用 html5 svg 绘制图形
- Kotlin中的各种类
- 最长上升子序列&几何题解
- Java 集合ArrayList ,HashMap常用的循环方式
- Vscode-python
- 微信开发三 使用反射根据消息类型自动调用不同方法
- MySQL为表的指定字段添加数据
- 012. Spring Aspect Oriented Programming(AOP)
- 未找到导入的项目 .wpp.targets。请确认 <Import> 声明中的路径正确,且磁盘上存在该文件
- Unity 模拟鼠标自动点击事件
- CSS选择器之【伪类/元素选择器】
- 导线截面积和电流的关系
- Jquery,js 改进拼html的方式
- get和post模拟请求数据