這篇文章主要介紹了asp.net微信開發(fā)中有關(guān)訊息應(yīng)答的相關(guān)內(nèi)容,需要的朋友可以參考下
當(dāng)普通微信用戶向公眾帳號(hào)發(fā)送訊息時(shí),微信伺服器將POST訊息的XML封包到開發(fā)者填寫的URL上。
請(qǐng)注意:
1、關(guān)於重試的訊息排重,建議使用msgid排重。
2、微信伺服器在五秒鐘內(nèi)收不到回應(yīng)會(huì)斷掉連接,並且重新發(fā)起請(qǐng)求,總共重試三次。假如伺服器無(wú)法保證在五秒內(nèi)處理並回復(fù),可以直接回復(fù)空串,微信伺服器不會(huì)對(duì)此作任何處理,並且不會(huì)發(fā)起重試。詳情請(qǐng)見(jiàn)「發(fā)送訊息-被動(dòng)回覆訊息」。
3、為了確保更高的安全保障,開發(fā)者可以在公眾平臺(tái)官網(wǎng)的開發(fā)者中心處設(shè)定訊息加密。開啟加密後,用戶發(fā)送的訊息會(huì)被加密,公眾號(hào)被動(dòng)回覆用戶的訊息也需要加密(但開發(fā)者透過(guò)客服介面等API呼叫形式向用戶發(fā)送訊息,則不受影響)。關(guān)於訊息加解密的詳細(xì)說(shuō)明,請(qǐng)參閱「訊息加解密說(shuō)明」。
各訊息類型的推送XML封包結(jié)構(gòu)如下:
文字訊息
<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> <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>
?
#語(yǔ)音訊息
<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>
#?請(qǐng)注意,開啟語(yǔ)音辨識(shí)後,使用者每次傳送語(yǔ)音給公用號(hào)碼時(shí),微信會(huì)在推送的語(yǔ)音訊息XML資料包中,增加一個(gè)Recongnition欄位(註:由於客戶端緩存,開發(fā)者開啟或關(guān)閉語(yǔ)音辨識(shí)功能,對(duì)新追蹤者立刻生效,對(duì)已關(guān)注用戶需要24小時(shí)生效。開發(fā)者可以重新關(guān)注此帳號(hào)進(jìn)行測(cè)試)。開啟語(yǔ)音辨識(shí)後的語(yǔ)音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[騰訊微信團(tuán)隊(duì)]]></Recognition> <MsgId>1234567890123456</MsgId> </xml>
多出的欄位中,F(xiàn)ormat為語(yǔ)音格式,一般為amr,Recognition為語(yǔ)音辨識(shí)結(jié)果,使用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>
?
小視頻訊息
<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>
#?地理位置訊息
<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>
?
#連結(jié)訊息
##
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[公眾平臺(tái)官網(wǎng)鏈接]]></Title> <Description><![CDATA[公眾平臺(tái)官網(wǎng)鏈接]]></Description> <Url><![CDATA[url]]></Url> <MsgId>1234567890123456</MsgId> </xml>
?
#
/// <summary> /// 獲取用戶發(fā)送的消息 /// </summary> /// <param name="postString"></param> private void ResponseXML(string postString) { //使用XMLDocument加載信息結(jié)構(gòu) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(postString); XmlElement rootElement = xmlDoc.DocumentElement;//獲取文檔的根 XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //獲取消息的文本類型 RequestXML requestXML = new RequestXML();//聲明實(shí)例,獲取各個(gè)屬性并賦值 requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//公眾號(hào) requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//用戶 requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//創(chuàng)建時(shí)間 requestXML.MsgType = MsgType.InnerText;//消息類型 ///對(duì)消息的不同類型進(jìn)行賦值 if (requestXML.MsgType == "text") { //賦值文本信息內(nèi)容 requestXML.Content = rootElement.SelectSingleNode("Content").InnerText; } if (requestXML.MsgType.Trim() == "location") { ///賦值地理位置緯度,經(jīng)度,地圖縮放比例,地理位置說(shuō)明 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") { ///賦值語(yǔ)音識(shí)別結(jié)果,賦值之前一定要記得在開發(fā)者模式下,把語(yǔ)音識(shí)別功能開啟,否則獲取不到 requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText; } ResponseMsg(requestXML); }
語(yǔ)音辨識(shí)功能開啟如下:#
requestXML是我單獨(dú)創(chuàng)建的一個(gè)類,該類聲明了消息中常用的屬性字段,如下:
/// <summary> /// 接收消息的實(shí)體類 /// </summary> public class RequestXML { private String toUserName = String.Empty; /// <summary> /// 本公眾號(hào) /// </summary> public String ToUserName{get;set;} /// <summary> /// 用戶微信號(hào) /// </summary> public String FromUserName{get;set;} /// <summary> /// 創(chuàng)建時(shí)間 /// </summary> public String CreateTime{get;set;} /// <summary> /// 信息類型 /// </summary> public String MsgType{get;set;} /// <summary> /// 信息內(nèi)容 /// </summary> public String Content{get;set;} /*以下為事件類型的消息特有的屬性*/ /// <summary> /// 事件名稱 /// </summary> public String EventName{get;set;} /// <summary> /// 事件值 /// </summary> public string EventKey { get; set; } /*以下為圖文類型的消息特有的屬性*/ /// <summary> /// 圖文消息的個(gè)數(shù) /// </summary> public int ArticleCount { get; set; } /// <summary> /// 圖文消息的標(biāo)題 /// </summary> public string Title { get; set; } /// <summary> /// 圖文消息的簡(jiǎn)介 /// </summary> public string Description { get; set; } /// <summary> /// 圖文消息圖片的鏈接地址 /// </summary> public string PicUrl { get; set; } /// <summary> /// 圖文消息詳情鏈接地址 /// </summary> public string Url { get; set; } /// <summary> /// 圖文消息集合 /// </summary> public List<RequestXML> Articles { get; set;} /*以下為地理位置類型的消息特有的屬性*/ /// <summary> /// 地理位置緯度 /// </summary> public String Location_X { get; set; } /// <summary> /// 地理位置經(jīng)度 /// </summary> public String Location_Y { get; set; } /// <summary> /// 地圖縮放比例 /// </summary> public String Scale { get; set; } /// <summary> /// 地圖位置說(shuō)明 /// </summary> public String Label { get; set; } /// <summary> /// 語(yǔ)音消息特有字段 /// </summary> public String Recognition { get; set; } }
繼續(xù)關(guān)注 ResponseMsg(requestXML);方法如下
private void ResponseMsg(RequestXML requestXML) { string MsgType = requestXML.MsgType; try { //根據(jù)消息類型判斷發(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);//關(guān)注時(shí)返回的圖文消息 } else if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("CLICK")) { SendEventMsg(requestXML);//發(fā)送事件消息 } break; case "voice": SendVoiceMsg(requestXML);//發(fā)送語(yǔ)音消息 break; case "location"://發(fā)送位置消息 SendMapMsg(requestXML); break; default: break; } } catch (Exception ex) { HttpContext.Current.Response.Write(ex.ToString()); } }
先來(lái)關(guān)注發(fā)送文本消息,SendTextCase(requestXML);//發(fā)送文本消息
/// <summary> /// 發(fā)送文本 /// </summary> /// <param name="requestXML"></param> 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方法制定格式
/// <summary> /// 返回格式化的Xml格式內(nèi)容 /// </summary> /// <param name="p1">公眾號(hào)</param> /// <param name="p2">用戶號(hào)</param> /// <param name="p3">回復(fù)內(nèi)容</param> /// <returns></returns> private string FormatTextXML(string p1, string p2, string p3) { return "<xml><ToUserName><![CDATA[" + p1 + "]]></ToUserName><FromUserName><![CDATA[" + p2 + "]]></FromUserName><CreateTime>" + DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + p3 + "]]></Content><FuncFlag>1</FuncFlag></xml>"; }
這樣就能實(shí)現(xiàn)消息的應(yīng)答,如果用戶點(diǎn)擊的按鈕,如下代碼:
case "event"://發(fā)送事件消息 if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("subscribe")) { SendWelComeMsg(requestXML);//關(guān)注時(shí)返回的圖文消息 } else if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("CLICK")) { SendEventMsg(requestXML);//發(fā)送事件消息 } break; /// <summary> /// 發(fā)送響應(yīng)事件消息 /// </summary> /// <param name="requestXML"></param> private void SendEventMsg(RequestXML requestXML) { string keyStr = requestXML.EventKey.ToString(); switch (keyStr) { case "mypay": SendPayDetails(requestXML);//發(fā)送薪資賬單 break; case "tianqiyubao": SendWeaterMessage(requestXML);//發(fā)送天氣預(yù)報(bào) break; case "kaixinyixiao": SendKaiXinMessage(requestXML);//發(fā)送開心一笑結(jié)果集 break; case "updateMessage": SendUpdateMessage(requestXML);//發(fā)送修改信息鏈接 break; case "yuangonghuodong": SendYuanGongHuoDong(requestXML);//發(fā)送學(xué)生活動(dòng) break; case "yuangongtongzhi": SendYuanGongTongZhi(requestXML);//發(fā)送員工通知 break; case "youwenbida": SendWenti(requestXML);//發(fā)送員工提交問(wèn)題鏈接 break; case "mywen": SendWentiList(requestXML);//發(fā)送問(wèn)題列表鏈接 break; case "PhoneSerices": SendKeFuMessage(requestXML);//接入客服 break; default: String responseContent = String.Empty; responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName,"此功能暫未開放!敬請(qǐng)期待!"); HttpContext.Current.Response.ContentType = "text/xml"; HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(responseContent); HttpContext.Current.Response.End(); break; } }
SendWelComeMsg(requestXML);//關(guān)注時(shí)返回的圖文消息
/// <summary> /// 發(fā)送關(guān)注時(shí)的圖文消息 /// </summary> /// <param name="requestXML"></param> 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, "歡迎關(guān)注德橋員工服務(wù)中心", "蘇州德橋人力資源創(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是圖文消息格式化
/// <summary> /// 返回圖文消息主體 /// </summary> public static string Message_News_Main { get { return @"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>{3}</ArticleCount> <Articles> {4} </Articles> </xml> "; } } /// <summary> /// 返回圖文消息項(xiàng) /// </summary> public static string Message_News_Item { get { return @"<item> <Title><![CDATA[{0}]]></Title> <Description><![CDATA[{1}]]></Description> <PicUrl><![CDATA[{2}]]></PicUrl> <Url><![CDATA[{3}]]></Url> </item>"; } } /// <summary> /// 發(fā)送響應(yīng)語(yǔ)音識(shí)別結(jié)果 /// </summary> /// <param name="requestXML"></param> private void SendVoiceMsg(RequestXML requestXML) { string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您剛才說(shuō)的語(yǔ)音消息識(shí)別結(jié)果為:" + requestXML.Recognition.ToString()); HttpContext.Current.Response.ContentType = "text/xml"; HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(responseContent); HttpContext.Current.Response.End(); }
以上是asp.net微信開發(fā)訊息應(yīng)答的技巧的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

PHP是一種開源的腳本語(yǔ)言,廣泛應(yīng)用於網(wǎng)頁(yè)開發(fā)和伺服器端編程,尤其在微信開發(fā)中得到了廣泛的應(yīng)用。如今,越來(lái)越多的企業(yè)和開發(fā)者開始使用PHP進(jìn)行微信開發(fā),因?yàn)樗蔀榱苏嬲囊讓W(xué)易用的開發(fā)語(yǔ)言。在微信開發(fā)中,訊息的加密和解密是一個(gè)非常重要的問(wèn)題,因?yàn)樗鼈兩婕百Y料的安全性。對(duì)於沒(méi)有加密和解密方式的消息,駭客可以輕鬆取得其中的數(shù)據(jù),對(duì)用戶造成威脅

在微信公眾號(hào)開發(fā)中,投票功能經(jīng)常被運(yùn)用。投票功能是讓使用者快速參與互動(dòng)的好方式,也是舉辦活動(dòng)和調(diào)查意見(jiàn)的重要工具。本文將為您介紹如何使用PHP實(shí)作微信投票功能。在取得微信公眾號(hào)授權(quán)首先,你需要取得微信公眾號(hào)的授權(quán)。在微信公眾平臺(tái)上,你需要設(shè)定微信公眾號(hào)碼的api地址、官方帳號(hào)和公眾號(hào)碼對(duì)應(yīng)的token。在我們使用PHP語(yǔ)言開發(fā)的過(guò)程中,我們需要使用微信官方提供的PH

隨著微信的普及,越來(lái)越多的企業(yè)開始將其作為行銷工具。而微信群發(fā)功能,則是企業(yè)進(jìn)行微信行銷的重要手段之一。但是,如果只依靠手動(dòng)發(fā)送,對(duì)於行銷人員來(lái)說(shuō)是一件極為費(fèi)時(shí)費(fèi)力的工作。所以,開發(fā)一款微信群發(fā)工具就顯得格外重要。本文將介紹如何使用PHP開發(fā)微信群發(fā)工具。一、準(zhǔn)備工作開發(fā)微信群發(fā)工具,我們需要掌握以下幾個(gè)技術(shù)點(diǎn):PHP基礎(chǔ)知識(shí)微信公眾平臺(tái)開發(fā)開發(fā)工具:Sub

微信是目前全球用戶規(guī)模最大的社群平臺(tái)之一,隨著行動(dòng)網(wǎng)路的普及,越來(lái)越多的企業(yè)開始意識(shí)到微信行銷的重要性。在進(jìn)行微信行銷時(shí),客服服務(wù)是至關(guān)重要的一環(huán)。為了更好地管理客服聊天窗口,我們可以藉助PHP語(yǔ)言進(jìn)行微信開發(fā)。一、PHP微信開發(fā)簡(jiǎn)介PHP是一種開源的伺服器端腳本語(yǔ)言,廣泛用於Web開發(fā)領(lǐng)域。結(jié)合微信公眾平臺(tái)提供的開發(fā)接口,我們可以使用PHP語(yǔ)言進(jìn)行微信

在微信公眾號(hào)開發(fā)中,使用者標(biāo)籤管理是一個(gè)非常重要的功能,可以讓開發(fā)者更了解和管理自己的使用者。本篇文章將介紹如何使用PHP實(shí)作微信使用者標(biāo)籤管理功能。一、取得微信用戶openid在使用微信用戶標(biāo)籤管理功能之前,我們首先需要取得用戶的openid。在微信公眾號(hào)開發(fā)中,透過(guò)使用者授權(quán)的方式取得openid是比較常見(jiàn)的做法。在使用者授權(quán)完成後,我們可以透過(guò)以下程式碼取得用

