温馨提示×

温馨提示×

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

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

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

发布时间:2022-10-19 11:49:09 来源:亿速云 阅读:156 作者: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