公眾平臺用戶提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的URL上,并且?guī)纤膫€參數(shù):
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,否則接入失敗。
signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
加密/校驗流程:
/// summary> /// 驗證簽名 /// /summary> /// param name="signature">/param> /// param name="timestamp">/param> /// param name="nonce">/param> /// returns>/returns> public static bool CheckSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 將token、timestamp、nonce三個參數(shù)進行字典序排序 Array.SortString>(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i arr.Length; i++) { content.Append(arr[i]); } String tmpStr = SHA1_Encrypt(content.ToString()); // 將sha1加密后的字符串可與signature對比,標識該請求來源于微信 return tmpStr != null ? tmpStr.Equals(signature) : false; } /// summary> /// 使用缺省密鑰給字符串加密 /// /summary> /// param name="Source_String">/param> /// returns>/returns> public static string SHA1_Encrypt(string Source_String) { byte[] StrRes = Encoding.Default.GetBytes(Source_String); HashAlgorithm iSHA = new SHA1CryptoServiceProvider(); StrRes = iSHA.ComputeHash(StrRes); StringBuilder EnText = new StringBuilder(); foreach (byte iByte in StrRes) { EnText.AppendFormat("{0:x2}", iByte); } return EnText.ToString(); }
接入后是消息推送當普通微信用戶向公眾賬號發(fā)消息時,微信服務(wù)器將POST該消息到填寫的URL上。
protected void Page_Load(object sender, EventArgs e) { if (Request.HttpMethod.ToUpper() == "GET") { // 微信加密簽名 string signature = Request.QueryString["signature"]; // 時間戳 string timestamp = Request.QueryString["timestamp"]; // 隨機數(shù) string nonce = Request.QueryString["nonce"]; // 隨機字符串 string echostr = Request.QueryString["echostr"]; if (WeixinServer.CheckSignature(signature, timestamp, nonce)) { Response.Write(echostr); } } else if (Request.HttpMethod.ToUpper() == "POST") { StreamReader stream = new StreamReader(Request.InputStream); string xml = stream.ReadToEnd(); processRequest(xml); } } /// summary> /// 處理微信發(fā)來的請求 /// /summary> /// param name="xml">/param> public void processRequest(String xml) { try { // xml請求解析 Hashtable requestHT = WeixinServer.ParseXml(xml); // 發(fā)送方帳號(open_id) string fromUserName = (string)requestHT["FromUserName"]; // 公眾帳號 string toUserName = (string)requestHT["ToUserName"]; // 消息類型 string msgType = (string)requestHT["MsgType"]; //文字消息 if (msgType == ReqMsgType.Text) { // Response.Write(str); string content = (string)requestHT["Content"]; if(content=="1") { // Response.Write(str); Response.Write(GetNewsMessage(toUserName, fromUserName)); return; } if (content == "2") { Response.Write(GetUserBlogMessage(toUserName, fromUserName)); return; } if (content == "3") { Response.Write(GetGroupMessage(toUserName, fromUserName)); return; } if (content == "4") { Response.Write(GetWinePartyMessage(toUserName, fromUserName)); return; } Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,")); } else if (msgType == ReqMsgType.Event) { // 事件類型 String eventType = (string)requestHT["Event"]; // 訂閱 if (eventType==ReqEventType.Subscribe) { Response.Write(GetMainMenuMessage(toUserName, fromUserName, "謝謝您的關(guān)注!,")); } // 取消訂閱 else if (eventType==ReqEventType.Unsubscribe) { // TODO 取消訂閱后用戶再收不到公眾號發(fā)送的消息,因此不需要回復消息 } // 自定義菜單點擊事件 else if (eventType==ReqEventType.CLICK) { // TODO 自定義菜單權(quán)沒有開放,暫不處理該類消息 } } else if (msgType == ReqMsgType.Location) { } } catch (Exception e) { } }pre name="code" class="csharp"> protected void Page_Load(object sender, EventArgs e) { if (Request.HttpMethod.ToUpper() == "GET") { // 微信加密簽名 string signature = Request.QueryString["signature"]; // 時間戳 string timestamp = Request.QueryString["timestamp"]; // 隨機數(shù) string nonce = Request.QueryString["nonce"]; // 隨機字符串 string echostr = Request.QueryString["echostr"]; if (WeixinServer.CheckSignature(signature, timestamp, nonce)) { Response.Write(echostr); } } else if (Request.HttpMethod.ToUpper() == "POST") { StreamReader stream = new StreamReader(Request.InputStream); string xml = stream.ReadToEnd(); processRequest(xml); } } /// summary> /// 處理微信發(fā)來的請求 /// /summary> /// param name="xml">/param> public void processRequest(String xml) { try { // xml請求解析 Hashtable requestHT = WeixinServer.ParseXml(xml); // 發(fā)送方帳號(open_id) string fromUserName = (string)requestHT["FromUserName"]; // 公眾帳號 string toUserName = (string)requestHT["ToUserName"]; // 消息類型 string msgType = (string)requestHT["MsgType"]; //文字消息 if (msgType == ReqMsgType.Text) { // Response.Write(str); string content = (string)requestHT["Content"]; if(content=="1") { // Response.Write(str); Response.Write(GetNewsMessage(toUserName, fromUserName)); return; } if (content == "2") { Response.Write(GetUserBlogMessage(toUserName, fromUserName)); return; } if (content == "3") { Response.Write(GetGroupMessage(toUserName, fromUserName)); return; } if (content == "4") { Response.Write(GetWinePartyMessage(toUserName, fromUserName)); return; } Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,")); } else if (msgType == ReqMsgType.Event) { // 事件類型 String eventType = (string)requestHT["Event"]; // 訂閱 if (eventType==ReqEventType.Subscribe) { Response.Write(GetMainMenuMessage(toUserName, fromUserName, "謝謝您的關(guān)注!,")); } // 取消訂閱 else if (eventType==ReqEventType.Unsubscribe) { // TODO 取消訂閱后用戶再收不到公眾號發(fā)送的消息,因此不需要回復消息 } // 自定義菜單點擊事件 else if (eventType==ReqEventType.CLICK) { // TODO 自定義菜單權(quán)沒有開放,暫不處理該類消息 } } else if (msgType == ReqMsgType.Location) { } } catch (Exception e) { } }/pre>br> pre>/pre> br> br>
本文已被整理到了《ASP.NET微信開發(fā)教程匯總》,歡迎大家學習閱讀。
以上就是關(guān)于ASP.NET微信開發(fā)接口指南的相關(guān)內(nèi)容介紹,希望對大家的學習有所幫助。