配置成功.png
基本原理
利用token, timestamp, nonce三個值,計算出一個hashcode,與前端參數signature進行對比。
如果后端的token值,與網頁所填寫的保持一致,那么計算出來的hashcode就會與前端參數signature相同,否則就會不同,從而達到驗證的目的。
示意圖(官方)
image.png
微信服務號配置.png
服務器地址(URL):是下面兩個程序部署的服務器的地址,
注意如果80端口被占用,需要nginx進行轉發。
http端口固定80,不可填寫其他
https端口固定443,不可填寫其他
令牌(Token):只需要與程序中的token保持一致即可,自定義。
EncodingAESKey:點擊隨機生成
# -*- coding: utf-8 -*-
# filename: main.py
import web
# from handle import Handle
from handle import Handle
urls = (
'/wx', 'Handle',
)
if __name__ == '__main__':
app = web.application(urls, globals())
web.httpserver.runsimple(app.wsgifunc(), ("0.0.0.0", 5003))
web的包依賴安裝:推薦使用這個,conda沒有和pip超時報錯
pip3 install web.py -i https://mirrors.aliyun.com/pypi/simple/
# -*- coding: utf-8 -*-
# filename: handle.py
import hashlib
import web
class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxx12345678"
list1 = [token, timestamp, nonce]
list1.sort()
list2 = [ x.encode('utf-8') for x in list1]
sha1 = hashlib.sha1()
[sha1.update(x) for x in list2]
hashcode = sha1.hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""
except Exception as Argument:
return Argument
參考文檔
開始開發 / 接入指南 (qq.com)
基礎能力 / 服務端能力 / 消息推送 (qq.com)
開發前必讀 / 入門指引 (qq.com) 主要是這篇里的配置,一步一步來。
下載 這個是官方提供的demo代碼,但是有問題,提供的python代碼是python2.7版本的與Python3不兼容
官方demo代碼.png
微信公眾號開發中基本配置驗證token失敗的情況 - 知乎 (zhihu.com) 這個文章也是重要參考