距離第一講又已經過去了一個多星期了,本打算一周更新一講的,奈何實在太忙。最近也在群里發現有一部分人已經可以熟練調用微信的部分接口但卻不是很清楚微信公眾平台接收消息的一個處理機制。本講就來介紹下怎么接入開發者的服務器。
接入微信公眾平台開發,開發者需要按照如下步驟完成:
1、填寫服務器配置 2、驗證服務器地址的有效性 3、依據接口文檔實現業務邏輯
舉個形象的例子:比如在抗戰時期,各個軍隊之間需要進行通訊,在戰場上軍情的保密是很重要的。所以A、B兩個軍隊事先約定好了接頭的暗號(token),所有的書信都是需要使用密文的(加密方式也已經約定好了)。假如現在A(微信服務器)收到上級(用戶)命令需要和B(開發者服務器)聯合作戰,但上級與B軍隊之間無法進行直接的溝通,那么現在就由A將指令告訴給B,B收到指定后,根據事先約定好的解密方式和暗號(token)解密成功后,派個通訊兵告訴A,說已經收到他們的信息了,那么A和B之間的通訊就建立起來了。假如A和B之間的加密方式被敵軍C竊取到了,但C不知道他們之間的暗號,所以C就算知道了加密方式也無法冒充A與B進行通訊。所以,在整個通訊的過程中,token是至關重要的。
填寫服務器配置
此操作的目的就是告訴微信服務器開發者的服務器在哪兒,已經他們之間的通訊口令。
校驗服務器地址的有效性
開發者在接入時,微信服務器將發送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對比,標識該請求來源於微信。
下面我們一步步來實現這個流程
1、獲取token、timestamp、nonce,並字典序排序
var signature = context.Request.QueryString["signature"]; var timestamp = context.Request.QueryString["timestamp"]; var nonce = context.Request.QueryString["nonce"]; var echostr = context.Request.QueryString["echostr"]; var arr = new[] {token, timestamp, nonce}; Array.Sort(arr);
2. 將三個參數字符串拼接成一個字符串進行sha1加密
var tempstr = string.Join("", arr); var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower();
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信。
if (signature == tempsign) { context.Response.Write(echostr); }
由於接入的時候,微信服務器發送的是get請求,接入之后轉發的消息是post的請求,所以可以根據請求的方式來判斷當前是接入還是接入后的消息推送。
完整的代碼如下所示:
public void ProcessRequest(HttpContext context) { string token = "qqq"; if (context.Request.HttpMethod == "GET") { //說明是接入請求 var signature = context.Request.QueryString["signature"]; var timestamp = context.Request.QueryString["timestamp"]; var nonce = context.Request.QueryString["nonce"]; var echostr = context.Request.QueryString["echostr"]; var arr = new[] {token, timestamp, nonce}; Array.Sort(arr); var tempstr = string.Join("", arr); var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower(); if (signature == tempsign) { context.Response.Write(echostr); } } else { //接收消息處理 }
注:可能由於微信服務器的緩存問題,接入成功后,現在不會立即生效。
附視頻教程:http://pan.baidu.com/s/1GwsVk
本人才疏學淺,人丑錢少臉皮薄,所以文章或視頻中有錯誤或不妥之處,歡迎各位同仁指教。
如果覺得本文對你有幫助,請點擊文章下面的推薦哦,去幫助更多的小伙伴了解微信開發的流程。
如果你是土豪,想支持筆者繼續更新本系列教程,可以掃描下面的二維碼懸賞一下,你的支持是筆者繼續更新下去的動力。
如果你司需求微信開發項目合作,可以私聊我QQ。