當普通微信用戶向公衆帳號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上,着手開發以前先行閱讀微信公衆平臺接收普通消息微信開發文檔,對微信的這種消息處理機制有必定了解以後再着手開發(微信開發接收普通消息開發文檔)html
注意點:安全
一、關於重試的消息排重,推薦使用msgid排重。服務器
二、微信服務器在五秒內收不到響應會斷掉鏈接,而且從新發起請求,總共重試三次。假如服務器沒法保證在五秒內處理並回復,能夠直接回復空串,微信服務器不會對此做任何處理,而且不會發起重試。詳情請見「發送消息-被動回覆消息」。微信
三、爲了保證更高的安全保障,開發者能夠在公衆平臺官網的開發者中心處設置消息加密。開啓加密後,用戶發來的消息會被加密,公衆號被動回覆用戶的消息也須要加密(但開發者經過客服接口等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>
接收消息數據包參數說明:post
返回文本消息的XML格式: 學習
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
返回文本消息數據包參數說明:this
開發者在本身服務器上邊接收微信服務器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#微信開發系列》這個系列感興趣的話,能夠關注個人其餘文章(持續更新中...),系列隨筆地址以下: