此係列前面已經更新了兩篇博文了,都是微信開發的前期準備工做,如今切入正題,本篇講解新手接入的步驟與方法,大神可直接跳過,也歡迎大神吐槽。html
微信公衆號開發系列教程一(調試環境部署續:vs遠程調試) 數組
C#微信公衆號開發系列教程五(接收事件推送與消息排重)微信開發
C#微信公衆號開發系列教程六(被動回覆與上傳下載多媒體文件)微信公衆平臺
微信公衆平臺消息接口的工做原理大概能夠這樣理解:從用戶端到公衆號端一個流程是這樣的,用戶發送消息到微信服務器,微信服務器將接收到的消息post到用戶接入時填寫的url中,在url處理程序中,首先判斷消息的合法性,判斷成功後根據消息體的內容作相應的相應。原理很容易理解,接觸過socket的可能理解起來更容易。socket
然而,微信的文檔有的時候確實有點讓人摸不着頭腦,關於微信接入的文檔寫的確實不敢恭維啊。官方文檔寫的第一步是「申請消息接口」,這裏是須要填寫一個url的,此url用來處理微信發送的消息的,但微信把url中相關的配置寫在了第二步,一不當心就把新手給坑了。下面我按照個人理解來進行解釋。post
首先,開發者在接入時,微信服務器將發送get請求到你填寫的url上,此請求攜帶四個參數,分別signature(微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。),timestamp(時間戳),nonce(隨機數),echostr(隨機字符串).用 HttpContext.Current.Request.RawUrl能夠獲取當前請求的原始url,以下圖所示:
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。
加密/校驗流程以下: 1. 將token、timestamp、nonce三個參數進行字典序排序 2. 將三個參數字符串拼接成一個字符串進行sha1加密 3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信。下面是代碼實現。首先,在你的處理程序中(我是新建了一個通常處理程序wx.ashx),判斷當前請求的類型,由於接入時,是發送的GET請求,消息處理是發送的POST請求。以下圖:這裏我對驗證url的方法進行封裝。/// <summary> /// 驗證url權限, 接入服務器 /// </summary> /// <param name="token"></param> /// <returns></returns> public static bool ValidUrl(string token) { string echoStr = VqiRequest.GetQueryString("echoStr"); if (CheckSignature(token)) { if (!string.IsNullOrEmpty(echoStr)) { Utils.ResponseWrite(echoStr); return true; } } return false; } /// <summary> /// 驗證微信簽名 /// </summary> /// * 將token、timestamp、nonce三個參數進行字典序排序 /// * 將三個參數字符串拼接成一個字符串進行sha1加密 /// * 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信。 /// <returns></returns> public static bool CheckSignature(string token) { string signature = VqiRequest.GetQueryString("signature"); string timestamp = VqiRequest.GetQueryString("timestamp"); string nonce = VqiRequest.GetQueryString("nonce"); string[] ArrTmp = { token, timestamp, nonce }; Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = Utils.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } }
注:代碼VqiRequest.GetQueryString是封裝的QueryString請求的方法,使用的時候能夠改爲QueryString[「」]
處理過程如圖:
將signature,timestamp,nonce三個參數放在數組中,
排序後的ArrTmp:
將三個將三個參數字符串拼接成一個字符串:
將tmpStr進行sha1加密,加密後的字符串轉換成小寫:
而後和簽名進行對比,相同則表示驗證成功。
驗證成功將echoStr返回給微信。
/// <summary> /// 根據指定的密碼和哈希算法生成一個適合於存儲在配置文件中的哈希密碼 /// </summary> /// <param name="str">要進行哈希運算的密碼</param> /// <param name="type"> 要使用的哈希算法</param> /// <returns>通過哈希運算的密碼</returns> public static string HashPasswordForStoringInConfigFile(string str, string type) { return FormsAuthentication.HashPasswordForStoringInConfigFile(str, type); } public static void ResponseWrite(string str) { HttpContext.Current.Response.Write(str); HttpContext.Current.Response.End(); }
處理程序編寫完畢後,部署到iis(方法請參照教程一),登陸微信管理後臺https://mp.weixin.qq.com/在開發者中心頁,點擊「修改配置按鈕」填寫URL、Token和EncodingAESKey,其中URL是開發者用來接收微信服務器數據的接口URL。Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務器配置在提交後都會當即生效。加解密方式的默認狀態爲明文模式。加解密模式將在後期的系列中與你們共享,敬請期待。
如圖所示:
點擊提交後,微信服務器將get請求到上文中編寫的url中。驗證成功,則綁定成功。
END
若是以爲本文對你有幫助,請點擊文章下面的推薦哦,去幫助更多的小夥伴瞭解微信開發的流程。
若是你是土豪,想支持筆者繼續更新本系列教程,能夠掃描下面的二維碼懸賞一下,你的支持是筆者繼續更新下去的動力。