温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android微信公众号开发实例分析

发布时间:2022-10-19 11:49:09 来源:亿速云 阅读:193 作者:iii 栏目:编程语言

这篇文章主要介绍“android微信公众号开发实例分析”,在日常操作中,相信很多人在android微信公众号开发实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”android微信公众号开发实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

开发前说明:
我们需要用到 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;                 //如果有开通语音识别的功能,我们可以使用这个字段:Recognition                 System.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 ;消息链接 Url                 System.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";     } }

到此,关于“android微信公众号开发实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI