此係列前面已經更新了兩篇博文了,都是微信開發的前期準備工作,現在切入正題,本篇講解新手接入的步驟與方法,大神可直接跳過,也歡迎大神吐槽。
目錄
C#微信公眾號開發系列教程一(除錯環境部署)
C#微信公眾號開發系列教程一(除錯環境部署續:vs遠端除錯)
微信公眾平臺訊息介面的工作原理大概可以這樣理解:從使用者端到公眾號端一個流程是這樣的,使用者傳送訊息到微信伺服器,微信伺服器將接收到的訊息post到使用者接入時填寫的url中,在url處理程式中,首先判斷訊息的合法性,判斷成功後根據訊息體的內容做相應的相應。原理很容易理解,接觸過socket的可能理解起來更容易。
然而,微信的文件有的時候確實有點讓人摸不著頭腦,關於微信接入的文件寫的確實不敢恭維啊。官方文件寫的第一步是“申請訊息介面”,這裡是需要填寫一個url的,此url用來處理微信傳送的訊息的,但微信把url中相關的配置寫在了第二步,一不小心就把新手給坑了。下面我按照我的理解來進行解釋。
首先,開發者在接入時,微信伺服器將傳送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
如果覺得本文對你有幫助,請點選文章下面的推薦哦,去幫助更多的小夥伴瞭解微信開發的流程。
如果你是土豪,想支援筆者繼續更新本系列教程,可以掃描下面的二維碼懸賞一下,你的支援是筆者繼續更新下去的動力。