隨著微信成為了人們生活中越來(lái)越重要的通訊工具,其敏捷的訊息傳遞功能迅速受到廣大企業(yè)和個(gè)人的青睞。對(duì)企業(yè)而言,將微信發(fā)展為一個(gè)行銷平臺(tái)已經(jīng)成為趨勢(shì),而微信開發(fā)的重要性也逐漸凸顯。在其中,群發(fā)功能更是被廣泛使用,那麼,作為PHP程式設(shè)計(jì)師,如何實(shí)現(xiàn)群發(fā)訊息發(fā)送記錄呢?以下將為大家簡(jiǎn)單介紹一下。 1.了解微信公眾號(hào)相關(guān)開發(fā)知識(shí)在了解如何實(shí)現(xiàn)群發(fā)訊息發(fā)送記錄之前,我

如何使用PHP實(shí)現(xiàn)微信公眾號(hào)開發(fā)微信公眾號(hào)已經(jīng)成為了許多企業(yè)推廣和互動(dòng)的重要管道,而PHP作為常用的Web語(yǔ)言,也可以用來(lái)進(jìn)行微信公眾號(hào)的開發(fā)。本文將介紹使用PHP實(shí)現(xiàn)微信公眾號(hào)開發(fā)的具體步驟。第一步:取得微信公眾號(hào)的開發(fā)者帳號(hào)在開始微信公眾號(hào)開發(fā)之前,需要先去申請(qǐng)一個(gè)微信公眾號(hào)的開發(fā)者帳號(hào)。具體的註冊(cè)流程可參考微信公眾平臺(tái)的官方網(wǎng)

隨著網(wǎng)路和行動(dòng)智慧型裝置的發(fā)展,微信成為了社交和行銷領(lǐng)域不可或缺的一部分。在這個(gè)越來(lái)越數(shù)位化的時(shí)代,如何使用PHP進(jìn)行微信開發(fā)已經(jīng)成為了許多開發(fā)者的關(guān)注點(diǎn)。本文主要介紹如何使用PHP進(jìn)行微信發(fā)展的相關(guān)知識(shí)點(diǎn),以及其中的一些技巧和注意事項(xiàng)。一、開發(fā)環(huán)境準(zhǔn)備在進(jìn)行微信開發(fā)之前,首先需要準(zhǔn)備好對(duì)應(yīng)的開發(fā)環(huán)境。具體來(lái)說(shuō),需要安裝PHP的運(yùn)作環(huán)境,以及微信公眾平臺(tái)提
