這篇文章主要介紹.NET開發(fā)微信公眾號(hào)之公眾號(hào)消息怎么處理,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括馬邊彝族網(wǎng)站建設(shè)、馬邊彝族網(wǎng)站制作、馬邊彝族網(wǎng)頁制作以及馬邊彝族網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,馬邊彝族網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到馬邊彝族省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!一.前言
微信公眾平臺(tái)的消息處理還是比較完善的,有最基本的文本消息,到圖文消息,到圖片消息,語音消息,視頻消息,音樂消息其基本原理都是一樣的,只不過所post的xml數(shù)據(jù)有所差別,在處理消息之前,我們要認(rèn)真閱讀,官方給我們的文檔:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我們從最基本的文本消息處理開始。
12345678
我們可以看到這是消息處理的一個(gè)最基本的模式,有發(fā)送者,接受者,創(chuàng)建時(shí)間,類型,內(nèi)容等等。
首先我們來創(chuàng)建一個(gè)消息處理的類,這個(gè)類用來捕獲,所有的消息請(qǐng)求,根據(jù)不同的消息請(qǐng)求類型來處理不同的消息回復(fù)。
public class WeiXinService { ////// TOKEN /// private const string TOKEN = "finder"; ////// 簽名 /// private const string SIGNATURE = "signature"; ////// 時(shí)間戳 /// private const string TIMESTAMP = "timestamp"; ////// 隨機(jī)數(shù) /// private const string NONCE = "nonce"; ////// 隨機(jī)字符串 /// private const string ECHOSTR = "echostr"; ////// /// private HttpRequest Request { get; set; } ////// 構(gòu)造函數(shù) /// /// public WeiXinService(HttpRequest request) { this.Request = request; } ////// 處理請(qǐng)求,產(chǎn)生響應(yīng) /// ///public string Response() { string method = Request.HttpMethod.ToUpper(); //驗(yàn)證簽名 if (method == "GET") { if (CheckSignature()) { return Request.QueryString[ECHOSTR]; } else { return "error"; } } //處理消息 if (method == "POST") { return ResponseMsg(); } else { return "無法處理"; } } /// /// 處理請(qǐng)求 /// ///private string ResponseMsg() { string requestXml = CommonWeiXin.ReadRequest(this.Request); IHandler handler = HandlerFactory.CreateHandler(requestXml); if (handler != null) { return handler.HandleRequest(); } return string.Empty; } /// /// 檢查簽名 /// /// ///private bool CheckSignature() { string signature = Request.QueryString[SIGNATURE]; string timestamp = Request.QueryString[TIMESTAMP]; string nonce = Request.QueryString[NONCE]; List list = new List (); 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); //驗(yàn)證 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ù)接收請(qǐng)求,具體處理請(qǐng)求 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)重要。
////// 處理請(qǐng)求 /// ///private string ResponseMsg() { string requestXml = CommonWeiXin.ReadRequest(this.Request); IHandler handler = HandlerFactory.CreateHandler(requestXml); if (handler != null) { return handler.HandleRequest(); } return string.Empty; }
IHandler是一個(gè)消息處理接口,其下面有EventHandler,TextHandler處理類實(shí)現(xiàn)這個(gè)接口。代碼如下
////// 處理接口 /// public interface IHandler { ////// 處理請(qǐng)求 /// ///string HandleRequest(); }
EventHandler
class EventHandler : IHandler { ////// 請(qǐng)求的xml /// private string RequestXml { get; set; } ////// 構(gòu)造函數(shù) /// /// public EventHandler(string requestXml) { this.RequestXml = requestXml; } ////// 處理請(qǐng)求 /// ///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)建的一個(gè)圖文消息處理類 tm.ToUserName = em.FromUserName; tm.FromUserName = em.ToUserName; tm.CreateTime = CommonWeiXin.GetNowTime(); response = tm.GenerateContent(); } return response; } }
TextHandler
////// 文本信息處理類 /// public class TextHandler : IHandler { string openid { get; set; } string access_token { get; set; } ////// 請(qǐng)求的XML /// private string RequestXml { get; set; } ////// 構(gòu)造函數(shù) /// /// 請(qǐng)求的xml public TextHandler(string requestXml) { this.RequestXml = requestXml; } ////// 處理請(qǐng)求 /// ///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; } /// /// 處理其他消息 /// /// ///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
////// 處理器工廠類 /// public class HandlerFactory { ////// 創(chuàng)建處理器 /// /// 請(qǐng)求的xml ///IHandler對(duì)象 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)注我們的微信公眾號(hào),我們就發(fā)送一條圖文消息,同時(shí)輸入我們的一些關(guān)鍵字,返回一些消息,比如輸入id返回用戶的openid等等。
二.PicTextMessage
public class PicTextMessage : Message { ////// 模板靜態(tài)字段 /// private static string m_Template; ////// 默認(rèn)構(gòu)造函數(shù) /// public PicTextMessage() { this.MsgType = "news"; } ////// 從xml數(shù)據(jù)加載文本消息 /// /// 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; } ////// 模板 /// public override string Template { get { if (string.IsNullOrEmpty(m_Template)) { LoadTemplate(); } return m_Template; } } ////// 生成內(nèi)容 /// ///public override string GenerateContent() { this.CreateTime = CommonWeiXin.GetNowTime(); string str= string.Format(this.Template, this.ToUserName, this.FromUserName, this.CreateTime); return str; } /// /// 加載模板 /// private static void LoadTemplate() { m_Template= @""; } } {2} 1
最后我們的效果如下所示;
以上是“.NET開發(fā)微信公眾號(hào)之公眾號(hào)消息怎么處理”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!