亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C# asp.net 搭建微信公眾平臺(可實現關注消息與消息自動回復)的代碼以及我所遇到的問題

2019-11-17 01:43:08
字體:
來源:轉載
供稿:網友

C# asp.net 搭建微信公眾平臺(可實現關注消息與消息自動回復)的代碼以及我所遇到的問題

【引言】

   利用asp.net搭建微信公眾平臺的案例并不多,微信官方給的案例是用php的,網上能找到的代碼很多也是存在著這樣那樣的問題或者缺少部分方法,無法使用,下面是我依照官方文檔寫的基于.net 搭建微信公眾平臺源代碼。由于經驗不足,內可能存在不嚴謹之處,歡迎交流。

【分析】

   實現的功能較為簡單,主要分為驗證與消息接收回復兩部分,首先是驗證:

  

  這已經是驗證好后的截圖了,需要輸入的是URL和你自己設定的Token碼,URL為你上傳服務器的地址例如:http://XXXXX.com/weixin/weixin.aspx,這里著重要強調的一個問題是加不加WWW的差異,無論加不加WWW,在驗證時都是沒有影響的,但在接收消息時,加和不加的差異是我最初無法接收到用戶消息的直接原因,原因可能和POST帶xml的請求機制有關。落實到具體項目中加還是不加,和你配置的DNS等有關,要是不想深入研究,當接收不到用戶消息,而公眾平臺的調試工具里又是正常的,那你可以交替試試。Token碼可以隨機指定,但必須和代碼中的Token指定相同,如果系統安全性要求比較高,建議增加token的復雜程度。

  在下面代碼第一行中指定token,必須與上面一直

 1      const string Token = "nidaye1234";//你的token 2         #region 以下代碼只用于第一次驗證  驗證完后請注釋 3         PRotected void Page_Load(object sender, EventArgs e) 4         { 5             string postStr = ""; 6             if (Request.HttpMethod.ToLower() == "post") 7             { 8                 System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream; 9                 byte[] b = new byte[s.Length];10                 s.Read(b, 0, (int)s.Length);11                 postStr = System.Text.Encoding.UTF8.GetString(b);12                 if (!string.IsNullOrEmpty(postStr))13                 {16                     Response.End();17                 }18                 //WriteLog("postStr:" + postStr);19             }20             else21             {22                 Valid();23             }24         } 25         #endregion

