C#微信開發(fā)之接收 / 返回文本消息
接收 / 返回文本消息
①接收/返回文本消息原理說明
當普通微信用戶向公眾賬號發(fā)消息時,微信服務器將POST消息的XML數(shù)據(jù)包到開發(fā)者填寫的URL上,著手開發(fā)之前先行閱讀微信公眾平臺接收普通消息微信開發(fā)文檔,對微信的這種消息處理機制有一定了解之后再著手開發(fā)(微信開發(fā)接收普通消息開發(fā)文檔)
注意點:
1、關于重試的消息排重,推薦使用msgid排重。
2、微信服務器在五秒內(nèi)收不到響應會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務器無法保證在五秒內(nèi)處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發(fā)起重試。詳情請見“發(fā)送消息-被動回復消息”。
3、為了保證更高的安全保障,開發(fā)者可以在公眾平臺官網(wǎng)的開發(fā)者中心處設置消息加密。開啟加密后,用戶發(fā)來的消息會被加密,公眾號被動回復用戶的消息也需要加密(但開發(fā)者通過客服接口等API調(diào)用形式向用戶發(fā)送消息,則不受影響)。關于消息加解密的詳細說明,請見“消息加解密說明”。
POST到開發(fā)者服務器上邊的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>
接收消息數(shù)據(jù)包參數(shù)說明:

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

②接收/返回文本消息代碼實現(xiàn)
開發(fā)者在自己服務器上邊接收微信服務器POST過來的XML數(shù)據(jù)包接收代碼如下:
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*******************************
}
注意:接收消息的時候要將消息格式轉(zhuǎn)化為“GBK”格式,否則后邊進行消息解析的時候沒辦法進行有效解析。
ReturnMessage()處理方法代碼如下:
/// <summary>
/// 統(tǒng)一全局返回消息處理方法
/// </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,
"自定義回復消息內(nèi)容");
}
}
return responseContent;
}
到這里實現(xiàn)功能的代碼演示已完畢,后邊其他的消息處理模式也是根據(jù)這種方式在做交互,比如:接收/回復文本消息、圖片消息、語音消息、視頻消息、小視頻消息、地理位置消息、鏈接消息等都可以參照以上代碼進行功能實現(xiàn)。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
WPF+ASP.NET SignalR實現(xiàn)后臺通知功能的示例代碼
本文以一個簡單示例,簡述如何通過WPF+ASP.NET SignalR實現(xiàn)消息后臺通知以及數(shù)據(jù)的實時刷新,僅供學習分享使用,如有不足之處,還請指正2022-09-09
基于Silverlight DataGrid中無代碼設置開始與結(jié)束日期DatePicker的實現(xiàn)方法
本篇文章是對Silverlight DataGrid中無代碼設置開始與結(jié)束日期DatePicker的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05

