美文网首页
5 MessageHandler:简化消息处理流程(上)

5 MessageHandler:简化消息处理流程(上)

作者: mspeer | 来源:发表于2018-10-04 21:39 被阅读20次

通过对MessageHandler的深入学习,熟练掌握微信消息通讯的所有关键技能。

微信通讯流程

温故而知新,前文有。
我们需要开发的部分,正是第3部分“处理消息”

image.png

SDK已经对XML进行了封装,并且开发过程是面向对象的,所以大家不需要接触任何和XML有关的开发技能,只需要简单调用即可,就可以完成整个开发过程。

开发过程

  1. 创建项目,Asp.net MVC解决方案 > “Asp.net Web应用程序”

  2. 添加上下文处理文件(MessageContext)
    “每个用户类似Session的功能”
    A. 创建一个“Senparc.Service”类库(放可以共用的逻辑),第1步Web项目引用这个类库项目。
    B. 创建一个类“CustomMessageContext.cs”
    必须先引用Senparc.Weixin.Mp的Nuget包。
    代码从如下文件拷贝。
    “WeiXinMPSDK/Samples/Senparc.Weixin.MP.Sample/Senparc.Weixin.MP.Sample.CommonService/MessageHandlers/CustomMessageHandler/CustomMessageContext.cs”

     1. 导航到要添加NuGet软件包的项目
    
    $ cd LuckyMoney.Service/
    
     2. 执行添加操作
    
    $ dotnet add package Senparc.Weixin.MP
    

    C. 创建一个类“CustomMessageHandler”。
    实现默认构造函数,其中有一个函数是“默认返回的请求”。

  3. 创建Controller和Action。

    1. 创建“WeixinController”,继承自“Controller”,增加一个如下的Action。运行测试。
        public ActionResult Index()
        {
            return Content("Weixin/Index");
        }
2. 添加appsettings.json配置
"SenparcWeixinSetting": {
    "Token": "XXX",
    "EncodingAESKey": "XXX",
    "WeixinAppId": "XXX",
    "WeixinAppSecret": "XXX"
  }
3. 控制器中添加Action
public static readonly string Token = Config.SenparcWeixinSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
        

        /// <summary>
        /// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://sdk.weixin.senparc.com/weixin
        /// </summary>
        [HttpGet]
        [ActionName("Index")]
        public ActionResult Get(PostModel postModel, string echostr)
        {
            if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return Content(echostr); //返回随机字符串则表示验证通过
            }
            else
            {
                return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
                    "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
            }
        }

发布测试

发布到服务器进行测试:
测试号地址:

dotnet publish -o path

不同请求消息处理

就是在MessageHandler中override不同的方法,
例如OnEvent_LocationRequest()菜单事件,OnLocationRequest()文字信息发送地址。
1.只需要三行,就可以返回最基础的消息

        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(PostModel postModel)
        {
        // 创建MessageHandler实例
        var messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel);
        // InputStream
        
        // 执行
        messageHandler.Execute();
        // 返回
        return Content(messageHandler.FinalResponseDocument.ToString());
        }
  1. 完善MessageHandler
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = $"这条消息来自DefaultResponseMessage。当前服务器时间:{DateTime.Now}";
return responseMessage;

问题处理

无法获取配置值

如下代码,无法获取配置值,原因有3。

public static readonly string Token = Config.SenparcWeixinSetting.Token;

1.版本问题导致失败
2.没有在startup.cs中进行注入
3.配置文件信息不全

不同请求消息处理

例如菜单消息的处理,需要重载如下方法。
'''
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
'''

不同响应消息处理

同上,例如想返回图文消息。
'''
var responseMessage = CreateResponseMessage<ResponseMessageNews>(); // 返回多图文
'''
在“Demo > 菜单 > 输入appID和appSecret > 获取AccessToken > 获取当前菜单”中查看菜单

在MessageHandler中“requestMessage.EventKey”就可以获取菜单信息

不返回任何消息

在MessageHandler中如下两条语句都可行,但是空字符串是不行的。
同时,为防止出错,还得添加Senparc.Weixin.MVC Nuget包。

//return null;
return new ResponseMessageNoResponse();

相关文章

网友评论

      本文标题:5 MessageHandler:简化消息处理流程(上)

      本文链接:https://www.haomeiwen.com/subject/pfjinftx.html