當普通微信用戶向公眾賬號發(fā)消息時,微信服務器將POST消息的XML數據包到開發(fā)者填寫的URL上。
請注意:
1、關于重試的消息排重,推薦使用msgid排重。 2、微信服務器在五秒內收不到響應會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務器無法保證在五秒內處理并回復,可以直接回復空串,微信服務器不會對此作任何處理,并且不會發(fā)起重試。詳情請見“發(fā)送消息-被動回復消息”。 3、為了保證更高的安全保障,開發(fā)者可以在公眾平臺官網的開發(fā)者中心處設置消息加密。開啟加密后,用戶發(fā)來的消息會被加密,公眾號被動回復用戶的消息也需要加密(但開發(fā)者通過客服接口等API調用形式向用戶發(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>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | text |
Content | 文本消息內容 |
MsgId | 消息id,64位整型 |
圖片消息
?<xml> ?<ToUserName><![CDATA[toUser]]></ToUserName> ?<FromUserName><![CDATA[fromUser]]></FromUserName> ?<CreateTime>1348831860</CreateTime> ?<MsgType><![CDATA[image]]></MsgType> ?<PicUrl><![CDATA[this is a url]]></PicUrl> ?<MediaId><![CDATA[media_id]]></MediaId> ?<MsgId>1234567890123456</MsgId> ?</xml>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | image |
PicUrl | 圖片鏈接 |
MediaId | 圖片消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
MsgId | 消息id,64位整型 |
語音消息
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | 語音為voice |
MediaId | 語音消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
Format | 語音格式,如amr,speex等 |
MsgID | 消息id,64位整型 |
請注意,開通語音識別后,用戶每次發(fā)送語音給公眾號時,微信會在推送的語音消息XML數據包中,增加一個Recongnition字段 (注:由于客戶端緩存,開發(fā)者開啟或者關閉語音識別功能,對新關注者立刻生效,對已關注用戶需要24小時生效。開發(fā)者可以重新關注此帳號進行測試)。開啟 語音識別后的語音XML數據包如下:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <Recognition><![CDATA[騰訊微信團隊]]></Recognition> <MsgId>1234567890123456</MsgId> </xml>
多出的字段中,Format為語音格式,一般為amr,Recognition為語音識別結果,使用UTF8編碼。
視頻消息
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[video]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | 視頻為video |
MediaId | 視頻消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
ThumbMediaId | 視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據。 |
MsgId | 消息id,64位整型 |
小視頻消息
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[shortvideo]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | 小視頻為shortvideo |
MediaId | 視頻消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
ThumbMediaId | 視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據。 |
MsgId | 消息id,64位整型 |
地理位置消息
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | location |
Location_X | 地理位置維度 |
Location_Y | 地理位置經度 |
Scale | 地圖縮放大小 |
Label | 地理位置信息 |
MsgId | 消息id,64位整型 |
鏈接消息
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[公眾平臺官網鏈接]]></Title> <Description><![CDATA[公眾平臺官網鏈接]]></Description> <Url><![CDATA[url]]></Url> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 接收方微信號 |
FromUserName | 發(fā)送方微信號,若為普通用戶,則是一個OpenID |
CreateTime | 消息創(chuàng)建時間 |
MsgType | 消息類型,link |
Title | 消息標題 |
Description | 消息描述 |
Url | 消息鏈接 |
MsgId | 消息id,64位整型 |
接上篇,看ResponseXML(postString);方法如下
? ///
??????? /// 獲取用戶發(fā)送的消息
??????? ///
??????? ///
??????? private void ResponseXML(string postString)
??????? {
??????????? //使用XMLDocument加載信息結構??????????????????? ?
??????????? XmlDocument xmlDoc = new XmlDocument();
??????????? xmlDoc.LoadXml(postString);
??????????? XmlElement rootElement = xmlDoc.DocumentElement;//獲取文檔的根
??????????? XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //獲取消息的文本類型
??????????? RequestXML requestXML = new RequestXML();//聲明實例,獲取各個屬性并賦值
??????????? requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//公眾號
??????????? requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//用戶
??????????? requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//創(chuàng)建時間
??????????? requestXML.MsgType = MsgType.InnerText;//消息類型
??????????? ///對消息的不同類型進行賦值
??????????? if (requestXML.MsgType == "text")
??????????? {
??????????????? //賦值文本信息內容
??????????????? requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
??????????? }
??????????? if (requestXML.MsgType.Trim() == "location")
??????????? {
??????????????? ///賦值地理位置緯度,經度,地圖縮放比例,地理位置說明
??????????????? requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
??????????????? requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
??????????????? requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
??????????????? requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
??????????? }
??????????? if (requestXML.MsgType.Trim().ToLower() == "event")
??????????? {
??????????????? ///賦值事件名稱和事件key值
??????????????? requestXML.EventName = rootElement.SelectSingleNode("Event").InnerText;
??????????????? requestXML.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
??????????? }
? if (requestXML.MsgType.Trim().ToLower() == "voice")
??????????? {
??????????????? ///賦值語音識別結果,賦值之前一定要記得在開發(fā)者模式下,把語音識別功能開啟,否則獲取不到
??????????????? requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText;
??????????? }
??????????? ResponseMsg(requestXML);
}
?語音識別功能開啟如下:
requestXML是我單獨創(chuàng)建的一個類,該類聲明了消息中常用的屬性字段,如下:
?///
??? /// 接收消息的實體類
??? ///
??? public class RequestXML
??? {
??????? private String toUserName = String.Empty;
??????? ///
??????? /// 本公眾號
??????? ///
??????? public String ToUserName{get;set;}
??????? ///
??????? /// 用戶微信號
??????? ///
??????? public String FromUserName{get;set;}
??????? ///
??????? /// 創(chuàng)建時間
??????? ///
??????? public String CreateTime{get;set;}
??????? ///
??????? /// 信息類型
??????? ///
??????? public String MsgType{get;set;}
??????? ///
??????? /// 信息內容
??????? ///
??????? public String Content{get;set;}
??????? /*以下為事件類型的消息特有的屬性*/
??????? ///
??????? /// 事件名稱
??????? ///
??????? public String EventName{get;set;}
??????? ///
??????? /// 事件值
??????? ///
??????? public string EventKey { get; set; }
??????? /*以下為圖文類型的消息特有的屬性*/
??????? ///
??????? /// 圖文消息的個數
??????? ///
??????? public int ArticleCount { get; set; }
??????? ///
??????? /// 圖文消息的標題
??????? ///
??????? public string Title { get; set; }
??????? ///
??????? /// 圖文消息的簡介
??????? ///
??????? public string Description { get; set; }
??????? ///
??????? /// 圖文消息圖片的鏈接地址
??????? ///
??????? public string PicUrl { get; set; }
??????? ///
??????? /// 圖文消息詳情鏈接地址
??????? ///
??????? public string Url { get; set; }
??????? ///
??????? /// 圖文消息集合
??????? ///
??????? public List
??????? /*以下為地理位置類型的消息特有的屬性*/
??????? ///
??????? /// 地理位置緯度
??????? ///
??????? public String Location_X { get; set; }
??????? ///
??????? /// 地理位置經度
??????? ///
??????? public String Location_Y { get; set; }
??????? ///
??????? /// 地圖縮放比例
??????? ///
??????? public String Scale { get; set; }
??????? ///
??????? /// 地圖位置說明
??????? ///
??????? public String Label { get; set; }
? ///
??????? /// 語音消息特有字段
??????? ///
??????? public String Recognition { get; set; }
??? ?
??? }
繼續(xù)關注? ResponseMsg(requestXML);方法如下,
?private void ResponseMsg(RequestXML requestXML)
??????? {
??????????? string MsgType = requestXML.MsgType;
??????????? try
??????????? {
??????????????? //根據消息類型判斷發(fā)送何種類型消息
??????????????? switch (MsgType)
??????????????? {
??????????????????? case "text":
??????????????????????? SendTextCase(requestXML);//發(fā)送文本消息
??????????????????????? break;
??????????????????? case "event"://發(fā)送事件消息
??????????????????????? if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("subscribe"))
??????????????????????? {
??????????????????????????? SendWelComeMsg(requestXML);//關注時返回的圖文消息
??????????????????????? }
??????????????????????? else if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("CLICK"))
??????????????????????? {
??????????????????????????? SendEventMsg(requestXML);//發(fā)送事件消息
??????????????????????? }
??????????????????????? break;
?case "voice":
??????????????????????? SendVoiceMsg(requestXML);//發(fā)送語音消息
??????????????????????? break;
??????????????????? case "location"://發(fā)送位置消息
??????????????????????? SendMapMsg(requestXML);
??????????????????????? break;
??????????????????? default:
??????????????????????? break;
??????????????? }
??????????? }
??????????? catch (Exception ex)
??????????? {
??????????????? HttpContext.Current.Response.Write(ex.ToString());
??????????? }
??????? }
先來關注發(fā)送文本消息,SendTextCase(requestXML);//發(fā)送文本消息
?///
??????? /// 發(fā)送文本
??????? ///
??????? ///
??????? private void SendTextCase(RequestXML requestXML)
??????? {
??????????????????? string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, requestXML.Content);
??????????????????? HttpContext.Current.Response.ContentType = "text/xml";
??????????????????? HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
??????????????????? HttpContext.Current.Response.Write(responseContent);
??????????????????? HttpContext.Current.Response.End();
??????? }
FormatTextXML方法制定格式
? ///
??????? /// 返回格式化的Xml格式內容
??????? ///
??????? /// 公眾號
??????? /// 用戶號
??????? /// 回復內容
??????? ///
??????? private string FormatTextXML(string p1, string p2, string p3)
??????? {
??????????? return "
??????? }
這樣就能實現消息的應答,如果用戶點擊的按鈕,如下代碼:
??? case "event"://發(fā)送事件消息
??????????????????????? if
(!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("subscribe"))
??????????????????????? {
??????????????????????????? SendWelComeMsg(requestXML);//關注時返回的圖文消息
??????????????????????? }
???????????????????????
else if (!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("CLICK"))
??????????????????????? {
??????????????????????????? SendEventMsg(requestXML);//發(fā)送事件消息
??????????????????????? }
??????????????????????? break;
?///
??????? /// 發(fā)送響應事件消息
??????? ///
??????? ///
??????? private void SendEventMsg(RequestXML requestXML)
??????? {
??????????? string keyStr = requestXML.EventKey.ToString();
??????????? switch (keyStr)
??????????? {
??????????????? case "mypay":
??????????????????? SendPayDetails(requestXML);//發(fā)送薪資賬單
??????????????????? break;
??????????????? case "tianqiyubao":
??????????????????? SendWeaterMessage(requestXML);//發(fā)送天氣預報
??????????????????? break;
??????????????? case "kaixinyixiao":
??????????????????? SendKaiXinMessage(requestXML);//發(fā)送開心一笑結果集
??????????????????? break;
??????????????? case? "updateMessage":
??????????????????? SendUpdateMessage(requestXML);//發(fā)送修改信息鏈接
??????????????????? break;
??????????????? case "yuangonghuodong":
??????????????????? SendYuanGongHuoDong(requestXML);//發(fā)送學生活動
??????????????????? break;
??????????????? case "yuangongtongzhi":
??????????????????? SendYuanGongTongZhi(requestXML);//發(fā)送員工通知
??????????????????? break;
??????????????? case "youwenbida":
??????????????????? SendWenti(requestXML);//發(fā)送員工提交問題鏈接
??????????????????? break;
?????????????? case "mywen":
??????????????????? SendWentiList(requestXML);//發(fā)送問題列表鏈接
??????????????????? break;
?????????????? case "PhoneSerices":
??????????????????? SendKeFuMessage(requestXML);//接入客服
??????????????????? break;
??????????????? default:
??????????????????? String responseContent = String.Empty;
??????????????????? responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName,"此功能暫未開放!敬請期待!");
??????????????????? HttpContext.Current.Response.ContentType = "text/xml";
??????????????????? HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
??????????????????? HttpContext.Current.Response.Write(responseContent);
??????????????????? HttpContext.Current.Response.End();
??????????????????? break;
??????????? }
??????? }
SendWelComeMsg(requestXML);//關注時返回的圖文消息
? ///
??????? /// 發(fā)送關注時的圖文消息
??????? ///
??????? ///
??????? private void SendWelComeMsg(RequestXML requestXML)
??????? {
??????????? String responseContent = String.Empty;
??????????? string newdate = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString();
??????????? string PUrlfileName = "http://www.deqiaohr.com.cn/weixin/welcome.jpg";
??????????? responseContent = string.Format(Message_News_Main, requestXML.FromUserName, requestXML.ToUserName, newdate, "1",
??????????????? string.Format(Message_News_Item, "歡迎關注德橋員工服務中心", "蘇州德橋人力資源創(chuàng)立于2002年...", PUrlfileName, "http://www.deqiaohr.com.cn/weixin/WxGsjianjie.aspx"));
??????????? HttpContext.Current.Response.ContentType = "text/xml";
??????????? HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
??????????? HttpContext.Current.Response.Write(responseContent);
??????????? HttpContext.Current.Response.End();
??????? }
Message_News_Main 和Message_News_Item是圖文消息格式化
? ///
??????? /// 返回圖文消息主體
??????? ///
??????? public static string Message_News_Main
??????? {
??????????? get
??????????? {
??????????????? return @"
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
???????????????????????????? {4}
??????????????????????????
??????????????????????????
??????????? }
??????? }
??????? ///
??????? /// 返回圖文消息項
??????? ///
??????? public static string Message_News_Item
??????? {
??????????? get
??????????? {
??????????????? return @"
???????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
??????????? }
??????? }
?? ///
??????? /// 發(fā)送響應語音識別結果
??????? ///
??????? ///
??????? private void SendVoiceMsg(RequestXML requestXML)
??????? {
??????????? string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您剛才說的語音消息識別結果為:" + requestXML.Recognition.ToString());
??????????? HttpContext.Current.Response.ContentType = "text/xml";
??????????? HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
??????????? HttpContext.Current.Response.Write(responseContent);
??????????? HttpContext.Current.Response.End();
??????? }
點擊查看全文,直接跳轉至自己寫的網頁,關于網頁圖片自適應的問題,把圖片的寬度設置為100%,即可,如果讓網頁在屏幕中自適應,記得在網頁中一定要添加
以上是詳解asp.net微信開發(fā)消息應答方法的詳細內容。更多信息請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)