博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
阅读量:6751 次
发布时间:2019-06-25

本文共 4998 字,大约阅读时间需要 16 分钟。

    上一篇《》我们讲述了如何使用Senparc.Weixin.MP SDK对接微信最基础的验证API,这一篇我们将具体讲一下这个SDK处理微信消息的核心:MessageHandler。

    有关MessageHandler的实现原理和说明,在中已经说得比较详细了,这里用代码演示一下。

 

    延续上一篇的代码,我们继续为项目添加一个CustomMessageHandle.cs类:

    CustomMessageHandle.cs需要继承Senparc.Weixin.MP.MessageHandlers<TC>这个抽象类,并实现部分方法。最初步的CustomMessageHandle.cs代码

可能如下:

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;using Senparc.Weixin.MP.Entities;using Senparc.Weixin.MP.MessageHandlers;namespace Senparc.Weixin.MP.Sample.Weixin{    public class CustomMessageHandler : MessageHandler
{ public CustomMessageHandler(Stream inputStream, PostModel postModel) : base(inputStream, postModel) { } public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { var responseMessage = base.CreateResponseMessage
(); //ResponseMessageText也可以是News等其他类型 responseMessage.Content = "这条消息来自DefaultResponseMessage。"; return responseMessage; } }}

  

    我们可以看到必须要重写实现的抽象方法名为DefaultResponseMessage(),这一条信息用于返回一条的消息,假如对应类型(如语音)的微信消息没有被代码处理,那么默认会返回这里的结果。

    在DefaultResponseMessage()方法中,我们看到这样一句:

var responseMessage = base.CreateResponseMessage
(); //ResponseMessageText也可以是News等其他类型

  这里的CreateResponseMessage<T>方法即创建一个返回对象,T可以为以下类型的任意一个,分别对应了不同的返回类型:

ResponseMessageText - 对应文本消息

ResponseMessageNews - 对应图文消息

ResponseMessageMusic - 对应音乐消息

ResponseMessageXXX - 其他类型以此类推

 

    关于上述所有类型参数的设置方法,可以看开源项目的Demo,这里不再重复:。

 

    那么我们如何处理用户发过来的文字信息呢?

    很简单——重写一个OnTextRequest方法即可:

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)        {            var responseMessage = base.CreateResponseMessage
(); responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName //这里的requestMessage.FromUserName也可以直接写成base.WeixinOpenId + "。\r\n您发送了文字信息:" + requestMessage.Content; //\r\n用于换行,requestMessage.Content即用户发过来的文字内容 return responseMessage; }

  这个方法中可以自由发挥,比如读取数据库、判断关键字,甚至返回不同的ResponseMessageXX类型(只要最终的类型都是在IResponseMessageBase接口下的即可)。

    与OnTextRequest对应,如果我们要处理语音、地理位置、菜单等类型的消息,只需要重写对应的方法,可以重写的方法如下:

 

public virtual IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage);        public virtual IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage);        public virtual IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage);        public virtual IResponseMessageBase OnTextRequest(RequestMessageText requestMessage);        public virtual IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage);        public virtual IResponseMessageBase OnVideoRequest(RequestMessageVideo requestMessage);        public virtual IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage);        public virtual IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage);        public virtual IResponseMessageBase OnEvent_EnterRequest(RequestMessageEvent_Enter requestMessage);        public virtual IResponseMessageBase OnEvent_LocationRequest(RequestMessageEvent_Location requestMessage);        public virtual IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage);        public virtual IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage);        public virtual IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)        public virtual IResponseMessageBase OneEvent_MassSendJobFinisRequest(RequestMessageEvent_MassSendJobFinish requestMessage)

 

    其中OnEvent_XX对应的都是Event请求的子类型。

    在CustomMessageHandler的基类设置的时候,我们看到使用了一个叫MessageContext的泛型(MessageHandler<MessageContext>),这个MessageContext是SDK提供的一个默认的消息上下文处理类,这个类已经能够处理最基础的情况,如果您的应用不是很复杂,那么直接用这个类就行了。如果项目比较复杂,您也可以根据自己的需要写一个自己的类(继承IMessageContext接口),或继承这个类在扩展一些更多的属性(例如工作流和分布式缓存等等)。

 

    至此我们已经使用MassageHandler处理所有微信用户发送过来的请求。

    下面介绍一些MassageHandler的“秘密武器”。

  • OnExecuting()和OnExecuted()

  我们可以直接重写这两个方法。其中OnExecuting会在所有消息处理方法(如OnTextRequest,OnVoiceRequest等)执行之前执行,这个过程中,我们可以把CancelExecute设为true,来中断后面所有方法的执行(包括OnExecuted),例如:

public override void OnExecuting()        {            if (RequestMessage.FromUserName == "olPjZjsXuQPJoV0HlruZkNzKc91E")            {                CancelExcute = true; //终止此用户的对话                            //如果没有下面的代码,用户不会收到任何回复,因为此时ResponseMessage为null                //添加一条固定回复                var responseMessage = CreateResponseMessage
(); responseMessage.Content = "Hey!你已经被拉黑啦!"; ResponseMessage = responseMessage;//设置返回对象 } }

  如果OnExecuting中没有中断,当例如OnTextRequest方法执行完毕之后(或执行了默认方法),OnExecuted()方法将会触发,我们也可以对应地重写。要注意的是,在OnExecuted()方法内,ResponseMessage已经被赋了返回值。

 

  • 处理对话上下文

  CustomMessageHandler继承了类MessageHandler<CustomMessageContext>,其中的CustomMessageContext是一个我们自定义的上下文类,用于处理单个用户的对话状态。这一个功能我们会放到下一篇单独讲述:《》。

 

系列教程索引

地址:

 

转载地址:http://zbvho.baihongyu.com/

你可能感兴趣的文章
Flink实时计算性能分析
查看>>
参加51CTO学院软考培训,我通过啦
查看>>
阿里云梁楹:这样的青春,别样的精彩
查看>>
Spring Boot 2.x基础教程:快速入门
查看>>
采购管理和信息(文档)和配置管理作业
查看>>
ios之coredata(二)
查看>>
第十三周项目2-成绩处理
查看>>
dede调用img图片
查看>>
Session中放错误提示JSP上获取
查看>>
Folding Views
查看>>
11 个让你吃惊的 Linux 终端命令
查看>>
基本磁盘、动态磁盘、GPT磁盘、MBR磁盘
查看>>
cookie注入&中转注入笔记
查看>>
生产环境linux服务器系统安全配置
查看>>
我的友情链接
查看>>
MySql中 delimiter 详解
查看>>
浏览器history操作实现一些功能
查看>>
你那么喜欢看”干货“,是因为你根本不想下功夫。
查看>>
20172303 2017-2018-2 《程序设计与数据结构》结对编程项目-四则运算 第二周
查看>>
LCM性质 + 组合数 - HDU 5407 CRB and Candies
查看>>