您好,登錄后才能下訂單哦!
這篇文章主要介紹“android微信公眾號(hào)開(kāi)發(fā)實(shí)例分析”,在日常操作中,相信很多人在android微信公眾號(hào)開(kāi)發(fā)實(shí)例分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”android微信公眾號(hào)開(kāi)發(fā)實(shí)例分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
開(kāi)發(fā)前說(shuō)明:
我們需要用到 StreamReader
所以需要引用:using System.IO;
上面講了一些微信給我們的規(guī)則
我們現(xiàn)在要用這些規(guī)則獲取我們想要的東西。
第一步:獲取那串 XML 這個(gè)是最重要的,因?yàn)闆](méi)這個(gè)XML,我們就相當(dāng)于啥都沒(méi)有。(我們的信息來(lái)源就是這個(gè)XML)
這里我使用 StreamReader 來(lái)獲取 Request.Body
因?yàn)閄ML主要是 Request.Body 里面的
//聲明一個(gè)XML方便調(diào)用 string xml=""; //獲取我們的流 var reader = new StreamReader(Request.Body); //把流里面的讀取出來(lái),就是我們這串XML了。 var contentFromBody = reader.ReadToEnd(); //再保存進(jìn)我們的這個(gè)字符串里,方便后期使用 xml = contentFromBody;
我們讀取XML中的信息,并將其轉(zhuǎn)成我們的微信信息對(duì)象。
這里呢。我借用了一位大佬的代碼:
專(zhuān)門(mén)處理微信消息的幾個(gè)類(lèi)
第一個(gè)類(lèi):
MessageFromWeiXin:
using System.Collections.Generic; namespace 命名空間(各位懂的) { /// <summary> /// 來(lái)自微信的消息請(qǐng)求:基類(lèi) /// </summary> public class MessageFromWeiXin { /// <summary> /// 開(kāi)發(fā)者微信號(hào):接收到消息的公眾號(hào)帳號(hào) /// </summary> public string ToUserName { get; set; } /// <summary> /// 發(fā)送方帳號(hào)(一個(gè)OpenID,引起這條消息的微信用戶(hù)) /// </summary> public string FromUserName { get; set; } /// <summary> /// 消息創(chuàng)建時(shí)間 (整型) /// </summary> public long CreateTime { get; set; } /// <summary> /// 消息id,64位整型 /// </summary> public long MsgId { get; set; } /// <summary> /// 消息類(lèi)型 /// </summary> public MessageFromWeiXinType MsgType { get; set; } } #region 普通消息 /// <summary> /// 來(lái)自微信的【文本】消息請(qǐng)求 /// </summary> public class TextMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 文本消息內(nèi)容 /// </summary> public string Content { get; set; } } /// <summary> /// 來(lái)自微信的【圖片】消息請(qǐng)求 /// </summary> public class ImageMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 圖片鏈接(由系統(tǒng)生成) /// </summary> public string PicUrl { get; set; } /// <summary> /// 圖片消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 /// </summary> public string MediaId { get; set; } } /// <summary> /// 來(lái)自微信的【語(yǔ)音】消息請(qǐng)求 /// </summary> public class VoiceMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 語(yǔ)音消息媒體id,可以調(diào)用多媒體文件下載接口拉取該媒體 /// </summary> public string MediaId { get; set; } /// <summary> /// 語(yǔ)音格式:amr /// </summary> public string Format { get; set; } /// <summary> /// 語(yǔ)音識(shí)別結(jié)果,UTF8編碼(需要開(kāi)通此服務(wù)) /// </summary> public string Recognition { get; set; } } /// <summary> /// 來(lái)自微信的【文本】消息請(qǐng)求 /// </summary> public class VideoMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 /// </summary> public string MediaId { get; set; } /// <summary> /// 視頻消息縮略圖的媒體id,可以調(diào)用 /// </summary> public string ThumbMediaId { get; set; } } /// <summary> /// 來(lái)自微信的【小視頻】消息請(qǐng)求 /// </summary> public class ShortVideoMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 /// </summary> public string MediaId { get; set; } /// <summary> /// 視頻消息縮略圖的媒體id,可以調(diào)用 /// </summary> public string ThumbMediaId { get; set; } } /// <summary> /// 來(lái)自微信的【位置】消息請(qǐng)求 /// </summary> public class LocationMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 地理位置維度【緯度】 /// </summary> public float Location_X { get; set; } /// <summary> /// 地理位置經(jīng)度 /// </summary> public float Location_Y { get; set; } /// <summary> /// 地圖縮放大小 /// </summary> public int Scale { get; set; } /// <summary> /// 地理位置信息 /// </summary> public string Label { get; set; } } /// <summary> /// 來(lái)自微信的【位置】消息請(qǐng)求 /// </summary> public class LinkMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 消息標(biāo)題 /// </summary> public string Title { get; set; } /// <summary> /// 消息描述 /// </summary> public string Description { get; set; } /// <summary> /// 消息鏈接 /// </summary> public string Url { get; set; } } #endregion #region 事件消息 /// <summary> /// 基本的事件消息:關(guān)注,取消關(guān)注事件 /// </summary> public class EventMessageFromWeiXin : MessageFromWeiXin { /// <summary> /// 事件類(lèi)型 /// </summary> public EventMessageFromWeiXinType Event { get; set; } } /// <summary> /// 用戶(hù)掃碼事件:已關(guān)注用戶(hù)事件類(lèi)型為 SCAN,未關(guān)注的用戶(hù)類(lèi)型為 subscribe /// </summary> public class SanEventMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 事件KEY值,是一個(gè)32位無(wú)符號(hào)整數(shù),即創(chuàng)建二維碼時(shí)的二維碼scene_id,但這里作為字符串 /// </summary> public string EventKey { get; set; } /// <summary> /// 二維碼的ticket,可用來(lái)?yè)Q取二維碼圖片 /// </summary> public string Ticket { get; set; } } /// <summary> /// 上報(bào)地理位置事件 /// </summary> public class LocationEventMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 地理位置緯度 /// </summary> public float Latitude { get; set; } /// <summary> /// 地理位置經(jīng)度 /// </summary> public float Longitude { get; set; } /// <summary> /// 地理位置精度 /// </summary> public float Precision { get; set; } } /// <summary> /// 點(diǎn)擊菜單拉取消息事件 /// </summary> public class ClickEventMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 事件KEY值,與自定義菜單接口中KEY值對(duì)應(yīng) /// </summary> public string EventKey { get; set; } } /// <summary> /// 點(diǎn)擊菜單跳轉(zhuǎn)鏈接事件 /// </summary> public class ViewEventMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 事件KEY值,設(shè)置的跳轉(zhuǎn)URL /// </summary> public string EventKey { get; set; } } /// <summary> /// 群發(fā)消息完成事件 /// </summary> public class MassSendJobFinishMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 狀態(tài) /// </summary> public string Status { get; set; } /// <summary> /// 標(biāo)簽粉絲數(shù),或OpenId列表中粉絲數(shù) /// </summary> public int TotalCount { get; set; } /// <summary> /// 過(guò)濾(過(guò)濾是指特定地區(qū)、性別的過(guò)濾、用戶(hù)設(shè)置拒收的過(guò)濾,用戶(hù)接收已超4條的過(guò)濾)后,準(zhǔn)備發(fā)送的粉絲數(shù),原則上,F(xiàn)ilterCount = SentCount + ErrorCount /// </summary> public int FilterCount { get; set; } /// <summary> /// 發(fā)送成功的粉絲數(shù) /// </summary> public int SentCount { get; set; } /// <summary> /// 發(fā)送失敗的粉絲數(shù) /// </summary> public int ErrorCount { get; set; } /// <summary> /// 原創(chuàng)校驗(yàn)結(jié)果 /// </summary> public CopyrightCheckResult CopyrightCheckResult { get; set; } } /// <summary> /// 原創(chuàng)校驗(yàn)結(jié)果 /// </summary> public class CopyrightCheckResult { /// <summary> /// 圖文個(gè)數(shù) /// </summary> public int Count { get; set; } /// <summary> /// 各個(gè)單圖文校驗(yàn)結(jié)果 /// </summary> public List<CopyrightCheckItem> ResultList { get; set; } /// <summary> /// 1-未被判為轉(zhuǎn)載,可以群發(fā),2-被判為轉(zhuǎn)載,可以群發(fā),3-被判為轉(zhuǎn)載,不能群發(fā) /// </summary> public int CheckState { get; set; } } /// <summary> /// 單圖文原創(chuàng)校驗(yàn)結(jié)果 /// </summary> public class CopyrightCheckItem { /// <summary> /// 群發(fā)文章的序號(hào),從1開(kāi)始 /// </summary> public int ArticleIdx { get; set; } /// <summary> /// 用戶(hù)聲明文章的狀態(tài) /// </summary> public int UserDeclareState { get; set; } /// <summary> /// 系統(tǒng)校驗(yàn)的狀態(tài) /// </summary> public int AuditState { get; set; } /// <summary> /// 相似原創(chuàng)文的url /// </summary> public string OriginalArticleUrl { get; set; } /// <summary> /// 相似原創(chuàng)文的類(lèi)型 /// </summary> public int OriginalArticleType { get; set; } /// <summary> /// 是否能轉(zhuǎn)載 /// </summary> public int CanReprint { get; set; } /// <summary> /// 是否需要替換成原創(chuàng)文內(nèi)容 /// </summary> public int NeedReplaceContent { get; set; } /// <summary> /// 否需要注明轉(zhuǎn)載來(lái)源 /// </summary> public int NeedShowReprintSource { get; set; } } /// <summary> /// 模版消息發(fā)送完成事件 /// </summary> public class TEMPLATESENDJOBFINISHMessageFromWeiXin : EventMessageFromWeiXin { /// <summary> /// 狀態(tài):success 成功;failed:user block 用戶(hù)拒絕;failed: system failed 非用戶(hù)拒絕 /// </summary> public string Status { get; set; } } #endregion /// <summary> /// 微信服務(wù)器推送過(guò)來(lái)的消息類(lèi)型 /// </summary> public enum MessageFromWeiXinType { /// <summary> /// 未知 /// </summary> unknown = 1, /// <summary> /// 文本消息 /// </summary> text = 2, /// <summary> /// 圖片消息 /// </summary> image = 3, /// <summary> /// 語(yǔ)音消息 /// </summary> voice = 4, /// <summary> /// 視頻消息 /// </summary> video = 5, /// <summary> /// 小視頻消息 /// </summary> shortvideo = 6, /// <summary> /// 地里位置消息 /// </summary> location = 7, /// <summary> /// 連接消息 /// </summary> link = 8, /// <summary> /// 事件推送消息 /// </summary> @event = 9 } /// <summary> /// 微信服務(wù)器推送過(guò)來(lái)的【事件】消息的子類(lèi)型 /// </summary> public enum EventMessageFromWeiXinType { /// <summary> /// 未知 /// </summary> unknown = 1, /// <summary> /// 訂閱事件;未關(guān)注用戶(hù)掃碼關(guān)注也是這個(gè)類(lèi)型,但數(shù)據(jù)結(jié)構(gòu)與SCAN類(lèi)型相同,此時(shí)相當(dāng)于兩個(gè)類(lèi)型的合并 /// </summary> subscribe = 2, /// <summary> /// 取消訂閱事件 /// </summary> unsubscribe = 3, /// <summary> /// 掃描帶參數(shù)二維碼事件 /// </summary> SCAN = 4, /// <summary> /// 上報(bào)地理位置事件 /// </summary> LOCATION = 5, /// <summary> /// 點(diǎn)擊自定義菜單拉取消息事件 /// </summary> CLICK = 6, /// <summary> /// 點(diǎn)擊自定義菜單跳轉(zhuǎn)鏈接事件 /// </summary> VIEW = 7, /// <summary> /// 群發(fā)消息發(fā)送結(jié)束事件 /// </summary> MASSSENDJOBFINISH = 8, /// <summary> /// 模板消息發(fā)送結(jié)束事件 /// </summary> TEMPLATESENDJOBFINISH = 9 } }
第二個(gè)類(lèi):
ResponseClient:
using System.Xml; using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; using System.Xml; namespace 命名空間(各位懂的) { /// <summary> /// XML消息識(shí)別 /// </summary> public static class ResponseClient { /// <summary> /// 判斷消息類(lèi)型 /// </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轉(zhuǎn)消息對(duì)象 /// </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: //語(yǔ)音消息 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: //關(guān)注事件 msg = new EventMessageFromWeiXin { MsgType = MessageFromWeiXinType.@event, Event = EventMessageFromWeiXinType.subscribe }; break; case EventMessageFromWeiXinType.unsubscribe: //取消關(guān)注事件 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: //點(diǎn)擊自定義菜單等待消息響應(yīng) msg = new ClickEventMessageFromWeiXin { MsgType = MessageFromWeiXinType.@event, Event = EventMessageFromWeiXinType.CLICK, EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : "" }; break; case EventMessageFromWeiXinType.VIEW: //點(diǎn)擊自定義菜單跳轉(zhuǎn)到頁(yè)面 msg = new ViewEventMessageFromWeiXin { MsgType = MessageFromWeiXinType.@event, Event = EventMessageFromWeiXinType.VIEW, EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : "" }; break; case EventMessageFromWeiXinType.LOCATION: //授權(quán)取得位置事件 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: //群發(fā)消息發(fā)送完成事件 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: //模版消息發(fā)送完成事件 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中第一個(gè)指定標(biāo)簽的文本 /// </summary> /// <param name="xml">xml文檔對(duì)象</param> /// <param name="tag">指定的標(biāo)簽名</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> /// 驗(yàn)證微信接口 /// </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> /// 時(shí)間轉(zhuǎn)時(shí)間戳 /// </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調(diào)整為13位 return t; } } }
有了這兩個(gè)類(lèi),我們的東西就好開(kāi)展了,如果大家有發(fā)現(xiàn)報(bào)錯(cuò)的話(huà),是因?yàn)閟tring擴(kuò)展類(lèi)的問(wèn)題。需要的留下郵箱,這個(gè)東西太長(zhǎng)了。不好發(fā),不過(guò)大家應(yīng)該都看的懂,自己寫(xiě)一套也好。
使用上面第二個(gè)類(lèi)中的,這個(gè)方法,進(jìn)行轉(zhuǎn)換 : XmlToMessageFromWeiXin
得到我們 msg 對(duì)象
我們這個(gè)對(duì)象里面有msgtype,這個(gè)type枚舉呢,就對(duì)應(yīng)了各個(gè)事件。
我們寫(xiě)個(gè)switch就能將他們分開(kāi)了。不同事件進(jìn)入不同分支處理。
/// <summary> /// 接收來(lái)自微信的消息 /// </summary> [HttpPost] [Route("api/WeChat")] public string Post(string xml) { System.Console.WriteLine("進(jìn)入消息處理"); 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[您說(shuō)“" + textMsg.Content + "”,小女子暫時(shí)還不明白,等小女子日后博學(xué)之時(shí)再來(lái)答復(fù)您。]]></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[您發(fā)了一張 圖片,小女子已經(jīng)幫您保存起來(lái)了]]></Content> </xml>"; break; case MessageFromWeiXinType.voice: var voiceMsg = (VoiceMessageFromWeiXin)msg; //如果有開(kāi)通語(yǔ)音識(shí)別的功能,我們可以使用這個(gè)字段:Recognition System.Console.WriteLine($"音頻轉(zhuǎn)文字:{voiceMsg.Recognition}"); //我們下載這串語(yǔ)音的話(huà)就要使用這個(gè)字段:MediaId,根據(jù)這個(gè)字段加上微信提供的多媒體下載接口 ,下載 我們的音頻文件。記得及時(shí)下載喲 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[您發(fā)了一串 語(yǔ)音,小女子已經(jīng)幫您保存起來(lái)了]]></Content> </xml>"; break; case MessageFromWeiXinType.shortvideo: var shortvideo = (ShortVideoMessageFromWeiXin)msg; //我們下載這串語(yǔ)音的話(huà)就要使用這個(gè)字段:MediaId,根據(jù)這個(gè)字段加上微信提供的多媒體下載接口 ,下載 我們的視頻文件。記得及時(shí)下載喲 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[您發(fā)了一個(gè)小視頻,小女子已經(jīng)幫您保存起來(lái)了]]></Content> </xml>"; break; case MessageFromWeiXinType.video: var video = (VideoMessageFromWeiXin)msg; //我們下載這串語(yǔ)音的話(huà)就要使用這個(gè)字段:MediaId,根據(jù)這個(gè)字段加上微信提供的多媒體下載接口 ,下載 我們的視頻文件。記得及時(shí)下載喲 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[您發(fā)了一個(gè)視頻,小女子已經(jīng)幫您保存起來(lái)了]]></Content> </xml>"; break; case MessageFromWeiXinType.location: var location = (LocationMessageFromWeiXin)msg; //我們的地址呢,主要有 地理位置緯度 Location_X ; 地理位置經(jīng)度 Location_Y ; 地圖縮放大小 Scale; 地理位置信息 Label System.Console.WriteLine($"緯度:{location.Location_X}\n經(jīng)度:{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[您發(fā)了一個(gè) 位置信息,小女子已經(jīng)幫您記錄下來(lái)了]]></Content> </xml>"; break; case MessageFromWeiXinType.link: var link = (LinkMessageFromWeiXin)msg; //我們的鏈接呢,主要有 消息標(biāo)題 Title ;消息描述 Description ;消息鏈接 Url System.Console.WriteLine($"消息標(biāo)題:{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[您發(fā)了一個(gè) 鏈接:標(biāo)題:" + link.Title + " , 地址: " + link.Url + " ,小女子已經(jīng)幫您記錄下來(lái)了]]></Content> </xml>"; break; } return Response; // return "success"; } catch (Exception ex) { return "error"; } }
到此,關(guān)于“android微信公眾號(hào)開(kāi)發(fā)實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。