不想听我扯皮的,直接看官方:
微信官方的文档 :
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

开发前说明:
我们需要用到 StreamReader

所以需要引用:using System.IO;

现在正式讲开发

上面讲了一些微信给我们的规则

我们现在要用这些规则获取我们想要的东西。

第一步:获取那串 XML 这个是最重要的,因为没这个XML,我们就相当于啥都没有。(我们的信息来源就是这个XML)

这里我使用 StreamReader 来获取 Request.Body

因为XML主要是 Request.Body 里面的

//声明一个XML方便调用
string xml="";
//获取我们的流
var reader = new StreamReader(Request.Body);
//把流里面的读取出来,就是我们这串XML了。
var contentFromBody = reader.ReadToEnd();
//再保存进我们的这个字符串里,方便后期使用
xml = contentFromBody;

我们读取XML中的信息,并将其转成我们的微信信息对象。

这里呢。我借用了一位大佬的代码:

专门处理微信消息的几个类

第一个类:
MessageFromWeiXin:

using System.Collections.Generic;
namespace 命名空间(各位懂的)
{/// <summary>///     来自微信的消息请求:基类/// </summary>public class MessageFromWeiXin{/// <summary>///     开发者微信号:接收到消息的公众号帐号/// </summary>public string ToUserName { get; set; }/// <summary>///     发送方帐号(一个OpenID,引起这条消息的微信用户)/// </summary>public string FromUserName { get; set; }/// <summary>///     消息创建时间 (整型)/// </summary>public long CreateTime { get; set; }/// <summary>///     消息id,64位整型/// </summary>public long MsgId { get; set; }/// <summary>///     消息类型/// </summary>public MessageFromWeiXinType MsgType { get; set; }}#region 普通消息/// <summary>///     来自微信的【文本】消息请求/// </summary>public class TextMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     文本消息内容/// </summary>public string Content { get; set; }}/// <summary>///     来自微信的【图片】消息请求/// </summary>public class ImageMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     图片链接(由系统生成)/// </summary>public string PicUrl { get; set; }/// <summary>///     图片消息媒体id,可以调用多媒体文件下载接口拉取数据。/// </summary>public string MediaId { get; set; }}/// <summary>///     来自微信的【语音】消息请求/// </summary>public class VoiceMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体/// </summary>public string MediaId { get; set; }/// <summary>///     语音格式:amr/// </summary>public string Format { get; set; }/// <summary>///     语音识别结果,UTF8编码(需要开通此服务)/// </summary>public string Recognition { get; set; }}/// <summary>///     来自微信的【文本】消息请求/// </summary>public class VideoMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     视频消息媒体id,可以调用多媒体文件下载接口拉取数据。/// </summary>public string MediaId { get; set; }/// <summary>///     视频消息缩略图的媒体id,可以调用/// </summary>public string ThumbMediaId { get; set; }}/// <summary>///     来自微信的【小视频】消息请求/// </summary>public class ShortVideoMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     视频消息媒体id,可以调用多媒体文件下载接口拉取数据。/// </summary>public string MediaId { get; set; }/// <summary>///     视频消息缩略图的媒体id,可以调用/// </summary>public string ThumbMediaId { get; set; }}/// <summary>///     来自微信的【位置】消息请求/// </summary>public class LocationMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     地理位置维度【纬度】/// </summary>public float Location_X { get; set; }/// <summary>///     地理位置经度/// </summary>public float Location_Y { get; set; }/// <summary>///     地图缩放大小/// </summary>public int Scale { get; set; }/// <summary>///     地理位置信息/// </summary>public string Label { get; set; }}/// <summary>///     来自微信的【位置】消息请求/// </summary>public class LinkMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     消息标题/// </summary>public string Title { get; set; }/// <summary>///     消息描述/// </summary>public string Description { get; set; }/// <summary>///     消息链接/// </summary>public string Url { get; set; }}#endregion#region 事件消息/// <summary>///     基本的事件消息:关注,取消关注事件/// </summary>public class EventMessageFromWeiXin : MessageFromWeiXin{/// <summary>///     事件类型/// </summary>public EventMessageFromWeiXinType Event { get; set; }}/// <summary>///     用户扫码事件:已关注用户事件类型为 SCAN,未关注的用户类型为 subscribe/// </summary>public class SanEventMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id,但这里作为字符串/// </summary>public string EventKey { get; set; }/// <summary>///     二维码的ticket,可用来换取二维码图片/// </summary>public string Ticket { get; set; }}/// <summary>///     上报地理位置事件/// </summary>public class LocationEventMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     地理位置纬度/// </summary>public float Latitude { get; set; }/// <summary>///     地理位置经度/// </summary>public float Longitude { get; set; }/// <summary>///     地理位置精度/// </summary>public float Precision { get; set; }}/// <summary>///     点击菜单拉取消息事件/// </summary>public class ClickEventMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     事件KEY值,与自定义菜单接口中KEY值对应/// </summary>public string EventKey { get; set; }}/// <summary>///     点击菜单跳转链接事件/// </summary>public class ViewEventMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     事件KEY值,设置的跳转URL/// </summary>public string EventKey { get; set; }}/// <summary>///     群发消息完成事件/// </summary>public class MassSendJobFinishMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     状态/// </summary>public string Status { get; set; }/// <summary>///     标签粉丝数,或OpenId列表中粉丝数/// </summary>public int TotalCount { get; set; }/// <summary>///     过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount = SentCount + ErrorCount/// </summary>public int FilterCount { get; set; }/// <summary>///     发送成功的粉丝数/// </summary>public int SentCount { get; set; }/// <summary>///     发送失败的粉丝数/// </summary>public int ErrorCount { get; set; }/// <summary>///     原创校验结果/// </summary>public CopyrightCheckResult CopyrightCheckResult { get; set; }}/// <summary>///     原创校验结果/// </summary>public class CopyrightCheckResult{/// <summary>///     图文个数/// </summary>public int Count { get; set; }/// <summary>///     各个单图文校验结果/// </summary>public List<CopyrightCheckItem> ResultList { get; set; }/// <summary>///     1-未被判为转载,可以群发,2-被判为转载,可以群发,3-被判为转载,不能群发/// </summary>public int CheckState { get; set; }}/// <summary>///     单图文原创校验结果/// </summary>public class CopyrightCheckItem{/// <summary>///     群发文章的序号,从1开始/// </summary>public int ArticleIdx { get; set; }/// <summary>///     用户声明文章的状态/// </summary>public int UserDeclareState { get; set; }/// <summary>///     系统校验的状态/// </summary>public int AuditState { get; set; }/// <summary>///     相似原创文的url/// </summary>public string OriginalArticleUrl { get; set; }/// <summary>///     相似原创文的类型/// </summary>public int OriginalArticleType { get; set; }/// <summary>///     是否能转载/// </summary>public int CanReprint { get; set; }/// <summary>///     是否需要替换成原创文内容/// </summary>public int NeedReplaceContent { get; set; }/// <summary>///     否需要注明转载来源/// </summary>public int NeedShowReprintSource { get; set; }}/// <summary>///     模版消息发送完成事件/// </summary>public class TEMPLATESENDJOBFINISHMessageFromWeiXin : EventMessageFromWeiXin{/// <summary>///     状态:success 成功;failed:user block 用户拒绝;failed: system failed 非用户拒绝/// </summary>public string Status { get; set; }}#endregion/// <summary>///     微信服务器推送过来的消息类型/// </summary>public enum MessageFromWeiXinType{/// <summary>///     未知/// </summary>unknown = 1,/// <summary>///     文本消息/// </summary>text = 2,/// <summary>///     图片消息/// </summary>image = 3,/// <summary>///     语音消息/// </summary>voice = 4,/// <summary>///     视频消息/// </summary>video = 5,/// <summary>///     小视频消息/// </summary>shortvideo = 6,/// <summary>///     地里位置消息/// </summary>location = 7,/// <summary>///     连接消息/// </summary>link = 8,/// <summary>///     事件推送消息/// </summary>@event = 9}/// <summary>///     微信服务器推送过来的【事件】消息的子类型/// </summary>public enum EventMessageFromWeiXinType{/// <summary>///     未知/// </summary>unknown = 1,/// <summary>///     订阅事件;未关注用户扫码关注也是这个类型,但数据结构与SCAN类型相同,此时相当于两个类型的合并/// </summary>subscribe = 2,/// <summary>///     取消订阅事件/// </summary>unsubscribe = 3,/// <summary>///     扫描带参数二维码事件/// </summary>SCAN = 4,/// <summary>///     上报地理位置事件/// </summary>LOCATION = 5,/// <summary>///     点击自定义菜单拉取消息事件/// </summary>CLICK = 6,/// <summary>///     点击自定义菜单跳转链接事件/// </summary>VIEW = 7,/// <summary>///     群发消息发送结束事件/// </summary>MASSSENDJOBFINISH = 8,/// <summary>///     模板消息发送结束事件/// </summary>TEMPLATESENDJOBFINISH = 9}
}

第二个类:

ResponseClient:

using System.Xml;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Xml;namespace 命名空间(各位懂的)
{/// <summary>///     XML消息识别/// </summary>public static class ResponseClient{/// <summary>///     判断消息类型/// </summary>public static MessageFromWeiXinType GetMsgType(string msg){var xmlDocument = new XmlDocument();xmlDocument.LoadXml(msg);if (TryGetFirstTagText(ref xmlDocument, "MsgType", out var txt) &&Enum.TryParse(txt, out MessageFromWeiXinType Type)) return Type;return MessageFromWeiXinType.unknown;}/// <summary>///     XML转消息对象/// </summary>public static MessageFromWeiXin XmlToMessageFromWeiXin(string xml){xml = xml.Replace("< !", "<!").Replace("] ]","]]");var xmlDocument = new XmlDocument();xmlDocument.LoadXml(xml);var txt = string.Empty;var @int = 0;if (TryGetFirstTagText(ref xmlDocument, "MsgType", out txt) &&Enum.TryParse(txt, out MessageFromWeiXinType messageType)){MessageFromWeiXin msg = null;switch (messageType){case MessageFromWeiXinType.text: //文本消息msg = new TextMessageFromWeiXin{MsgType = MessageFromWeiXinType.text,Content = TryGetFirstTagText(ref xmlDocument, "Content", out txt) ? txt : ""};break;case MessageFromWeiXinType.image: //图片消息msg = new ImageMessageFromWeiXin{MsgType = MessageFromWeiXinType.image,MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",PicUrl = TryGetFirstTagText(ref xmlDocument, "PicUrl", out txt) ? txt : ""};break;case MessageFromWeiXinType.voice: //语音消息msg = new VoiceMessageFromWeiXin{MsgType = MessageFromWeiXinType.voice,MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",Recognition = TryGetFirstTagText(ref xmlDocument, "Recognition", out txt) ? txt : "",Format = TryGetFirstTagText(ref xmlDocument, "Format", out txt) ? txt : ""};break;case MessageFromWeiXinType.video: //视频消息msg = new VideoMessageFromWeiXin{MsgType = MessageFromWeiXinType.video,MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",ThumbMediaId = TryGetFirstTagText(ref xmlDocument, "ThumbMediaId", out txt) ? txt : ""};break;case MessageFromWeiXinType.shortvideo: //小视频消息msg = new ShortVideoMessageFromWeiXin{MsgType = MessageFromWeiXinType.shortvideo,MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",ThumbMediaId = TryGetFirstTagText(ref xmlDocument, "ThumbMediaId", out txt) ? txt : ""};break;case MessageFromWeiXinType.link: //链接消息msg = new LinkMessageFromWeiXin{MsgType = MessageFromWeiXinType.link,Description = TryGetFirstTagText(ref xmlDocument, "Description", out txt) ? txt : "",Title = TryGetFirstTagText(ref xmlDocument, "Title", out txt) ? txt : "",Url = TryGetFirstTagText(ref xmlDocument, "Url", out txt) ? txt : ""};break;case MessageFromWeiXinType.location: //位置消息msg = new LocationMessageFromWeiXin{MsgType = MessageFromWeiXinType.location,Label = TryGetFirstTagText(ref xmlDocument, "Label", out txt) ? txt : "",Location_X =TryGetFirstTagText(ref xmlDocument, "Location_X", out txt) ? Convert.ToSingle(txt) : 0,Location_Y =TryGetFirstTagText(ref xmlDocument, "Location_Y", out txt) ? Convert.ToSingle(txt) : 0,Scale = TryGetFirstTagText(ref xmlDocument, "Scale", out txt) ? Convert.ToInt32(txt) : 0};break;case MessageFromWeiXinType.@event: //事件消息if (TryGetFirstTagText(ref xmlDocument, "Event", out txt)){var Event = Enum.TryParse(txt, out EventMessageFromWeiXinType eventMessageFromWeiXinType)? eventMessageFromWeiXinType: EventMessageFromWeiXinType.unknown;switch (Event){case EventMessageFromWeiXinType.subscribe: //关注事件msg = new EventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.subscribe};break;case EventMessageFromWeiXinType.unsubscribe: //取消关注事件msg = new EventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.unsubscribe};break;case EventMessageFromWeiXinType.SCAN: //扫码msg = new SanEventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.SCAN,EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : "",Ticket = TryGetFirstTagText(ref xmlDocument, "Ticket", out txt) ? txt : ""};break;case EventMessageFromWeiXinType.CLICK: //点击自定义菜单等待消息响应msg = new ClickEventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.CLICK,EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : ""};break;case EventMessageFromWeiXinType.VIEW: //点击自定义菜单跳转到页面msg = new ViewEventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.VIEW,EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : ""};break;case EventMessageFromWeiXinType.LOCATION: //授权取得位置事件msg = new LocationEventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.LOCATION,Latitude = TryGetFirstTagText(ref xmlDocument, "Latitude", out txt)? Convert.ToSingle(txt): 0,Longitude = TryGetFirstTagText(ref xmlDocument, "Longitude", out txt)? Convert.ToSingle(txt): 0,Precision = TryGetFirstTagText(ref xmlDocument, "Precision", out txt)? Convert.ToSingle(txt): 0};break;case EventMessageFromWeiXinType.MASSSENDJOBFINISH: //群发消息发送完成事件var items = xmlDocument.GetElementsByTagName("item");var itemsList = new List<CopyrightCheckItem>();foreach (XmlNode i in items){var item = new CopyrightCheckItem();foreach (XmlNode j in i.ChildNodes)switch (j.Name){case "ArticleIdx":item.ArticleIdx = int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "UserDeclareState":item.UserDeclareState =int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "AuditState":item.AuditState = int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "OriginalArticleUrl":item.OriginalArticleUrl = j.InnerText;break;case "OriginalArticleType":item.OriginalArticleType =int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "CanReprint":item.CanReprint = int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "NeedReplaceContent":item.NeedReplaceContent =int.TryParse(j.InnerText, out @int) ? @int : 0;break;case "NeedShowReprintSource":item.NeedShowReprintSource =int.TryParse(j.InnerText, out @int) ? @int : 0;break;}}msg = new MassSendJobFinishMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.MASSSENDJOBFINISH,Status = TryGetFirstTagText(ref xmlDocument, "Status", out txt) ? txt : "",TotalCount =TryGetFirstTagText(ref xmlDocument, "TotalCount", out txt)? Convert.ToInt32(txt): 0,FilterCount =TryGetFirstTagText(ref xmlDocument, "FilterCount", out txt)? Convert.ToInt32(txt): 0,SentCount = TryGetFirstTagText(ref xmlDocument, "SentCount", out txt)? Convert.ToInt32(txt): 0,ErrorCount =TryGetFirstTagText(ref xmlDocument, "ErrorCount", out txt)? Convert.ToInt32(txt): 0,CopyrightCheckResult = new CopyrightCheckResult{Count = TryGetFirstTagText(ref xmlDocument, "Count", out txt)? Convert.ToInt32(txt): 0,CheckState =TryGetFirstTagText(ref xmlDocument, "CheckState", out txt)? Convert.ToInt32(txt): 0,ResultList = itemsList}};break;case EventMessageFromWeiXinType.TEMPLATESENDJOBFINISH: //模版消息发送完成事件msg = new TEMPLATESENDJOBFINISHMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.TEMPLATESENDJOBFINISH,Status = TryGetFirstTagText(ref xmlDocument, "", out txt) ? txt : ""};break;default: //其他事件msg = new EventMessageFromWeiXin{MsgType = MessageFromWeiXinType.@event,Event = EventMessageFromWeiXinType.unknown};break;}}break;default: //未知消息msg = new MessageFromWeiXin {MsgType = MessageFromWeiXinType.unknown};break;}if (msg.MsgType != MessageFromWeiXinType.unknown){if (TryGetFirstTagText(ref xmlDocument, "CreateTime", out txt))msg.CreateTime = Convert.ToInt32(txt);if (TryGetFirstTagText(ref xmlDocument, "FromUserName", out txt)) msg.FromUserName = txt;if (TryGetFirstTagText(ref xmlDocument, "MsgId", out txt)) msg.MsgId = Convert.ToInt64(txt);if (TryGetFirstTagText(ref xmlDocument, "ToUserName", out txt)) msg.ToUserName = txt;return msg;}}return null;}/// <summary>///     尝试取得XML中第一个指定标签的文本/// </summary>/// <param name="xml">xml文档对象</param>/// <param name="tag">指定的标签名</param>/// <param name="txt">取得的文本</param>/// <returns>是否成功取得</returns>public static bool TryGetFirstTagText(ref XmlDocument xml, string tag, out string txt){txt = string.Empty;var Node = xml.GetElementsByTagName(tag);if (Node.Count > 0){txt = Node[0].InnerText;if (!string.IsNullOrWhiteSpace(txt)) return true;}return false;}/// <summary>///     验证微信接口/// </summary>/// <param name="echostr"></param>/// <param name="nonce"></param>/// <param name="signature"></param>/// <param name="timestamp"></param>/// <param name="token"></param>/// <returns></returns>public static bool VerificationSignature(string echostr, string nonce, string signature, string timestamp,string token){string[] StrArray = {token, timestamp, nonce};Array.Sort(StrArray);var ArrayString = new StringBuilder();for (var i = 0; i < StrArray.Length; i++) ArrayString.Append(StrArray[i]);var strHash = GetSha1Hash(ArrayString.ToString());return signature == strHash;}/// <summary>///     哈希1/// </summary>/// <param name="input"></param>/// <returns></returns>public static string GetSha1Hash(string input){var inputBytes = Encoding.Default.GetBytes(input);SHA1 sha = new SHA1CryptoServiceProvider();var result = sha.ComputeHash(inputBytes);var sBuilder = new StringBuilder();for (var i = 0; i < result.Length; i++) sBuilder.Append(result[i].ToString("x2"));return sBuilder.ToString();}/// <summary>///     时间转时间戳/// </summary>public static long ConvertDateTimeToInt(DateTime dateTime){var startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);var t = (dateTime.Ticks - startTime.Ticks) / 10000; //除10000调整为13位      return t;}}
}

