国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

.NET微信公眾號開發(fā)-4.0公眾號消息處理

2019-11-14 15:55:55
字體:
供稿:網(wǎng)友

一.前言

  微信公眾平臺的消息處理還是比較完善的,有最基本的文本消息,到圖文消息,到圖片消息,語音消息,視頻消息,音樂消息其基本原理都是一樣的,只不過所post的xml數(shù)據(jù)有所差別,在處理消息之前,我們要認(rèn)真閱讀,官方給我們的文檔:http://mp.weixin.QQ.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我們從最基本的文本消息處理開始。

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>

  我們可以看到這是消息處理的一個最基本的模式,有發(fā)送者,接受者,創(chuàng)建時間,類型,內(nèi)容等等。

首先我們來創(chuàng)建一個消息處理的類,這個類用來捕獲,所有的消息請求,根據(jù)不同的消息請求類型來處理不同的消息回復(fù)。

public class WeiXinService    {        /// <summary>        /// TOKEN        /// </summary>        PRivate const string TOKEN = "finder";        /// <summary>        /// 簽名        /// </summary>        private const string SIGNATURE = "signature";        /// <summary>        /// 時間戳        /// </summary>        private const string TIMESTAMP = "timestamp";        /// <summary>        /// 隨機(jī)數(shù)        /// </summary>        private const string NONCE = "nonce";        /// <summary>        /// 隨機(jī)字符串        /// </summary>        private const string ECHOSTR = "echostr";        /// <summary>        ///         /// </summary>        private HttpRequest Request { get; set; }        /// <summary>        /// 構(gòu)造函數(shù)        /// </summary>        /// <param name="request"></param>        public WeiXinService(HttpRequest request)        {            this.Request = request;        }        /// <summary>        /// 處理請求,產(chǎn)生響應(yīng)        /// </summary>        /// <returns></returns>        public string Response()        {            string method = Request.HttpMethod.ToUpper();            //驗證簽名            if (method == "GET")            {                if (CheckSignature())                {                    return Request.QueryString[ECHOSTR];                }                else                {                    return "error";                }            }            //處理消息            if (method == "POST")            {                return ResponseMsg();            }            else            {                return "無法處理";            }        }        /// <summary>        /// 處理請求        /// </summary>        /// <returns></returns>        private string ResponseMsg()        {            string requestXml = CommonWeiXin.ReadRequest(this.Request);            IHandler handler = HandlerFactory.CreateHandler(requestXml);                 if (handler != null)            {                return handler.HandleRequest();            }            return string.Empty;        }        /// <summary>        /// 檢查簽名        /// </summary>        /// <param name="request"></param>        /// <returns></returns>        private bool CheckSignature()        {            string signature = Request.QueryString[SIGNATURE];            string timestamp = Request.QueryString[TIMESTAMP];            string nonce = Request.QueryString[NONCE];            List<string> list = new List<string>();            list.Add(TOKEN);            list.Add(timestamp);            list.Add(nonce);            //排序            list.Sort();            //拼串            string input = string.Empty;            foreach (var item in list)            {                input += item;            }            //加密            string new_signature = SecurityUtility.SHA1Encrypt(input);            //驗證            if (new_signature == signature)            {                return true;            }            else            {                return false;            }        }    }

在來看看我們的首先是如何捕獲消息的。首頁Default.ashx的代碼如下

