『QQ:1353814576』

微信公众平台C#开发系列(十一):被动回复用户消息


如何对微信用户发送的消息进行回复消息

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

官方文档地址:

https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html#

1.写一个接收来自微信post的数据信息的方法 (本文演示项目是基于.NET 5 )

        /// <summary>
        /// 读取Post请求内容
        /// </summary>
        /// <param name="Request"></param>
        /// <returns></returns>
        string GetPostBody(HttpRequest Request)
        {
            using (var buffer = new MemoryStream())
            {
                this.Request.Body.CopyTo(buffer);
                buffer.Position = 0;
                var reader = new StreamReader(buffer, System.Text.UTF8Encoding.Default);
                return reader.ReadToEndAsync().Result;
            }
        }

2.使用WeiXinXmlMessage类解析公共消息部分(用于判断消息是什么类型的)

 string xml =  this.GetPostBody(Request);
Log4.WriteInfo($"微信请求消息内容:{xml}");
///用公共消息类解析
WeiXinXmlMessage WeiXinMessage = WeiXinXmlMessage.Load<WeiXinXmlMessage>(xml);

3.根据消息类型进行选择处理方法


                ///判断消息类型 选择对应处理的事件类
                switch (WeiXinMessage.MsgType)
                {
                    case WeiXinXmlMessage.MessageType.text:
                        //按文本消息解析 
                        TextMessageResponse text = WeiXinXmlMessage.Load<TextMessageResponse>(xml);

                        TextMessageRequest textRequest = new TextMessageRequest()
                        {
                            Content = text.Content,//原样文本返回
                            CreateTime = WeiXinMessage.CreateTime,
                            FromUserName = WeiXinMessage.ToUserName,
                            ToUserName = WeiXinMessage.FromUserName,
                            MsgType = WeiXinXmlMessage.MessageType.text
                        };
                        return Content(WeiXinXmlMessage.SerializeXml(textRequest));

                    case WeiXinXmlMessage.MessageType.image:
                        //按图片消息解析 
                        ImageMessageResponse image = WeiXinXmlMessage.Load<ImageMessageResponse>(xml);

                        ImageMessageRequest imageRequest = new ImageMessageRequest()
                        {
                            Image = new ImageMessageRequest.MediaImage() 
                            { 
                                MediaId=image.MediaId
                            },//原样图像返回
                            CreateTime = WeiXinMessage.CreateTime,
                            FromUserName = WeiXinMessage.ToUserName,
                            ToUserName = WeiXinMessage.FromUserName,
                            MsgType = WeiXinXmlMessage.MessageType.image
                        };
                        return Content(WeiXinXmlMessage.SerializeXml(imageRequest));
                   
                    case WeiXinXmlMessage.MessageType.video:
                        //按视频消息解析 
                        VideoMessageResponse video = WeiXinXmlMessage.Load<VideoMessageResponse>(xml);

                        VideoMessageRequest videoRequest = new VideoMessageRequest()
                        {
                            Video = new VideoMessageRequest.MediaVideo()
                            {
                                MediaId = video.MediaId,
                                Title="回复的视频标题",
                                Description="视频描述"
                            },
                            CreateTime = WeiXinMessage.CreateTime,
                            FromUserName = WeiXinMessage.ToUserName,
                            ToUserName = WeiXinMessage.FromUserName,
                            MsgType = WeiXinXmlMessage.MessageType.video
                        };
                        return Content(WeiXinXmlMessage.SerializeXml(videoRequest));
                       
                    case WeiXinXmlMessage.MessageType.voice:

                        //按语音消息解析 
                        VoiceMessageResponse voice = WeiXinXmlMessage.Load<VoiceMessageResponse>(xml);

                        VoiceMessageRequest voiceRequest = new VoiceMessageRequest()
                        {
                            Voice = new VoiceMessageRequest.MediaVoice()
                            {
                                MediaId = voice.MediaId,
                            },//原样返回
                            CreateTime = WeiXinMessage.CreateTime,
                            FromUserName = WeiXinMessage.ToUserName,
                            ToUserName = WeiXinMessage.FromUserName,
                            MsgType = WeiXinXmlMessage.MessageType.voice
                        };
                        return Content(WeiXinXmlMessage.SerializeXml(voiceRequest));
                   
                    case WeiXinXmlMessage.MessageType.location:

                        break;
                    case WeiXinXmlMessage.MessageType.link:

                        break;
                    case WeiXinXmlMessage.MessageType.@event:

                        break;
                }


