4.0接收/ 回傳文字訊息
①接收/回傳文字訊息原理說明
當普通微信用戶傳送訊息給公眾帳號時,微信伺服器將POST訊息的XML資料包到開發者填寫的URL上,著手開發之前先行閱讀微信公眾平台接收普通訊息微信開發文檔,對微信的這種訊息處理機制有一定了解之後再著手開發(微信開發接收普通訊息開發文件)
注意點:
1、關於重試的訊息排重,建議使用msgid排重。
2、微信伺服器在五秒鐘內收不到回應會斷掉連接,並且重新發起請求,總共重試三次。假如伺服器無法保證在五秒內處理並回复,可以直接回复空串,微信伺服器不會對此作任何處理,並且不會發起重試。詳情請見「發送訊息-被動回覆訊息」。
3、為了確保更高的安全保障,開發者可以在公眾平台官網的開發者中心處設定訊息加密。開啟加密後,用戶發送的訊息會被加密,公眾號被動回覆用戶的訊息也需要加密(但開發者透過客服介面等API呼叫形式向用戶發送訊息,則不受影響)。關於訊息加解密的詳細說明,請參閱「訊息加解密說明」。
POST到開發者伺服器上邊的XML格式為:
b2a0af5a8fd26276da50279a1c63a57a ea5d8177d19f22584533e5c37c389942eae09a64d076f96f3228ae9470271e996671a89dce89e879d9e9c6d81d03862b c5123754d1f4829fae4905e8abb602f9590cdcaa06dc33eb0992fff736103f4f42a4b8d57eb0afadcf16b7a02c69caaf 246311df1688542638dc52b54a1a4c871348831860e660f1169ff44ea75c5a982fcb1cde61 42815c2206ae835d7fd68cb4ae21e4dffa796850a1cf5d7bc01ca8cd7f8b83de698463fc03844fbe5a9caafaa1ebd0b1 ea63b4477034504a08070acf4e0b68b26a60ebcd9401786f5b0ee154aab8bf4caa91fa7c40b1cd973268e154dae1a50e 0d388664a03eec4d0f6697867adf11561234567890123456d62559defac6782605cccb28f6907157 21118965b89073f60271ef4a3b5d3c58
接收訊息封包參數說明:
傳回文字訊息的XML格式:
b2a0af5a8fd26276da50279a1c63a57a ea5d8177d19f22584533e5c37c389942eae09a64d076f96f3228ae9470271e996671a89dce89e879d9e9c6d81d03862b c5123754d1f4829fae4905e8abb602f9590cdcaa06dc33eb0992fff736103f4f42a4b8d57eb0afadcf16b7a02c69caaf 246311df1688542638dc52b54a1a4c8712345678e660f1169ff44ea75c5a982fcb1cde61 42815c2206ae835d7fd68cb4ae21e4dffa796850a1cf5d7bc01ca8cd7f8b83de698463fc03844fbe5a9caafaa1ebd0b1 ea63b4477034504a08070acf4e0b68b2212a4684f1079d663286208e36325081aa91fa7c40b1cd973268e154dae1a50e 21118965b89073f60271ef4a3b5d3c58
傳回文字訊息封包參數說明:
②接收/回傳文字訊息程式碼實作
#開發者在自己伺服器上邊接收微信伺服器POST過來的XML封包接收程式碼如下:
if(IsPostBack) { //*********************************自动应答代码块********************************* string postString = string.Empty; using (Stream stream = HttpContext.Current.Request.InputStream) { Byte[] postBytes = new Byte[stream.Length]; stream.Read(postBytes, 0, (Int32)stream.Length); //接收的消息为GBK格式 postString = Encoding.GetEncoding("GBK").GetString(postBytes); string responseContent = help.ReturnMessage(postString ); //返回的消息为UTF-8格式 HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(responseContent); } //********************************自动应答代码块end******************************* }
注意:接收訊息的時候要將訊息格式轉換為「GBK」格式,否則後邊進行訊息解析的時候沒辦法進行有效解析。
ReturnMessage()處理方法程式碼如下:
/// <summary> /// 统一全局返回消息处理方法 /// </summary> /// <param name="postStr"></param> /// <returns></returns> public string ReturnMessage(string postStr) { string responseContent = ""; XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("GB2312").GetBytes(postStr))); XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType"); if (MsgType != null) { switch (MsgType.InnerText) { case "event": responseContent = EventHandle(xmldoc);//菜单事件处理 break; case "text": responseContent = TextHandle(xmldoc);//文本消息处理 break; default: break; } } return responseContent; }
TextHandle(xmldoc)處理方法程式碼如下:
/// <summary> /// 接受文本消息并回复自定义消息 /// </summary> /// <param name="xmldoc"></param> /// <returns></returns> public string TextHandle(XmlDocument xmldoc) { string responseContent = ""; XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName"); XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName"); XmlNode Content = xmldoc.SelectSingleNode("/xml/Content"); if (Content != null) { if (Content.InnerText == "指定回复消息的自定义文本") { responseContent = string.Format(XMLTemplate.Message_Text, FromUserName.InnerText, ToUserName.InnerText, DateTime.Now.Ticks, "自定义回复消息内容"); } } return responseContent; }
到這裡實作功能的程式碼示範已完畢,後邊其他的訊息處理模式也是根據這種方式在做交互,例如:接收/回覆文字訊息、圖片訊息、語音訊息、視訊訊息、小視訊訊息、地理位置訊息、連結訊息等都可以參考以上程式碼進行功能實現。
更多C#微信開發系列-接收 / 回傳文字訊息相關文章請關注PHP中文網!