微信公众平台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; }
}