热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#微信公众号开发之消息处理

这篇文章介绍了C#微信公众号开发之消息处理,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言:

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

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

了解:

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

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

开始:

第一步:

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

    public class UserMessageHandler : MessageHandler
    {
        /// 
        /// 构造函数
        /// 
        /// 构造函数的inputStream用于接收来自微信服务器的请求流(如果需要在外部处理,这里也可以传入XDocument)
        /// 微信公众服务器Post过来的加密参数集合(不包括PostData)
        public UserMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {
           
        }
        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            /* 所有没有被处理的消息会默认返回这里的结果
            */
            var respOnseMessage= this.CreateResponseMessage();//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
    {
        public UserMessageContext()
        {
            /*
            * 注意:即使使用其他类实现IMessageContext,
            * 也务必在这里进行下面的初始化,尤其是设置当前时间,
            * 这个时间关系到及时从缓存中移除过期的消息,节约内存使用
            */
            base.MessageContextRemoved += UserMessageContext_MessageContextRemoved;
        }

        /// 
        /// 当上下文过期,被移除时触发的时间
        /// 
        /// 
        /// 
        void UserMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs 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();
            responseMessage.COntent= "您刚刚发送了文字信息:" + requestMessage.Content;  //requestMessage.Content即用户发过来的文字内容
            return responseMessage;
        }

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

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

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

        /// 
        /// 处理语音请求
        /// 
        /// 
        /// 
        public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
        {

            //获取公众号
            AccessTokenResult account = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret);

            var respOnseMessage= CreateResponseMessage();
            //上传缩略图
            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

        /// 
        /// 处理视频请求
        /// 
        /// 
        /// 
        public override IResponseMessageBase OnVideoRequest(RequestMessageVideo requestMessage)
        {
            var respOnseMessage= CreateResponseMessage();
            responseMessage.COntent= "您发送了一条视频信息,ID:" + requestMessage.MediaId;
            return responseMessage;
        }

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

        /// 
        /// 处理位置请求
        /// 
        /// 
        /// 
        public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage)
        {
            var locatiOnService= new LocationService();
            var respOnseMessage= locationService.GetResponseMessage(requestMessage as RequestMessageLocation);
            return responseMessage;
        }

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

        /// 
        /// 处理链接消息请求
        /// 
        /// 
        /// 
        public override IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage)
        {
            var respOnseMessage= ResponseMessageBase.CreateFromRequestMessage(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 Post(PostModel postModel)
        {
            return Task.Factory.StartNew(() =>
            {
                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(task => task.Result);
        }

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

效果:

测试发送文本

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

测试发送图文消息

        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var respOnseMessage= CreateResponseMessage();
            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简化消息处理流程

到此这篇关于C#微信公众号开发之消息处理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
author-avatar
加勒比海盗530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有