溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

發(fā)布時(shí)間:2021-09-10 14:55:11 來源:億速云 閱讀:134 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章主要為大家展示了“asp.net微信開發(fā)消息應(yīng)答的技巧有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“asp.net微信開發(fā)消息應(yīng)答的技巧有哪些”這篇文章吧。

當(dāng)普通微信用戶向公眾賬號(hào)發(fā)消息時(shí),微信服務(wù)器將POST消息的XML數(shù)據(jù)包到開發(fā)者填寫的URL上。
請(qǐng)注意:

  • 1、關(guān)于重試的消息排重,推薦使用msgid排重。

  • 2、微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會(huì)斷掉連接,并且重新發(fā)起請(qǐng)求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會(huì)對(duì)此作任何處理,并且不會(huì)發(fā)起重試。詳情請(qǐng)見“發(fā)送消息-被動(dòng)回復(fù)消息”。

  • 3、為了保證更高的安全保障,開發(fā)者可以在公眾平臺(tái)官網(wǎng)的開發(fā)者中心處設(shè)置消息加密。開啟加密后,用戶發(fā)來的消息會(huì)被加密,公眾號(hào)被動(dòng)回復(fù)用戶的消息也需要加密(但開發(fā)者通過客服接口等API調(diào)用形式向用戶發(fā)送消息,則不受影響)。關(guān)于消息加解密的詳細(xì)說明,請(qǐng)見“消息加解密說明”。

各消息類型的推送XML數(shù)據(jù)包結(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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

 圖片消息

<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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

語音消息

<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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

請(qǐng)注意,開通語音識(shí)別后,用戶每次發(fā)送語音給公眾號(hào)時(shí),微信會(huì)在推送的語音消息XML數(shù)據(jù)包中,增加一個(gè)Recongnition字段 (注:由于客戶端緩存,開發(fā)者開啟或者關(guān)閉語音識(shí)別功能,對(duì)新關(guān)注者立刻生效,對(duì)已關(guān)注用戶需要24小時(shí)生效。開發(fā)者可以重新關(guān)注此帳號(hào)進(jìn)行測(cè)試)。開啟語音識(shí)別后的語音XML數(shù)據(jù)包如下:

<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為語音格式,一般為amr,Recognition為語音識(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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

小視頻消息

<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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

地理位置消息

<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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

鏈接消息

<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>

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

接上篇,看ResponseXML(postString);方法如下

 /// <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)度,地圖縮放比例,地理位置說明
 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")
 {
 ///賦值語音識(shí)別結(jié)果,賦值之前一定要記得在開發(fā)者模式下,把語音識(shí)別功能開啟,否則獲取不到
 requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText;

 }
 ResponseMsg(requestXML);

}

語音識(shí)別功能開啟如下:

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

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>
 /// 地圖位置說明
 /// </summary>
 public String Label { get; set; }

   /// <summary>
 /// 語音消息特有字段
 /// </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ā)送語音消息
  break;
  case "location"://發(fā)送位置消息
  SendMapMsg(requestXML);
  break;
  default:
  break;

 }
 }
 catch (Exception ex)
 {
 HttpContext.Current.Response.Write(ex.ToString());
 }
 }

先來關(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ā)送員工提交問題鏈接
  break;
 case "mywen":
  SendWentiList(requestXML);//發(fā)送問題列表鏈接
  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)語音識(shí)別結(jié)果
 /// </summary>
 /// <param name="requestXML"></param>
 private void SendVoiceMsg(RequestXML requestXML)
 {
 string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您剛才說的語音消息識(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)答的技巧有哪些

asp.net微信開發(fā)消息應(yīng)答的技巧有哪些

以上是“asp.net微信開發(fā)消息應(yīng)答的技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI