驗證服務器地址數據庫
上一篇咱們說了如何開啓開發者模式,填寫了接收微信推送消息的URL,這一篇咱們說下如何驗證URL,只有驗證完成了,URL才能正式啓用。服務器
上面這些是微信公衆平臺開發文檔裏說的驗證方法,很是清楚,小夥伴們一看就能明白。微信只給出了PHP的代碼示例。杯具。微信
咱們就把它翻譯成.net的,哈哈。微信公衆平臺
一、新建一個解決方案,起一個MVC4的項目,以下圖。這裏是我建好的一個解決方案,在這裏簡單介紹一下。ide
WechatService:畫紅框的項目,是一個MVC4的項目,接收微信發來的消息以及提供了一些外部程序調用的接口。若是WCF熟悉,也能夠用WCF來作。測試
Service.Common:放了一些通用的靜態方法。加密
Service.DB:和數據庫相關的內容。spa
Service.Wechat.Common:和微信平臺接口相關的內容。.net
Service.WechatPlatform:存一些微信帳號信息的,好比Token之類的常量,若是須要使用多個微信公衆平臺,這裏還能夠用工廠模式擴展多平臺。翻譯
TestUnit:一個普通控制檯程序,用來作簡單的代碼測試。
二、在WechatService裏面,咱們新建一個空白control叫WechatController.cs文件,裏面加一個Service的Action。
調用一個Valid的方法,校驗微信發來信息的有效性。我用完了就註釋掉了。
1 //接受微信服務端發來的消息 2 public void Service() 3 { 4 Valid(); 5 }
Valid的方法。
WeLogger是個寫txt日誌文件的類。若是不用,能夠直接刪除整行。
1 //用於申請「成爲開發者」時向微信發送驗證信息。 2 public void Valid() 3 { 4 string echoStr = Request.QueryString["echoStr"]; 5 if (string.IsNullOrEmpty(echoStr)) 6 { 7 WeLogger.Debug("echoStr爲空"); 8 return; 9 } 10 string signature = Request.QueryString["signature"]; 11 string timestamp = Request.QueryString["timestamp"]; 12 string nonce = Request.QueryString["nonce"]; 13 if (WeUtility.CheckSignature(signature,timestamp,nonce)) 14 {
15 Response.Write(echoStr); 16 Response.End();
17 } 18 }
接下來在Service.Wechat.Common項目的WeUtility類裏寫一個CheckSignature靜態方法
1 public static bool CheckSignature(string signature, string timestamp, string nonce) 2 { 3 if (string.IsNullOrEmpty(signature) || string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce)) 4 { 5 return false; 6 } 7 //這個變量要與網頁裏面填寫的接口配置信息中填寫的Token一致 8 string Token = WeConst.Token; 9 string[] ArrTmp = { Token, timestamp, nonce }; 10 Array.Sort(ArrTmp);//排序 11 string tmpStr = string.Join("", ArrTmp); 12 tmpStr = UtilityFunc.SHA1_Hash(tmpStr);//對該字符串進行sha1加密 13 tmpStr = tmpStr.ToLower(); 14 15 //得到加密後的字符串可與signature對比 16 //經過檢驗signature對請求進行校驗,若正確,則原樣返回echostr參數內容,接入生效,不然接入失敗 17 if (tmpStr == signature) 18 { 19 return true; 20 } 21 else 22 { 23 return false; 24 } 25 }
在Service.Common項目的UtilityFunc類裏寫一個SHA1_Hash靜態方法
1 /// <summary> 2 /// 字符串轉換SHA1 3 /// </summary> 4 /// <param name="str_sha1_in"></param> 5 /// <returns></returns> 6 public static string SHA1_Hash(string str_sha1_in) 7 { 8 SHA1 sha1 = new SHA1CryptoServiceProvider(); 9 byte[] bytes_sha1_in = UTF8Encoding.Default.GetBytes(str_sha1_in); 10 byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in); 11 string str_sha1_out = BitConverter.ToString(bytes_sha1_out); 12 str_sha1_out = str_sha1_out.Replace("-", ""); 13 return str_sha1_out; 14 }
這樣就ok了,若是你在微信填的URL地址是http://xxx.xxx.xxx/Wechat/Service的話,就能夠直接把程序打包發佈到IIS上,而後登陸微信公衆平臺,提交全部信息,驗證經過便可激活開發者模式。
Valid方法激活了開發者模式以後就能夠直接刪了或註釋掉,之後再也不用了。
CheckSignature方法在以後接收全部微信推送過來的消息時驗證都要用,全部都寫到Service.Wechat.Common裏了。
這篇就結束了,很是簡單。
總結一下,在微信帳號上填寫好URL以後把驗證代碼寫好發佈,而後在微信帳號裏驗證一下咱們填的地址是有效的就激活成功了。
PS:若是在Valid方法裏不作任何驗證,直接在response裏輸出echoStr,理論上驗證也能經過。這裏感受能夠偷個懶,小夥伴們能夠試試。
PS:洗洗睡了。