微信公衆號token驗證失敗

我用的是python3+,而官網給的例子是python2的寫法。問題就在python版本不一樣。html

下面是截取官方的實例代碼的一部分python

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()

我就直接告訴你這一段錯了。也是在我對比微信驗證時發送的信息後才得出的結論。如下是在網上找到的加密原理,能夠選擇性看看。算法

當咱們點擊了提交後,微信服務器會向咱們所填寫的那個URL發起一個GET請求,並攜帶如下幾個參數:timestamp, nonce, echostr, signature。其中timestamp是一個時間戳,nonce是一個隨機數,echostr也是隨機數,這幾個都很普通,重點在於signature,它的生成方式是將nonce、timestamp和token(也就是咱們在網頁中配置的TOKNE)三個字符串按照字典序排序後,對排序後獲得的字符串數組使用哈希加密算法獲得。咱們的服務器在收到這個GET請求後,提取對應的參數,並按照前面說的方式生成hashcode,若是這個值與參數中的signature相同,那麼咱們就將echostr返回給微信服務器,不然返回空值。微信服務器收到這個echostr以後,驗證這個值與它發送的echostr值是否相同,若是相同,說明這個值的確是由咱們的服務器返回的,從而完成驗證,從此全部的信息就均可以發送到這個服務器地址上。這裏面涉及到了一些安全認證的相關知識,有興趣的朋友能夠去查閱更詳細的資料。總的來講,就是讓通訊的雙方都可以確認對方的真實身份。數組

token驗證失敗的緣由在於map函數。應該是python的2和3不同吧。map函數第一個參數是一個函數,第二個參數是一個列表。做用是把第一個函數依次做用於列表中的每一個元素。安全

這裏我又學到了hashlib的一些東西。update是防止數據過大,因此能夠用update依次添加要加密的數據。服務器

因此綜上能夠看出,微信的加密就是現將list排序,而後依次將排序後的列表的每一個元素用update合併成總的要加密的數據。貼一段代碼幫助理解微信

import hashlib
sha1 = hashlib.sha1()
    sha1.update('a'.encode('utf-8'))
    sha1.update('b'.encode('utf-8'))
    sha1.update('c'.encode('utf-8'))
    等同於:
    sha1.update('abc'.encode('utf-8'))
hashcode = sha1.hexdigest() #獲取加密串

因此在python3下,加密的算法要改爲以下函數

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode('utf-8'))
sha1.update(list[1].encode('utf-8'))
sha1.update(list[2].encode('utf-8'))
hashcode = sha1.hexdigest()

通過一通折騰,終於解決問題了。忍不住吐槽,python3都這麼長時間了,爲何開發文檔還不更新。並且還有好多程序都仍是在python2下。唉,又是python一大詬病。加密

不說了,折騰了一個這東西,餓死了。吃飯去了。spa

參考文章:

手把手教你入門微信公衆號開發

hashlib

python map()函數

python中sha1 md5等用法

相關文章
相關標籤/搜索