//回复图文消息
ImageTextMessageRequest imageTextMessage = new ImageTextMessageRequest() ;
imageTextMessage.AddArticle( new ImageTextMessageRequest.ArticleItem());
imageTextMessage.AddArticle(new ImageTextMessageRequest.ArticleItem());
return Content(WeiXinXmlMessage.SerializeXml(imageTextMessage));

//回复音乐消息

MusicMessageRequest musicMessage = new MusicMessageRequest() ;
return Content(WeiXinXmlMessage.SerializeXml(musicMessage));


本文用到的消息实体类

    /// <summary>
    /// 文本消息
    /// </summary>
    public class TextMessageRequest : WeiXinXmlMessage
    {
        /// <summary>
        /// 文本消息内容
        /// </summary>
        public string Content { get; set; }

    }

    /// <summary>
    /// 回复图片消息
    /// </summary>
    public class ImageMessageRequest : WeiXinXmlMessage
    {

        public class MediaImage
        {
            /// <summary>
            /// 通过素材管理中的接口上传多媒体文件,得到的id。
            /// </summary>
            public string MediaId { get; set; }
        }
        /// <summary>
        /// 媒体图片
        /// </summary>
        public MediaImage Image { get; set; }
    }

    /// <summary>
    /// 语音消息
    /// </summary>
    public class VoiceMessageRequest : WeiXinXmlMessage
    {

        public class MediaVoice
        {
            /// <summary>
            /// 通过素材管理中的接口上传多媒体文件,得到的id
            /// </summary>
            public string MediaId { get; set; }
        }

        /// <summary>
        /// 语音媒体信息
        /// </summary>
        public MediaVoice Voice { get; set; }
    }

   /// <summary>
    /// 视频消息
    /// </summary>
    public class VideoMessageRequest : WeiXinXmlMessage
    {
        public class MediaVideo
        {
            /// <summary>
            /// 通过素材管理中的接口上传多媒体文件,得到的id
            /// </summary>
            public string MediaId { get; set; }

            /// <summary>
            /// 视频消息的标题
            /// </summary>
            public string Title { get; set; }

            /// <summary>
            /// 视频消息的描述
            /// </summary>
            public string Description { get; set; }
        }

        /// <summary>
        /// 视频媒体信息
        /// </summary>
        public MediaVideo Video { get; set; }
    }
/// <summary>
    /// 回复图文消息
    /// </summary>
    public class ImageTextMessageRequest : WeiXinXmlMessage
    {

        public ImageTextMessageRequest()
        {
            Articles = new Article();
        }

        public class ArticleItem
        {
            /// <summary>
            /// 图文消息标题
            /// </summary>
            public string Title { get; set; }

            /// <summary>
            /// 图文消息描述
            /// </summary>
            public string Description { get; set; }

            /// <summary>
            /// 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
            /// </summary>
            public string PicUrl { get; set; }

            /// <summary>
            /// 点击图文消息跳转链接
            /// </summary>
            public string Url { get; set; }
        }

        public class Article
        {
            public Article() {
                item = new List<ArticleItem>();
            }
            public List<ArticleItem> item { get; set; }
        }

        /// <summary>
        /// 图文消息个数;
        /// 当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息
        /// </summary>
        public int ArticleCount { get; set; }

        /// <summary>
        /// 图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数
        /// </summary>
        public Article Articles { get; private set; }

        /// <summary>
        /// 添加文章
        /// </summary>
        /// <param name="article"></param>
        public void AddArticle(ArticleItem article)
        {
            Articles.item.Add(article);
        }
    }
}



 /// <summary>
    /// 回复音乐消息
    /// </summary>
    public class MusicMessageRequest : WeiXinXmlMessage
    {

        public MusicMessageRequest()
        {
            this.MsgType = MessageType.music;
        }

        public class MediaMusic
        {
    
            /// <summary>
            /// 音乐标题
            /// </summary>
            public string Title { get; set; }

            /// <summary>
            /// 	音乐描述
            /// </summary>
            public string Description { get; set; }

            /// <summary>
            /// 音乐链接
            /// </summary>
            public string MusicUrl { get; set; }

            /// <summary>
            /// 高质量音乐链接,WIFI环境优先使用该链接播放音乐
            /// </summary>
            public string HQMusicUrl { get; set; }

            /// <summary>
            /// 缩略图的媒体id,通过素材管理中的接口上传多媒体文件,得到的id
            /// </summary>
            public string ThumbMediaId { get; set; }
        }
        /// <summary>
        /// 媒体
        /// </summary>
        public MediaMusic Music { get; set; }
    }