


Detailed explanation of the public account message processing method for developing WeChat public accounts using .NET
Mar 14, 2017 pm 02:09 PMThis article tells you about the message processing of public accounts in the development of .net WeChat public accounts. It is very detailed. Friends in need can refer to it.
1. Foreword
The message processing of the WeChat public platform is relatively complete, ranging from the most basic text messages, to graphic messages, to picture messages, and voice messages , Video messages, and music messages. The basic principles are the same, but the xml data posted is different. Before processing the message, we must read it carefully. The official Documentation: http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html. First we start with the most basic text message processing.
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
We can see that this is the most basic pattern of message processing, with sender, receiver, creation time, type, content, etc.
First we create a message processing class. This class is used to capture all message requests and process different message replies according to different message request types.
public class WeiXinService { /// <summary> /// TOKEN /// </summary> private const string TOKEN = "finder"; /// <summary> /// 簽名 /// </summary> private const string SIGNATURE = "signature"; /// <summary> /// 時(shí)間戳 /// </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> /// 處理請(qǐng)求,產(chǎn)生響應(yīng) /// </summary> /// <returns></returns> 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 "無(wú)法處理"; } } /// <summary> /// 處理請(qǐng)求 /// </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); //驗(yàn)證 if (new_signature == signature) { return true; } else { return false; } } }
Let’s take a look at how we capture the message first. The code of Default.ashx on the home page is as follows
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(); } } }
From the above code we can see that the messages in the WeiXinService.cs class are very important.
/// <summary> /// 處理請(qǐng)求 /// </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 is a message processing interface , underneath it is EventHandler, and the TextHandler processing class implements this interface. The code is as follows
/// <summary> /// 處理接口 /// </summary> public interface IHandler { /// <summary> /// 處理請(qǐng)求 /// </summary> /// <returns></returns> string HandleRequest(); }
EventHandler
class EventHandler : IHandler { /// <summary> /// 請(qǐng)求的xml /// </summary> private string RequestXml { get; set; } /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="requestXml"></param> public EventHandler(string requestXml) { this.RequestXml = requestXml; } /// <summary> /// 處理請(qǐng)求 /// </summary> /// <returns></returns> public string HandleRequest() { string response = string.Empty; EventMessage em = EventMessage.LoadFromXml(RequestXml); if (em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//用來(lái)判斷是不是首次關(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
##
/// <summary> /// 文本信息處理類 /// </summary> public class TextHandler : IHandler { string openid { get; set; } string access_token { get; set; } /// <summary> /// 請(qǐng)求的XML /// </summary> private string RequestXml { get; set; } /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="requestXml">請(qǐng)求的xml</param> public TextHandler(string requestXml) { this.RequestXml = requestXml; } /// <summary> /// 處理請(qǐng)求 /// </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"))//用來(lái)匹配用戶輸入的關(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">請(qǐng)求的xml</param> /// <returns>IHandler對(duì)象</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; } }Some basic classes here have been completed. Now let’s complete it. Follow our WeChat official account and we will send a graphic message. At the same time Enter some of our keywords and return some messages, such as entering the id to return the user's openid, etc. 二.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[如有問(wèn)題請(qǐng)致電400-6238-136或直接在微信留言,我們將第一時(shí)間為您服務(wù)!]]></Description> <PicUrl><![CDATA[http://ipnx.cn/]]></PicUrl> <Url><![CDATA[http://ipnx.cn/]]></Url> </item> </Articles> </xml> "; } }Finally our effect is as follows;
The above is the detailed content of Detailed explanation of the public account message processing method for developing WeChat public accounts using .NET. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)