上面的代碼只是pageLoad,里面還要調用到的驗證方法這里先不寫,在最后會給出全部的源代碼。

  驗證成功后可以調用api實現消息收發,下面是微信官方給的文檔

  接收消息

  

  發送消息

  以及關注事件

  我的做法是首先創建一個接收消息實體以及實體填充方法,如下,其中根據MsgType的不同,選擇填充合適的Content或者EventName。當然我這里沒有使用微信為開發者提供的高級功能(例如語音定位之類的),如有用到可以增加這個類的屬性,并對應修改填充器即可。

 1         private class ExmlMsg 2         { 3             /// <summary> 4             /// 本公眾賬號 5             /// </summary> 6             public string ToUserName { get; set; } 7             /// <summary> 8             /// 用戶賬號 9             /// </summary>10             public string FromUserName { get; set; }11             /// <summary>12             /// 發送時間戳13             /// </summary>14             public string CreateTime { get; set; }15             /// <summary>16             /// 發送的文本內容17             /// </summary>18             public string Content { get; set; }19             /// <summary>20             /// 消息的類型21             /// </summary>22             public string MsgType { get; set; }23             /// <summary>24             /// 事件名稱25             /// </summary>26             public string EventName { get; set; } 27 28         }29 30         private ExmlMsg GetExmlMsg(XmlElement root) 31         {32             ExmlMsg xmlMsg = new ExmlMsg() {33                 FromUserName = root.SelectSingleNode("FromUserName").InnerText,34                 ToUserName = root.SelectSingleNode("ToUserName").InnerText,35                 CreateTime = root.SelectSingleNode("CreateTime").InnerText,36                 MsgType = root.SelectSingleNode("MsgType").InnerText,               37             };38             if (xmlMsg.MsgType.Trim().ToLower() == "text")39             {40                 xmlMsg.Content = root.SelectSingleNode("Content").InnerText;41             }42             else if (xmlMsg.MsgType.Trim().ToLower() == "event")43             {44                 xmlMsg.EventName = root.SelectSingleNode("Event").InnerText;45             }46             return xmlMsg;47         }

  普通使用時(非驗證時)的pageload,這個方法主要通過調用PostInput()(詳間最后的源代碼)還獲取post過來的數據,并將它們傳入消息適配器中。

 1         /// <summary> 2         /// 以下是正常使用時的pageload  請在驗證時將其注釋  并保證在正常使用時可用 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="e"></param> 6         protected void Page_Load(object sender, EventArgs e) 7         { 8  9             if (Request.HttpMethod == "POST")10             {11                 string weixin = "";12                 weixin = PostInput();//獲取xml數據13                 if (!string.IsNullOrEmpty(weixin))14                 {15                     ResponseMsg(weixin);////調用消息適配器16                 }17             }18         } 

  以下消息適配器,通過MsgType來區分消息的類型,并調用對應的方法,這里偷了一個懶,就是用戶首次關注時推送消息的方法沒有抽象出去,因為我暫時也沒有別的enven可調用,如果結構復雜時,可以自行抽象。如果需要改變歡迎詞的內容改變msg的值即可。日后擴展新功能時,可以根據case的的MsgType新寫對應的方法,我這里主要用到的是textCase(),需要傳入用戶發送過來的消息實體,因為你的業務邏輯中可能需要用到發件者的各種信息。

 1        private void ResponseMsg(string weixin)// 服務器響應微信請求 2         { 3             XmlDocument doc = new XmlDocument(); 4             doc.LoadXml(weixin);//讀取xml字符串 5             XmlElement root = doc.DocumentElement; 6             ExmlMsg xmlMsg = GetExmlMsg(root); 7             //XmlNode MsgType = root.SelectSingleNode("MsgType"); 8             //string messageType = MsgType.InnerText; 9             string messageType = xmlMsg.MsgType;//獲取收到的消息類型。文本(text),圖片(image),語音等。10 11   12             try13             {14                 15                 switch (messageType)16                 {17                     //當消息為文本時18                     case "text":19                         textCase(xmlMsg);20                         break;21                     case "event":22                         if (!string.IsNullOrEmpty(xmlMsg.EventName) && xmlMsg.EventName.Trim() == "subscribe")23                         {24                             //剛關注時的時間,用于歡迎詞  25                             int nowtime = ConvertDateTimeInt(DateTime.Now);26                             string msg = "你要關注我,我有什么辦法。隨便發點什么試試吧~~~";27                             string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";28                             Response.Write(resxml);29                         }30                         break;31                     case "image":32                         break;33                     case "voice":34                         break;35                     case "vedio":36                         break;37                     case "location":38                         break;39                     case "link":40                         break;41                     default:42                         break;43                 }44                 Response.End();45             }46             catch (Exception)47             {48 49             }50         } 

  獲取文本回復信息方法,主要目的是按照官方文檔的要求,拼接出所要返回給微信服務器的xml格式。它的msg內容來自于getText方法,同樣需要傳入用戶消息實體,我下面給出了我用來測試的方法的內容。

1         private void textCase(ExmlMsg xmlMsg)2         {     3             int nowtime = ConvertDateTimeInt(DateTime.Now);4             string msg = "";5             msg = getText(xmlMsg);6             string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtim
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品视频久久久久| 久久影院资源站| 国产视频亚洲精品| 91国内在线视频| 国产精品香蕉在线观看| 精品国产欧美一区二区三区成人| 国产精品天天狠天天看| 日韩在线播放av| 久久久91精品国产| 亚洲成人av在线| 亚洲国产三级网| 日本道色综合久久影院| 欧美成人激情在线| 国产精品高潮呻吟久久av无限| 91美女片黄在线观看游戏| 欧美日本高清视频| 久久久女女女女999久久| 久久久影视精品| 日韩在线观看免费高清完整版| 亚洲在线视频观看| 在线成人一区二区| 国产精品黄视频| 日韩第一页在线| 精品亚洲男同gayvideo网站| 97精品久久久| 欧美精品激情在线观看| 日韩精品免费在线| www.99久久热国产日韩欧美.com| 国产91精品久久久久久久| 亚洲欧洲第一视频| 最近2019中文免费高清视频观看www99| 日韩精品一区二区视频| 欧美精品在线观看91| 精品久久久久久国产91| 日韩精品中文字| 成人国产精品免费视频| 国产精品久久久久久久久久东京| 日韩av资源在线播放| 九九热最新视频//这里只有精品| 最近2019中文字幕第三页视频| 日产日韩在线亚洲欧美| 久久99热精品| 久久天天躁狠狠躁夜夜爽蜜月| 日韩中文字幕网址| 色偷偷偷综合中文字幕;dd| 日本aⅴ大伊香蕉精品视频| 日韩欧美在线第一页| 亚洲一区二区黄| 日韩国产欧美区| 97在线精品国自产拍中文| 日韩大胆人体377p| 亚洲视频国产视频| 亚洲欧美在线免费| 国产主播喷水一区二区| 色噜噜亚洲精品中文字幕| 一夜七次郎国产精品亚洲| 久久亚洲欧美日韩精品专区| 91干在线观看| 欧日韩不卡在线视频| 国产97在线视频| 国内自拍欧美激情| 黑人精品xxx一区一二区| 欧美精品在线观看| 在线亚洲男人天堂| 欧美一级成年大片在线观看| 欧美性理论片在线观看片免费| 中文字幕亚洲二区| 欧美高清视频一区二区| 久久久99久久精品女同性| 日韩在线播放视频| 亚洲欧美综合区自拍另类| 国产999视频| 欧美日韩在线另类| 久久亚洲一区二区三区四区五区高| 国内精品模特av私拍在线观看| 久久久久久久久久久成人| 精品国产区一区二区三区在线观看| 国产亚洲精品久久久久久| 成人中文字幕+乱码+中文字幕| 成人国产精品一区| 国产欧美亚洲视频| 亚洲国产日韩欧美在线图片| 91国产美女在线观看| 日韩精品在线视频观看| 欧美精品在线第一页| 国内精品视频久久| 91高潮在线观看| 国产亚洲欧美日韩精品| 国产99久久久欧美黑人| 精品一区二区三区四区在线| 国产精品中文在线| 高清一区二区三区日本久| 欧美高清视频在线播放| 精品视频在线观看日韩| 欧美成人精品xxx| 久久久噜久噜久久综合| 一本色道久久88综合日韩精品| 亚洲国产精品99| 国模精品视频一区二区三区| 青青久久aⅴ北条麻妃| 久久亚洲欧美日韩精品专区| 成人国产精品一区二区| 久久久国产影院| 国产精品电影网| 久久全球大尺度高清视频| 在线观看精品国产视频| 国产精品香蕉在线观看| 精品美女久久久久久免费| 国产精品日韩电影| 国产精品电影网站| 亚洲专区中文字幕| 5566成人精品视频免费| 一本一本久久a久久精品综合小说| 日韩网站在线观看| 国模视频一区二区三区| 欧美贵妇videos办公室| 国产91久久婷婷一区二区| 欧美亚洲国产日韩2020| 九九热在线精品视频| 久久亚洲欧美日韩精品专区| 91爱爱小视频k| 欧美高清在线观看| 国产丝袜一区二区三区免费视频| 亚洲已满18点击进入在线看片| 在线不卡国产精品| 日韩美女在线观看| 色一情一乱一区二区| 81精品国产乱码久久久久久| 92看片淫黄大片欧美看国产片| 亚洲欧美精品一区| 影音先锋日韩有码| 国产精品av在线播放| 一区二区三区四区在线观看视频| 国产精品高精视频免费| 日韩少妇与小伙激情| 国产精品福利网| 91精品国产色综合久久不卡98| 欧美孕妇性xx| 日韩电影免费在线观看中文字幕| 久久久99免费视频| 国产精品无av码在线观看| 欧美人成在线视频| 国产91在线高潮白浆在线观看| 亚洲自拍在线观看| 国产精品香蕉在线观看| 欧美韩国理论所午夜片917电影| 国外成人免费在线播放| 欧美猛少妇色xxxxx| 91久久精品国产91性色| 久久影视电视剧免费网站| 午夜精品一区二区三区在线视| 国产精自产拍久久久久久蜜| 欧美亚洲在线观看| 亚洲视频在线视频| 久久精品国产一区二区电影| 国产在线拍揄自揄视频不卡99| 在线精品播放av| 超碰日本道色综合久久综合| 日韩精品免费在线视频观看| 中文字幕久精品免费视频| 国产精品久久久久久久7电影| 日韩精品亚洲视频| 57pao成人国产永久免费| 国产在线日韩在线|