.net core完成微信公众号的消息接收和请求处理

来源:互联网 发布:windows电脑装mac系统 编辑:程序博客网 时间:2024/06/08 02:18

上一篇完成了.net core 搭建微信公众号的基础设施搭建,下面开始做请求处理和响应

原理:

首先看这个图:


用户在给公众号号发送请求获得响应时,需要经历两个服务器,第一个是微信服务器,还有一个就是我们自己创建的项目服务器,而在整个过程中,微信服务器实际上就是一个桥梁,获取用户的消息给我们创建的项目服务器,再把项目服务器处理的逻辑结果(消息)传递给用户。因此,我们最基础也是最必须的,就是学会如何处理request 和response.

所以重要的就是接收消息处理响应


1.在我们创建的controller中添加post方法,上一步上创建的get方法只用于token的验证,现在我们做的post方法才是我们最终使用的。

这里要注意一下,在.net core中处理request的输入流的方式:

var memoryStream = new MemoryStream();
Request.Body.CopyTo(memoryStream);

 /// <summary>        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。        /// PS:此方法为简化方法,效果与OldPost一致。        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。        /// </summary>        [HttpPost]        [ActionName("Index")]        public ActionResult Post(PostModel postModel)        {            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))            {                return Content("参数错误!");            }            postModel.Token = Token;//根据自己后台的设置保持一致            postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致            postModel.AppId = AppId;//根据自己后台的设置保持一致            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。            //获取request的响应            var memoryStream = new MemoryStream();            Request.Body.CopyTo(memoryStream);            var messageHandler = new CustomMessageHandler(memoryStream, postModel);//接收消息            messageHandler.Execute();//执行微信处理过程            return new FixWeixinBugWeixinResult(messageHandler);//返回结果、、                    }

其中,CustomMessageHandler是我们自己创建的一个类,用于对接收到的消息进行逻辑处理。

这个类继承了Senparc.Weixin.MP.MessageHandlers<TC>这个抽象类,

注意DefaultResponseMessage必须重写,用于返回没有处理过的消息类型(也可以用于默认消息,如帮助信息等);其中所有原OnXX的抽象方法已经都改为虚方法,可以不必每个都重写。若不重写,默认返回DefaultResponseMessage方法中的结果。

否则CustomMessageHandler这个类就会报错:

CustomMessageHandler不实现继承的抽象成员 MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>


所以正确的代码如下:

using System.Collections.Generic;using System.IO;using Senparc.Weixin.MP.Entities;using Senparc.Weixin.MP.Entities.Request;using Senparc.Weixin.MP.MessageHandlers;using Senparc.Weixin.Context;namespace WechatTest.Services{    public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>    {        public CustomMessageHandler(Stream inputStream, PostModel postModel):base (inputStream, postModel)        {        }        public CustomMessageHandler(RequestMessageBase requestMessage):base(requestMessage)        {        }        public override IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage)        {            return base.OnEventRequest(requestMessage);        }        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)        {            var responseMessage = this.CreateResponseMessage<ResponseMessageText>();            responseMessage.Content = "这条消息来自于DefaultResponseMessage";            return responseMessage;        }        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)        {            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();            //responseMessage.Content = "您的OpenID是:" + responseMessage.FromUserName+".\r\n您发送的文字是:"+requestMessage.Content;            if (requestMessage.Content == "ID")                responseMessage.Content = "您的OpenID是:" + responseMessage.FromUserName;            if (requestMessage.Content == "天气")                responseMessage.Content = "抱歉,还未开通此功能!";            return responseMessage;        }    }}


其中OnTextRequest是对接收到的文字的处理方法,我们在这做了判断,在用户发送给公众号各种文字时,能够对用户做出不同的响应


最基础的。好好学习,天天向上,加油吧


阅读全文
0 0
原创粉丝点击