• C#微信公众号——消息处理


    ​当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL。

    一、接收POST请求,处理XML信息

        public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                string postString = string.Empty;
                if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                {
                    using (Stream stream = HttpContext.Current.Request.InputStream)
                    {
                        Byte[] postBytes = new Byte[stream.Length];
                        stream.Read(postBytes, 0, (Int32)stream.Length);
                        postString = Encoding.UTF8.GetString(postBytes);
                        Handle(postString);
                    }
                }
            }
            /// <summary>
            /// 处理信息并应答
            /// </summary>
            private void Handle(string postStr)
            {
                messageHelp help = new messageHelp();
                string responseContent = help.ReturnMessage(postStr);
                HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                HttpContext.Current.Response.Write(responseContent);
            }

    二、处理消息

    public class messageHelp
        {
            public string ReturnMessage(string postStr)
            {
                string responseContent = "";
                XmlDocument xmldoc = new XmlDocument();
                xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("UTF-8").GetBytes(postStr)));
                XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
                if (MsgType != null)
                {
                    switch (MsgType.InnerText)
                    {
                        case "event":
                            responseContent = EventHandle(xmldoc);//事件处理
                            break;
                        case "text":
                            responseContent = TextHandle(xmldoc);//接受文本消息处理break;
                    }
                }
                return responseContent;
            }
            //事件
            public string EventHandle(XmlDocument xmldoc)
            {
                string responseContent = "";
                XmlNode Event = xmldoc.SelectSingleNode("/xml/Event");
                XmlNode EventKey = xmldoc.SelectSingleNode("/xml/EventKey");
                XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
                XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
                if (Event != null)
                {
                    //菜单单击事件
                    if (Event.InnerText.Equals("CLICK"))
                    {
                        Helper.GetUserDetail(Helper.IsExistAccess_Token(), FromUserName.InnerText);//获取用户基本信息
                        if (EventKey.InnerText.Equals("12"))
                        {
                            responseContent = string.Format(ReplyType.Message_Text,
                                FromUserName.InnerText,
                                ToUserName.InnerText,
                                DateTime.Now.Ticks,
                                "欢迎查看工作动态");
                        }
                    }
                    else if (Event.InnerText.Equals("subscribe"))//关注公众号时推送消息
                    {
                        Helper.GetUserDetail(Helper.IsExistAccess_Token(), FromUserName.InnerText);//获取用户基本信息
                        responseContent = string.Format(ReplyType.Message_Text,
                            FromUserName.InnerText,
                            ToUserName.InnerText,
                            DateTime.Now.Ticks,
                            "欢迎关注XX公司");
                    }
                }
                return responseContent;
            }
            //接受文本消息
            public string TextHandle(XmlDocument xmldoc)
            {
                string responseContent = "";
                XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");//接收方帐号(收到的OpenID)
                XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");//开发者微信号
                XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
                if (Content != null)
                {
                    responseContent = string.Format(ReplyType.Message_Text,
                       FromUserName.InnerText,
                        ToUserName.InnerText,
                        DateTime.Now.Ticks,
                        "欢迎使用微信公众号,如有任何疑问请联系我们客服人员!");
                }
                return responseContent;
            }
           //回复类型
        public class ReplyType
        {
            /// <summary>
            /// 普通文本消息
            /// </summary>
            public static string Message_Text
            {
                get
                {
                    return @"<xml>
                                <ToUserName><![CDATA[{0}]]></ToUserName>
                                <FromUserName><![CDATA[{1}]]></FromUserName>
                                <CreateTime>{2}</CreateTime>
                                <MsgType><![CDATA[text]]></MsgType>
                                <Content><![CDATA[{3}]]></Content>
                                </xml>";
                }
            }
        }
  • 相关阅读:
    C语言 · 字符串输入输出函数
    C语言 · 判定字符位置
    剑指offer二之替换空格
    剑指offer一之二维数组中的查找
    算法复杂度:时间复杂度与空间复杂度
    二分查找法
    信息熵
    K-means算法的原理、优缺点及改进(转)
    office2013安装与卸载
    Deep Learning (中文版&英文版)
  • 原文地址:https://www.cnblogs.com/zhangjd/p/5701265.html
Copyright © 2020-2023  润新知