前言:

回顾上一节服务器配置的内容,我们已经可以自己完成公众号服务器的配置。配置完成之后,我们就可以通过调用的方式,完成对消息管理的处理。当用户关注公众号或者发送消息的时候,我们应该启用默认回复,要不然用户得不到回应,

从而导致丢失体验。所以这一章节,我们将通过消息管理的方式,对用户的信息进行处理,完成公众号消息回复功能,实现公众号与用户之间的完整对话。

了解:

微信公众平台对信息做了比较清晰的分类,最基本的包括请求(Request)和响应(Response)两大类信息,这两类信息有分为文字、语音、图片等格式。Senparc.Weixin.MP提供了MessageHandler消息处理类,这些类型在以枚举的方式区分,

同时根据严格命名规则命名了所有类型的RequestMessage和ResponseMessage。在Senparc里也详细说明了如何这个类的

开始:

第一步:

新建一个UserMessageHandler.cs,需要继承Senparc.Weixin.MP.MessageHandlers<TC>这个抽象类,并重写所有方法:

    public class UserMessageHandler : MessageHandler<UserMessageContext>{/// <summary>/// 构造函数/// </summary>/// <param name="inputStream">构造函数的inputStream用于接收来自微信服务器的请求流(如果需要在外部处理,这里也可以传入XDocument)</param>/// <param name="postModel">微信公众服务器Post过来的加密参数集合(不包括PostData)</param>public UserMessageHandler(Stream inputStream, PostModel postModel): base(inputStream, postModel){}public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage){/* 所有没有被处理的消息会默认返回这里的结果*/var responseMessage = this.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText也可以是News等其他类型responseMessage.Content = "这条消息来自DefaultResponseMessage。";return responseMessage;}}

using Senparc.Weixin.Context;
using Senparc.Weixin.MP.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace WeiXinHandler
{public class UserMessageContext: MessageContext<IRequestMessageBase, IResponseMessageBase>{public UserMessageContext(){/** 注意:即使使用其他类实现IMessageContext,* 也务必在这里进行下面的初始化,尤其是设置当前时间,* 这个时间关系到及时从缓存中移除过期的消息,节约内存使用*/base.MessageContextRemoved += UserMessageContext_MessageContextRemoved;}/// <summary>/// 当上下文过期,被移除时触发的时间/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void UserMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e){/* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)* 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除*/var messageContext = e.MessageContext as CustomMessageContext;if (messageContext == null){return;//如果是正常的调用,messageContext不会为null
            }//TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考//Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);//api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
        }}
}

重写的方法对应了接收不同的Request类型,构造函数的inputStream用于接收来自微信服务器的请求流

第二步:

基本用户不同类型的请求,比如用户向我们发送一条信息,那么会最终会调用OnTextRequest这个方法,所以在不同的重写方法内,实现自己的方法。

比如:我们对于文字(Text)信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnTextRequest:

        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage){var responseMessage = base.CreateResponseMessage<ResponseMessageText>();responseMessage.Content = "您刚刚发送了文字信息:" + requestMessage.Content;  //requestMessage.Content即用户发过来的文字内容return responseMessage;}

对于图片信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnImageRequest

        /// <summary>/// 处理图片请求/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage){var responseMessage = CreateResponseMessage<ResponseMessageNews>();responseMessage.Articles.Add(new Article(){Title = "您刚才发送了图片信息",Description = "您发送的图片将会显示在边上",PicUrl = requestMessage.PicUrl,Url = "https://www.cnblogs.com/i3yuan/"});return responseMessage;}

对于语音信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnVoiceRequest

        /// <summary>/// 处理语音请求/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage){//获取公众号AccessTokenResult account = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret);var responseMessage = CreateResponseMessage<ResponseMessageMusic>();//上传缩略图var uploadResult = Senparc.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(account.access_token, UploadMediaFileType.image,Server.GetMapPath("~/Images/Logo.jpg"));//设置音乐信息responseMessage.Music.Title = "天籁之音";responseMessage.Music.Description = "播放您上传的语音";responseMessage.Music.MusicUrl = "http://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;responseMessage.Music.HQMusicUrl = "http://sdk.weixin.senparc.com/Media/GetVoice?mediaId=" + requestMessage.MediaId;responseMessage.Music.ThumbMediaId = uploadResult.media_id;return responseMessage;}   

对于视频信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnVideoRequest

        /// <summary>/// 处理视频请求/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnVideoRequest(RequestMessageVideo requestMessage){var responseMessage = CreateResponseMessage<ResponseMessageText>();responseMessage.Content = "您发送了一条视频信息,ID:" + requestMessage.MediaId;return responseMessage;}

对于地理信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnLocationRequest

        /// <summary>/// 处理位置请求/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage){var locationService = new LocationService();var responseMessage = locationService.GetResponseMessage(requestMessage as RequestMessageLocation);return responseMessage;}

对于链接信息进行这样的处理,在UserMessageHandler中我们可以重写方法OnLinkRequest

        /// <summary>/// 处理链接消息请求/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage){var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);responseMessage.Content = string.Format(@"您发送了一条连接信息:Title:{0}Description:{1}Url:{2}", requestMessage.Title, requestMessage.Description, requestMessage.Url);return responseMessage;}

第三步:

在Action中使用MessageHandler,返回对用户的处理,在上一节中我们已经新建了WXController.cs,在其中通过Post的方式处理用户的请求

        [HttpPost][ActionName("Index")]public Task<ActionResult> Post(PostModel postModel){return Task.Factory.StartNew<ActionResult>(() =>{if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)){return new WeixinResult("参数错误!");}var messageHandler = new UserMessageHandler(Request.InputStream);messageHandler.Execute(); //执行微信处理过程return new FixWeixinBugWeixinResult(messageHandler);}).ContinueWith<ActionResult>(task => task.Result);}}

messageHandler.Execute();用于执行整个信息处理过程,其中会调用重写的OnxxRequest方法

效果:

测试发送文本

通过测试公众号,我们可以发现,当我们发送文本的时候,系统会对用户的信息进行处理,完成公众号消息回复功能,实现公众号与用户之间的完整对话。

测试发送图文消息

        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage){var responseMessage = CreateResponseMessage<ResponseMessageNews>();responseMessage.Articles.Add(new Article(){Title = "灌篮高手",Description = "灌篮高手",PicUrl = "http://images.cnblogs.com/cnblogs_com/i3yuan/1462639/o_timg%20(1).jpg",Url = "https://www.cnblogs.com/i3yuan/"});return responseMessage;}

总结:

1.通过MessageHandler的简单处理,我们就可以进行对用户文本消息的处理,完成公众号与用户的会话

2.发送不同的消息,处理不同的回复,实现更多类型的消息回复

3.参考了如何使用MessageHandler简化消息处理流程

转载于:https://www.cnblogs.com/i3yuan/p/10850169.html

微信公众号开发:消息处理相关推荐

  1. 微信公众号开发 (2) 消息处理

    一.前言 微信公众号开发 (1) 微信接入认证成为开发者 本文将实现 接收消息 回复消息 二.消息接收 消息接收POST和微信认证GET是同一个接口(开发者填写的URL) @Slf4j @RestCo ...

  2. 实例:用C#.NET手把手教你做微信公众号开发(2)--普通消息处理之文本

    上一篇文章我们完成了自己的web服务器与微信公众号服务器的对接,本篇开始处理微信用户和服务器之间的互动交流.一个用户与公众号之间,无外乎用户向公众号发送信息.点击公众号里的菜单和链接,或者公众号向用户 ...

  3. C#微信公众号开发系列教程二(新手接入指南)

    此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...

  4. 微信公众号自动回复html,[.NET] 简单接入微信公众号开发:实现自动回复

    简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定 ...

  5. 手把手教你如何微信公众号开发

    最近的话,发现微信开发其实也有很多挺有意思的地方,比如最近很火的一款游戏"跳一跳",也让我如此着迷..但是,今天我所要讲的并不是对于小程序的开发,而是要说一下,关于微信开发的另外一 ...

  6. 微信公众号开发 - 事件处理和回复消息

    微信公众号开发文章目录 1.微信公众号开发 - 环境搭建 2.微信公众号开发 - 配置表设计以及接入公众号接口开发 3.微信公众号开发 - token获取(保证同一时间段内只请求一次) 4.微信公众号 ...

  7. 微信公众号开发-----实现模板、图文、文本、音乐、图片推送

    本篇文章实现模板.图文.文本.音乐.图片推送,前提是已经搭建了微信开发环境.读完本文后,实现的主要效果如下 在测试账号中配置模板 登录测试公众号/正式公众号(认证后的服务号),测试公众号:模板消息接口 ...

  8. 微信公众号开发 (3) 菜单处理

    一.前言 微信公众号开发 (1) 微信接入认证成为开发者 微信公众号开发 (2) 消息处理 本文将实现 根据AppID和AppSecret获取access_token 自定义菜单(创建菜单.查询菜单. ...

  9. 实例:用C#.NET手把手教你做微信公众号开发(4)--获取普通access_token、jsapi的方法;用MediaId获取微信服务器图片

    一.access_token概念 这里在后续几篇处理不同的普通消息文章前插播一个适用于整个微信公众号开发的公共类QinMingWeixinContainer,用于获取普通access_token和js ...

  10. 如何接入微信公众号开发?底层原理是什么?

    要接入微信公众号开发,您需要完成以下几个步骤: 注册微信公众平台账号:首先,您需要在微信公众平台上注册一个账号,并创建一个公众号.在注册过程中,您需要提供相关的身份信息和认证材料,以便微信审核和认证您 ...

最新文章

  1. 捷报!又一名HIV感染者被治愈,干细胞移植再次立功
  2. Python中os与sys两模块的区别
  3. 隐马尔科夫模型-EM模型-混合理解
  4. Linux下FTP服务器配置与管理
  5. 2019.08 me
  6. GOF23种设计模式在Java中的应用(part 1)
  7. 【MATLAB】进阶绘图 ( MATLAB 颜色值 | 条形图示例 | 查找对象属性方法 | 修改条形图属性 )
  8. 集成电路总设计(Ⅴ)
  9. 阿里巴巴建议的线程池创建方式,你用上了吗?
  10. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字...
  11. 计算机与音乐整合的教学设计,小学音乐课程整合研究《郊游》优秀教学设计
  12. 如何利用wordpress搭建一个免费博客
  13. MacOS查看DNS服务器地址
  14. win10系统优化---持续整理中
  15. html 按钮位于div底部,css按钮定位在div底部
  16. 计算机比赛学校推荐意见,最新学校推荐意见
  17. java阳历转换成阴历
  18. 关于测绘专业软件时的一些感悟
  19. ng-tv-focusable
  20. Python 基于 Prometheus 数据生成巡检报告

热门文章

  1. Nissi商城序章(一):项目概述及架构
  2. jQuery常用语法笔记
  3. 第四天:使用 session cookie redis完善登录验证及登录路由
  4. CSS五种定位(相对定位、绝对定位、固定定位、static定位、sticky 定位)模式学习笔记
  5. 2020全国计算机二级office大纲,2018-2020年(最新)全国计算机等级考试二级MS Office高级应用考试大纲...
  6. LINUX下载编译wabt(反编译wasm)
  7. apt install:文件尺寸不符(25294 != 25412)。您使用的镜像正在同步中?
  8. 和尚感谢你,要避开,这样才能求到福
  9. 想买个这样的笔记本电脑
  10. Unknown run configuration type AndroidRunConfigurationType的解决办法