Jfinalweixin源碼分析--簽名檢測的那些事兒

框架的理論參考從哪兒來?

不少人剛剛看是看源碼的時候,都會想到一個問題,就是說,做者這些個思路都是從哪兒來的?爲何他有思路,我就沒有思路,是否是我本身就比別人要笨了?其實這個問題,我也思考過好久,直到我看到這個,我才發現,不是我笨,是我眼界不夠開闊。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;
		}
	}

怎麼樣,釋懷了吧?這就是檢測的全過程,這裏只是列出了一點點東西,若是你有興趣,先到這裏玩一下,你就知道我剛剛說的是什麼了?

好了,這個第一步關於微信的檢查 我就說到這裏。不懂的留言吧。明天繼續挖墳,絕對讓你通透!!若是以爲好,賞個贊,留個言鼓勵下吧!!挖墳其實能挖到很多好東西了!

相關文章
相關標籤/搜索