不少人剛剛看是看源碼的時候,都會想到一個問題,就是說,做者這些個思路都是從哪兒來的?爲何他有思路,我就沒有思路,是否是我本身就比別人要笨了?其實這個問題,我也思考過好久,直到我看到這個,我才發現,不是我笨,是我眼界不夠開闊。html
全部的Jfinal微信sdk的方法和理論依據,他都是來自https://mp.weixin.qq.com/wiki/home/index.html,因此,當你結合這個文檔看的時候,你會發現,做者僅僅是用本身的方式將這裏的接口請求包裝了一層,讓咱們不用太關心底層的實現而又可以完成咱們的開發任務。java
一、填寫服務器配置服務器
二、驗證服務器地址的有效性微信
三、依據接口文檔實現業務邏輯框架
(不懂的本身去看文檔)測試
在這裏,咱們關鍵是去看第二步,這一個是咱們今天的重點,有人說,這個過程我知道,你不用給我說,我只想問你一句,假如我讓你實現這麼個過程,你怎麼作?我如今就掰開Jfinalweixin這個開源框架的代碼,脫光了給你看,省得大家說我忽悠你。加密
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:spa
signature線程
微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。code
timestamp
時間戳
nonce
隨機數
echostr
隨機字符串
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。
加密/校驗流程以下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
經過以上過程,咱們能夠猜出來,咱們須要接受上述的四個參數,而後對其進行加密,而後在進行比對,爲何要這樣?就是爲了肯定,這個信息,他真的是從微信來的,不從什麼別的什麼異性來的?
什麼?你不信?別急,準備好鋤頭和黑驢蹄子,兄弟我帶你去挖墳盜墓!!!
MsgInterceptor.java public void intercept(Invocation inv) { Controller controller = inv.getController(); if (controller instanceof MsgController == false) throw new RuntimeException("控制器須要繼承 MsgController"); try { // 將 ApiConfig 對象與當前線程綁定,以便在後續操做中方便獲取該對象: ApiConfigKit.getApiConfig(); ApiConfigKit.setThreadLocalApiConfig(((MsgController)controller).getApiConfig()); // 若是是服務器配置請求,則配置服務器並返回 if (isConfigServerRequest(controller)) { configServer(controller); return ; } // 對開發測試更加友好 if (ApiConfigKit.isDevMode()) { inv.invoke(); } else { // 簽名檢測 if (checkSignature(controller)) { inv.invoke(); } else { controller.renderText("簽名驗證失敗,請肯定是微信服務器在發送消息過來"); } } } finally { ApiConfigKit.removeThreadLocalApiConfig(); } } /** * 檢測簽名 */ private boolean checkSignature(Controller controller) { String signature = controller.getPara("signature"); String timestamp = controller.getPara("timestamp"); String nonce = controller.getPara("nonce"); if (StrKit.isBlank(signature) || StrKit.isBlank(timestamp) || StrKit.isBlank(nonce)) { controller.renderText("check signature failure"); return false; } if (SignatureCheckKit.me.checkSignature(signature, timestamp, nonce)) { return true; } else { log.error("check signature failure: " + " signature = " + controller.getPara("signature") + " timestamp = " + controller.getPara("timestamp") + " nonce = " + controller.getPara("nonce")); return false; } }
怎麼樣,釋懷了吧?這就是檢測的全過程,這裏只是列出了一點點東西,若是你有興趣,先到這裏玩一下,你就知道我剛剛說的是什麼了?
好了,這個第一步關於微信的檢查 我就說到這裏。不懂的留言吧。明天繼續挖墳,絕對讓你通透!!若是以爲好,賞個贊,留個言鼓勵下吧!!挖墳其實能挖到很多好東西了!