C#微信公众号开发系列教程二(新手接入指南)
此系列前面已經(jīng)更新了兩篇博文了,都是微信開發(fā)的前期準(zhǔn)備工作,現(xiàn)在切入正題,本篇講解新手接入的步驟與方法,大神可直接跳過,也歡迎大神吐槽。
微信公眾號開發(fā)系列教程一(調(diào)試環(huán)境部署)
微信公眾號開發(fā)系列教程一(調(diào)試環(huán)境部署續(xù):vs遠(yuǎn)程調(diào)試)
C#微信公眾號開發(fā)系列教程二(新手接入指南)
C#微信公眾號開發(fā)系列教程三(消息體簽名及加解密)
C#微信公眾號開發(fā)系列教程四(接收普通消息)
C#微信公眾號開發(fā)系列教程五(接收事件推送與消息排重)
?C#微信公眾號開發(fā)系列教程六(被動回復(fù)與上傳下載多媒體文件)
微信公眾平臺消息接口的工作原理大概可以這樣理解:從用戶端到公眾號端一個流程是這樣的,用戶發(fā)送消息到微信服務(wù)器,微信服務(wù)器將接收到的消息post到用戶接入時填寫的url中,在url處理程序中,首先判斷消息的合法性,判斷成功后根據(jù)消息體的內(nèi)容做相應(yīng)的相應(yīng)。原理很容易理解,接觸過socket的可能理解起來更容易。
然而,微信的文檔有的時候確實(shí)有點(diǎn)讓人摸不著頭腦,關(guān)于微信接入的文檔寫的確實(shí)不敢恭維啊。官方文檔寫的第一步是“申請消息接口”,這里是需要填寫一個url的,此url用來處理微信發(fā)送的消息的,但微信把url中相關(guān)的配置寫在了第二步,一不小心就把新手給坑了。下面我按照我的理解來進(jìn)行解釋。
首先,開發(fā)者在接入時,微信服務(wù)器將發(fā)送get請求到你填寫的url上,此請求攜帶四個參數(shù),分別signature(微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。),timestamp(時間戳),nonce(隨機(jī)數(shù)),echostr(隨機(jī)字符串).用 HttpContext.Current.Request.RawUrl可以獲取當(dāng)前請求的原始url,如下圖所示:
開發(fā)者通過檢驗signature對請求進(jìn)行校驗(下面有校驗方式)。若確認(rèn)此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗流程如下: 1. 將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序 2. 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密 3. 開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信。 下面是代碼實(shí)現(xiàn)。 首先,在你的處理程序中(我是新建了一個一般處理程序wx.ashx),判斷當(dāng)前請求的類型,因為接入時,是發(fā)送的GET請求,消息處理是發(fā)送的POST請求。如下圖: 這里我對驗證url的方法進(jìn)行封裝。 /// <summary>/// 驗證url權(quán)限, 接入服務(wù)器/// </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三個參數(shù)進(jìn)行字典序排序/// * 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密/// * 開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信。/// <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三個參數(shù)放在數(shù)組中,
排序后的ArrTmp:
將三個將三個參數(shù)字符串拼接成一個字符串:
將tmpStr進(jìn)行sha1加密,加密后的字符串轉(zhuǎn)換成小寫:
然后和簽名進(jìn)行對比,相同則表示驗證成功。
驗證成功將echoStr返回給微信。
/// <summary>/// 根據(jù)指定的密碼和哈希算法生成一個適合于存儲在配置文件中的哈希密碼/// </summary>/// <param name="str">要進(jìn)行哈希運(yùn)算的密碼</param>/// <param name="type"> 要使用的哈希算法</param>/// <returns>經(jīng)過哈希運(yùn)算的密碼</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/在開發(fā)者中心頁,點(diǎn)擊“修改配置按鈕”填寫URL、Token和EncodingAESKey,其中URL是開發(fā)者用來接收微信服務(wù)器數(shù)據(jù)的接口URL。Token可由開發(fā)者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進(jìn)行比對,從而驗證安全性)。EncodingAESKey由開發(fā)者手動填寫或隨機(jī)生成,將用作消息體加解密密鑰。同時,開發(fā)者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務(wù)器配置在提交后都會立即生效。加解密方式的默認(rèn)狀態(tài)為明文模式。加解密模式將在后期的系列中與大家共享,敬請期待。
如圖所示:
?
點(diǎn)擊提交后,微信服務(wù)器將get請求到上文中編寫的url中。驗證成功,則綁定成功。
?
?
END
?
如有疑問加群一起交流,我需要廣大屌絲小伙伴的反饋與建議,??
如果覺得本文對你有幫助,請點(diǎn)擊文章下面的推薦哦,去幫助更多的小伙伴了解微信開發(fā)的流程。
如果你是土豪,想支持筆者繼續(xù)更新本系列教程,可以掃描下面的二維碼懸賞一下,你的支持是筆者繼續(xù)更新下去的動力。
轉(zhuǎn)載于:https://www.cnblogs.com/zskbll/p/4093954.html
總結(jié)
以上是生活随笔為你收集整理的C#微信公众号开发系列教程二(新手接入指南)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: armeabi与armeabi-v7a的
- 下一篇: 郝斌数据结构与算法自学视频教程