溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

android微信公眾號(hào)開(kāi)發(fā)實(shí)例分析

發(fā)布時(shí)間:2022-10-19 11:49:09 來(lái)源:億速云 閱讀:151 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“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;

現(xiàn)在正式講開(kāi)發(fā)

上面講了一些微信給我們的規(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í)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI