Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

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

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

    延续上一篇的代码,我们继续为项目添加一个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<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {
 
        }
 
        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
            responseMessage.Content = "这条消息来自DefaultResponseMessage。";
            return responseMessage;
        }
    }
}

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

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

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

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

ResponseMessageText - 对应文本消息

ResponseMessageNews - 对应图文消息

ResponseMessageMusic - 对应音乐消息

ResponseMessageXXX - 其他类型以此类推

    关于上述所有类型参数的设置方法,可以看开源项目的Demo,这里不再重复:GitHub - JeffreySu/WeiXinMPSDK: 微信全平台 SDK Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 6.0、.NET 7.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.

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

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

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
    var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
    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<ResponseMessageText>();
        responseMessage.Content = "Hey!你已经被拉黑啦!";
 
        ResponseMessage = responseMessage;//设置返回对象
    }
}

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

  • 处理对话上下文

  CustomMessageHandler继承了类MessageHandler<CustomMessageContext>,其中的CustomMessageContext是一个我们自定义的上下文类,用于处理单个用户的对话状态。这一个功能我们会放到下一篇单独讲述:《Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题》。

系列教程索引

地址:Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引 - SZW - 博客园

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者
  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
  11. Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明
  12. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
  13. Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明
  14. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
  15. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密
  16. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
  17. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
  18. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公众平台开发教程(十九):MessageHandler 的未知类型消息处理
  20. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
  21. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
  22. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
您好!要使用Senparc.Weixin.AspNet写微信分享接口,需要按照以下步骤进行操作: 1. 安装Senparc.Weixin.AspNet 使用NuGet安装Senparc.Weixin.AspNet,可以在Visual Studio的NuGet包管理器中搜索并安装。 2. 配置微信公众号信息 在Web.config文件中配置微信公众号的AppId、AppSecret等信息,以便进行微信授权和分享。例如: ```xml <appSettings> <add key="WeixinAppId" value="your_appid" /> <add key="WeixinAppSecret" value="your_appsecret" /> <add key="WeixinToken" value="your_token" /> <add key="WeixinEncodingAESKey" value="your_encodingAESKey" /> </appSettings> ``` 3. 创建分享接口 创建一个Controller,并添加一个Action来处理分享请求,例如: ```csharp public class WeixinShareController : Controller { [HttpPost] public ActionResult Share(string url) { var jssdkUiPackage = JSSDKHelper.GetJsSdkUiPackage(WeixinConfig.WeixinAppId, WeixinConfig.WeixinAppSecret, url); return Json(jssdkUiPackage); } } ``` 在Action中,调用Senparc.Weixin.MP.Helpers.JSSDKHelper.GetJsSdkUiPackage方法获取JSSDK的UiPackage信息,并返回Json格式的结果。 4. 在前端页面中调用分享接口 在前端页面中,通过Ajax调用分享接口获取分享信息,例如: ```javascript $.post('/WeixinShare/Share', { url: location.href }, function (result) { wx.config({ debug: false, appId: result.appId, timestamp: result.timestamp, nonceStr: result.nonceStr, signature: result.signature, jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] }); wx.ready(function () { wx.onMenuShareTimeline({ title: '分享标题', link: location.href, imgUrl: '分享图片地址' }); wx.onMenuShareAppMessage({ title: '分享标题', desc: '分享描述', link: location.href, imgUrl: '分享图片地址' }); }); }); ``` 在页面加载完成后,通过Ajax调用分享接口获取分享信息,然后使用wx.config和wx.ready方法进行微信JSSDK的初始化和分享设置。 以上是使用Senparc.Weixin.AspNet写微信分享接口的基本流程,希望能对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值