①接收/返回文本消息原理說明
當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上,著手開發之前先行閱讀微信公眾平台接收普通消息微信開發文檔,對微信的這種消息處理機制有一定了解之後再著手開發(微信開發接收普通消息開發文檔)
注意點:
1、關於重試的消息排重,推薦使用msgid排重。
2、微信服務器在五秒內收不到響應會斷掉連接,並且重新發起請求,總共重試三次。假如服務器無法保證在五秒內處理並回復,可以直接回復空串,微信服務器不會對此作任何處理,並且不會發起重試。詳情請見“發送消息-被動回復消息”。
3、為了保證更高的安全保障,開發者可以在公眾平台官網的開發者中心處設置消息加密。開啟加密後,用戶發來的消息會被加密,公眾號被動回復用戶的消息也需要加密(但開發者通過客服接口等API調用形式向用戶發送消息,則不受影響)。關於消息加解密的詳細說明,請見“消息加解密說明”。
POST到開發者服務器上邊的XML格式為:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
接收消息數據包參數說明:

返回文本消息的XML格式:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
返回文本消息數據包參數說明:

②接收/返回文本消息代碼實現
開發者在自己服務器上邊接收微信服務器POST過來的XML數據包接收代碼如下:
1 if(IsPostBack)
2 {
3 //*********************************自動應答代碼塊*********************************
4 string postString = string.Empty;
5 using (Stream stream = HttpContext.Current.Request.InputStream)
6 {
7 Byte[] postBytes = new Byte[stream.Length];
8 stream.Read(postBytes, 0, (Int32)stream.Length);
9 //接收的消息為GBK格式
10 postString = Encoding.GetEncoding("GBK").GetString(postBytes);
11 string responseContent = help.ReturnMessage(postString );
12 //返回的消息為UTF-8格式
13 HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
14 HttpContext.Current.Response.Write(responseContent);
15 }
16 //********************************自動應答代碼塊end*******************************
17 }
注意:接收消息的時候要將消息格式轉化為“GBK”格式,否則後邊進行消息解析的時候沒辦法進行有效解析。
ReturnMessage()處理方法代碼如下:
1 /// <summary>
2 /// 統一全局返回消息處理方法
3 /// </summary>
4 /// <param name="postStr"></param>
5 /// <returns></returns>
6 public string ReturnMessage(string postStr)
7 {
8 string responseContent = "";
9 XmlDocument xmldoc = new XmlDocument();
10 xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("GB2312").GetBytes(postStr)));
11 XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
12 if (MsgType != null)
13 {
14 switch (MsgType.InnerText)
15 {
16 case "event":
17 responseContent = EventHandle(xmldoc);//菜單事件處理
18 break;
19 case "text":
20 responseContent = TextHandle(xmldoc);//文本消息處理
21 break;
22 default:
23 break;
24 }
25 }
26 return responseContent;
27 }
TextHandle(xmldoc)處理方法代碼如下:
1 /// <summary>
2 /// 接受文本消息並回復自定義消息
3 /// </summary>
4 /// <param name="xmldoc"></param>
5 /// <returns></returns>
6 public string TextHandle(XmlDocument xmldoc)
7 {
8 string responseContent = "";
9 XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
10 XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
11 XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
12 if (Content != null)
13 {
14 if (Content.InnerText == "指定回復消息的自定義文本")
15 {
16 responseContent = string.Format(XMLTemplate.Message_Text,
17 FromUserName.InnerText,
18 ToUserName.InnerText,
19 DateTime.Now.Ticks,
20 "自定義回復消息內容");
21 }
22 }
23 return responseContent;
24 }
到這裡實現功能的代碼演示已完畢,後邊其他的消息處理模式也是根據這種方式在做交互,比如:接收/回復文本消息、圖片消息、語音消息、視頻消息、小視頻消息、地理位置消息、鏈接消息等都可以參照以上代碼進行功能實現。
如果你對《C#微信開發系列》這個系列感興趣的話,可以關注我的其他文章(持續更新中...),系列隨筆地址如下:
《C#微信開發系列(Top)-微信開發完整學習路線》
《C#微信開發系列(4)-接收 / 返回文本消息》
《C#微信開發系列(3)-獲取接口調用憑據》
《C#微信開發系列(2)-自定義菜單管理》
《C#微信開發系列(1)-啟用開發者模式》