有了这两个类,我们的东西就好开展了,如果大家有发现报错的话,是因为string扩展类的问题。需要的留下邮箱,这个东西太长了。不好发,不过大家应该都看的懂,自己写一套也好。

使用上面第二个类中的,这个方法,进行转换 : XmlToMessageFromWeiXin

得到我们 msg 对象

我们这个对象里面有msgtype,这个type枚举呢,就对应了各个事件。

我们写个switch就能将他们分开了。不同事件进入不同分支处理。


/// <summary>
///     接收来自微信的消息
/// </summary>
[HttpPost]
[Route("api/WeChat")]
public string Post(string xml)
{System.Console.WriteLine("进入消息处理");var reader = new StreamReader(Request.Body);var contentFromBody = reader.ReadToEnd();System.Console.WriteLine($"xml:{contentFromBody}");xml = contentFromBody;try{var msg = ResponseClient.XmlToMessageFromWeiXin(xml);var Response = "";switch (msg.MsgType){case MessageFromWeiXinType.text:var textMsg = (TextMessageFromWeiXin)msg;Response = "<xml> <ToUserName><![CDATA[" + textMsg.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + textMsg.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您说“" +textMsg.Content + "”,小女子暂时还不明白,等小女子日后博学之时再来答复您。]]></Content> </xml>";break;case MessageFromWeiXinType.image:var imgMsg = (ImageMessageFromWeiXin)msg;System.Console.WriteLine($"图片地址:{imgMsg.PicUrl}");Response = "<xml> <ToUserName><![CDATA[" + imgMsg.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + imgMsg.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一张 图片,小女子已经帮您保存起来了]]></Content> </xml>";break;case MessageFromWeiXinType.voice:var voiceMsg = (VoiceMessageFromWeiXin)msg;//如果有开通语音识别的功能,我们可以使用这个字段:RecognitionSystem.Console.WriteLine($"音频转文字:{voiceMsg.Recognition}");//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的音频文件。记得及时下载哟System.Console.WriteLine($"音频下载地址:{voiceMsg.MediaId}");Response = "<xml> <ToUserName><![CDATA[" + voiceMsg.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + voiceMsg.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一串 语音,小女子已经帮您保存起来了]]></Content> </xml>";break;case MessageFromWeiXinType.shortvideo:var shortvideo = (ShortVideoMessageFromWeiXin)msg;//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的视频文件。记得及时下载哟System.Console.WriteLine($"小视频下载地址:{shortvideo.MediaId}");Response = "<xml> <ToUserName><![CDATA[" + shortvideo.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + shortvideo.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个小视频,小女子已经帮您保存起来了]]></Content> </xml>";break;case MessageFromWeiXinType.video:var video = (VideoMessageFromWeiXin)msg;//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的视频文件。记得及时下载哟System.Console.WriteLine($"视频下载地址:{video.MediaId}");Response = "<xml> <ToUserName><![CDATA[" + video.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + video.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个视频,小女子已经帮您保存起来了]]></Content> </xml>";break;case MessageFromWeiXinType.location:var location = (LocationMessageFromWeiXin)msg;//我们的地址呢,主要有 地理位置纬度 Location_X ; 地理位置经度  Location_Y ; 地图缩放大小 Scale; 地理位置信息 Label System.Console.WriteLine($"纬度:{location.Location_X}\n经度:{location.Location_Y}\n地图缩放大小:{location.Scale}\n地理位置信息:{location.Label}\n");Response = "<xml> <ToUserName><![CDATA[" + location.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + location.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个 位置信息,小女子已经帮您记录下来了]]></Content> </xml>";break;case MessageFromWeiXinType.link:var link = (LinkMessageFromWeiXin)msg;//我们的链接呢,主要有 消息标题 Title  ;消息描述 Description ;消息链接 UrlSystem.Console.WriteLine($"消息标题:{link.Title}\n消息描述:{link.Description}\n消息链接:{link.Url}\n");Response = "<xml> <ToUserName><![CDATA[" + link.FromUserName +"]]></ToUserName> <FromUserName><![CDATA[" + link.ToUserName +"]]></FromUserName> <CreateTime>" +ResponseClient.ConvertDateTimeToInt(DateTime.Now) +"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个 链接:标题:" + link.Title + " , 地址: " + link.Url + " ,小女子已经帮您记录下来了]]></Content> </xml>";break;}return Response;// return "success";}catch (Exception ex){return "error";}
}

关于大家还有些使用问题,有不懂的或需要代码的,留下邮箱

欢迎进qq群交流:704028989

微信公众号简单开发(11)综合案例相关推荐

  1. 微信公众号简单开发(1)介绍流程

    上一篇文章我们介绍了微信公众号开发需要用到一些id和密码之类的 如果还不清楚我们可以看看这篇文章 点我 : https://mp.weixin.qq.com/wiki?t=resource/res_m ...

  2. 微信公众号简单开发(4)普通消息

    我们在接收微信普通消息的时候呀,我们会发现我们有很多种普通消息. 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id= ...

  3. 微信公众号简单开发(6)图片消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  4. 微信公众号简单开发(10)链接消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  5. 微信公众号简单开发(7)语音消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  6. 微信公众号简单开发(9)地理位置消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  7. 微信公众号简单开发(2)验证服务器地址

    两个步骤: 微信原文: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 第一步:填写服务器配置 登录微信公众 ...

  8. 微信公众号简单开发(5)文本消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  9. 微信公众号简单开发(8)视频消息 和 小视频消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

最新文章

  1. mysql session 最大值_session 存储最大值
  2. 9.任务段(TSS)
  3. python定义匿名函数关键字_Python(11):Python函数基础(定义函数、函数参数、匿名函数)...
  4. 求数组里面的最大值和最小值
  5. Angular 7 和 .Net Core 2.2——全球天气(第1部分)
  6. 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
  7. 小米IPO前员工写文爆料内部真实见闻—期权 部分裁员 离职大公开!
  8. 电子设计硬件可靠性设计--总结
  9. 笔记 左程云算法基础
  10. java面试 bs cs_面试题思考:BS与CS的区别与联系
  11. 关于canvas的学习心得(三)(计算错误)
  12. mysql周报内容范文_Mysql报表查询实例(日报|周报|月报|时间差自动计算)
  13. 【开源项目】电视盒子好用又强大的APP: TVRemoteIME
  14. 从今天起我想要热爱生活
  15. gre计算机考试科目,gre的考试内容和科目
  16. pacemaker和keepalived的区别
  17. GRUB4DOS(十二)适用于FAT32的分区引导扇区启动代码
  18. 如何通过URL打开图片(Python)
  19. 闲谈隐性成本(太多人的思维盲区)
  20. 分享一开源的闭环步进电机控制器

热门文章

  1. wifislax虚拟机安装手册
  2. 阿里巴巴Java开发手册(正式版)
  3. Could not autowire. No beans of ‘XXXMapper‘ type found
  4. Serverless 多函数开发示例
  5. 小知识点(13)-SimpleDateFormat处理 dd-MMM-yy类型日期
  6. java计算机毕业设计面相高校学生的图书共享平台源代码+数据库+系统+lw文档
  7. Appium id定位综合实践——自动登录(交易宝)
  8. AI测试自动化脚本:解析结果txt文件字段并保存至excel文件
  9. 【ESP32S2】使用ESP32S2开发板制作U盘,支持无线访问
  10. 说说今天刷Nvidia TX2踩的坑