        public void ProcessRequest(HttpContext context)        {            context.Response.ContentType = "text/html";                        string postString = string.Empty;            if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")            {                //由微信服務(wù)接收請求,具體處理請求                WeiXinService wxService = new WeiXinService(context.Request);                string responseMsg = wxService.Response();                context.Response.Clear();                context.Response.Charset = "UTF-8";                context.Response.Write(responseMsg);                context.Response.End();            }            else            {                string token = "wei2414201";                if (string.IsNullOrEmpty(token))                {                    return;                }                string echoString = HttpContext.Current.Request.QueryString["echoStr"];                string signature = HttpContext.Current.Request.QueryString["signature"];                string timestamp = HttpContext.Current.Request.QueryString["timestamp"];                string nonce = HttpContext.Current.Request.QueryString["nonce"];                if (!string.IsNullOrEmpty(echoString))                {                    HttpContext.Current.Response.Write(echoString);                    HttpContext.Current.Response.End();                }            }        }

從上面的代碼中我們可以看到WeiXinService.cs類中的消息相應(yīng)至關(guān)重要。

        /// <summary>        /// 處理請求        /// </summary>        /// <returns></returns>        private string ResponseMsg()        {            string requestXml = CommonWeiXin.ReadRequest(this.Request);            IHandler handler = HandlerFactory.CreateHandler(requestXml);                 if (handler != null)            {                return handler.HandleRequest();            }            return string.Empty;        }

IHandler是一個消息處理接口,其下面有EventHandler,TextHandler處理類實現(xiàn)這個接口。代碼如下

    /// <summary>    /// 處理接口    /// </summary>    public interface IHandler    {        /// <summary>        /// 處理請求        /// </summary>        /// <returns></returns>        string HandleRequest();    }

EventHandler

class EventHandler : IHandler    {        /// <summary>        /// 請求的xml        /// </summary>        private string RequestXml { get; set; }        /// <summary>        /// 構(gòu)造函數(shù)        /// </summary>        /// <param name="requestXml"></param>        public EventHandler(string requestXml)        {            this.RequestXml = requestXml;        }        /// <summary>        /// 處理請求        /// </summary>        /// <returns></returns>        public string HandleRequest()        {            string response = string.Empty;            EventMessage em = EventMessage.LoadFromXml(RequestXml);            if (em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//用來判斷是不是首次關(guān)注            {                PicTextMessage tm = new PicTextMessage();//我自己創(chuàng)建的一個圖文消息處理類                tm.ToUserName = em.FromUserName;                tm.FromUserName = em.ToUserName;                tm.CreateTime = CommonWeiXin.GetNowTime();                response = tm.GenerateContent();            }            return response;        }    }

TextHandler

    /// <summary>    /// 文本信息處理類    /// </summary>    public class TextHandler : IHandler    {        string openid { get; set; }        string access_token { get; set; }        /// <summary>        /// 請求的XML        /// </summary>        private string RequestXml { get; set; }        /// <summary>        /// 構(gòu)造函數(shù)        /// </summary>        /// <param name="requestXml">請求的xml</param>        public TextHandler(string requestXml)        {            this.RequestXml = requestXml;        }        /// <summary>        /// 處理請求        /// </summary>        /// <returns></returns>        public string HandleRequest()        {            string response = string.Empty;            TextMessage tm = TextMessage.LoadFromXml(RequestXml);            string content = tm.Content.Trim();            if (string.IsNullOrEmpty(content))            {                response = "您什么都沒輸入,沒法幫您啊。";            }            else            {                    string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();                    AccessToken token = AccessToken.Get(username);                    access_token = token.access_token;                    openid = tm.FromUserName;                    response = HandleOther(content);                            }            tm.Content = response;            //進(jìn)行發(fā)送者、接收者轉(zhuǎn)換            string temp = tm.ToUserName;            tm.ToUserName = tm.FromUserName;            tm.FromUserName = temp;            response = tm.GenerateContent();            return response;        }        /// <summary>        /// 處理其他消息        /// </summary>        /// <param name="tm"></param>        /// <returns></returns>        private string HandleOther(string requestContent)        {            string response = string.Empty;            if (requestContent.Contains("你好") || requestContent.Contains("您好"))            {                response = "您也好~";            }else if (requestContent.Contains("openid") || requestContent.Contains("id") || requestContent.Contains("ID"))//用來匹配用戶輸入的關(guān)鍵字            {                response = "你的Openid: "+openid;            }            else if (requestContent.Contains("token") || requestContent.Contains("access_token"))            {                response = "你的access_token: " + access_token;            }else             {                response = "試試其他關(guān)鍵字吧。";            }            return response;        }    }

HandlerFactory

    /// <summary>    /// 處理器工廠類    /// </summary>    public class HandlerFactory    {        /// <summary>        /// 創(chuàng)建處理器        /// </summary>        /// <param name="requestXml">請求的xml</param>        /// <returns>IHandler對象</returns>        public static IHandler CreateHandler(string requestXml)        {            IHandler handler = null;            if (!string.IsNullOrEmpty(requestXml))            {                //解析數(shù)據(jù)                XmlDocument doc = new System.Xml.XmlDocument();                doc.LoadXml(requestXml);                XmlNode node = doc.SelectSingleNode("/xml/MsgType");                if (node != null)                {                    XmlCDataSection section = node.FirstChild as XmlCDataSection;                    if (section != null)                    {                        string msgType = section.Value;                        switch (msgType)                        {                            case "text":                                handler = new TextHandler(requestXml);                                break;                            case "event":                                handler = new EventHandler(requestXml);                                break;                        }                    }                }            }            return handler;        }    }

 在這里基本的一些類已經(jīng)完成了,現(xiàn)在我們來完成,關(guān)注我們的微信公眾號,我們就發(fā)送一條圖文消息,同時輸入我們的一些關(guān)鍵字,返回一些消息,比如輸入id返回用戶的openid等等。

二.PicTextMessage

public class PicTextMessage : Message    {        /// <summary>        /// 模板靜態(tài)字段        /// </summary>        private static string m_Template;        /// <summary>        /// 默認(rèn)構(gòu)造函數(shù)        /// </summary>        public PicTextMessage()        {            this.MsgType = "news";        }        /// <summary>        /// 從xml數(shù)據(jù)加載文本消息        /// </summary>        /// <param name="xml"></param>        public static PicTextMessage LoadFromXml(string xml)        {            PicTextMessage tm = null;            if (!string.IsNullOrEmpty(xml))            {                XElement element = XElement.Parse(xml);                if (element != null)                {                    tm = new PicTextMessage();                    tm.FromUserName = element.Element(CommonWeiXin.FROM_USERNAME).Value;                    tm.ToUserName = element.Element(CommonWeiXin.TO_USERNAME).Value;                    tm.CreateTime = element.Element(CommonWeiXin.CREATE_TIME).Value;                }            }            return tm;        }        /// <summary>        /// 模板        /// </summary>        public override string Template        {            get            {                if (string.IsNullOrEmpty(m_Template))                {                    LoadTemplate();                }                return m_Template;            }        }        /// <summary>        /// 生成內(nèi)容        /// </summary>        /// <returns></returns>        public override string GenerateContent()        {            this.CreateTime = CommonWeiXin.GetNowTime();            string str= string.Format(this.Template, this.ToUserName, this.FromUserName, this.CreateTime);            return str;        }        /// <summary>        /// 加載模板        /// </summary>        private static void LoadTemplate()        {            m_Template= @"<xml>                            <ToUserName><![CDATA[{0}]]></ToUserName>                            <FromUserName><![CDATA[{1}]]></FromUserName>                            <CreateTime>{2}</CreateTime>                            <MsgType><![CDATA[news]]></MsgType>                            <ArticleCount>1</ArticleCount>                            <Articles>                                <item>                                <Title><![CDATA[有位停車歡迎你!]]></Title>                                 <Description><![CDATA[如有問題請致電400-6238-136或直接在微信留言,我們將第一時間為您服務(wù)!]]></Description>                                <PicUrl><![CDATA[http://www.baidu.com/youwei.jpg]]></PicUrl>                                <Url><![CDATA[http://www.baidu.com]]></Url>                                </item>                            </Articles>                        </xml> ";        }    }

最后我們的效果如下所示;

本人能力有限,希望大家多多包涵.

三.微信公眾號開發(fā)系列導(dǎo)航

1.0初始微信公眾號

2.0創(chuàng)建自定義菜單

3.0查詢自定義菜單

4.0公眾號消息處理

5.0微信支付

6.0模板消息


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 肇州县| 公主岭市| 临夏市| 陵川县| 富顺县| 金溪县| 建宁县| 永登县| 东兴市| 遂川县| 区。| 梁平县| 台江县| 石楼县| 循化| 和平区| 抚顺县| 兴海县| 昔阳县| 云阳县| 卓资县| 来宾市| 彰武县| 万年县| 商丘市| 宣威市| 友谊县| 平度市| 桂阳县| 阜新市| 巴彦淖尔市| 中牟县| 松潘县| 湘阴县| 淳化县| 正宁县| 庆云县| 牡丹江市| 连山| 巢湖市| 图片|