微信公眾號之接入微信公眾號伺服器開發(二)
說明:該篇部落格是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝大家!
接著上一篇部落格繼續往下寫 :https://blog.csdn.net/qq_41782425/article/details/85319116
一丶敘述
-
開發說明
- Python程式碼實現(以Flask框架為例)
- 將使用公眾號訊息會話
- 客戶端---->微信伺服器---->nginx伺服器---->開發者伺服器
- 在微信伺服器與開發者伺服器之間搭建了nginx伺服器預設為80埠(也是微信支援的埠),跟開發者伺服器屬於同一個主機
- 在nginx伺服器上配置了多個埠,方便多人進行測試,轉發規則:location/wechat8007
- 在微信公眾號測試平臺介面配置url為host/wechat8007時,當微信伺服器傳送訊息給host/wechat8007時,host為nginx伺服器時,就會按照/wechat8007轉發規則匹配,一旦匹配成功後,由nginx伺服器轉發給開發者伺服器上127.0.0.1:8007程序的使用者,這樣可以實現多個賬號共享一個80埠,並可以收到微信伺服器對應使用者的訊息
- 注:在寫的flask程式中檢視網址也必須是/wechat8007,因為nginx在向後臺轉發的時候,它只是按照/wechat8007規則知道轉發給誰,它會把微信使用者的請求原封不動的往後去發,因為微信伺服器在向我們傳送請求路徑就是/wechat:8007,意味著nginx再轉發給我們的時候,在我們寫的flask程式收到的請求裡面,你會發現對應的請求路徑也是/wechat8007,所以我們flask程式中的route路徑也必須是/wechat8007
- 如果是在公司做開發的話,不涉及到多個賬戶使用一個80埠,所以直接把程式在開發者伺服器上以80埠執行,然後在微信公眾測試平臺配置url為配置程式地址即可
- 博主之所以這樣做,那是因為我還沒有購買伺服器(●︿●)
-
接入微信公眾平臺
接入微信公眾平臺開發,開發者需要按照如下步驟完成:
- 填寫伺服器配置
- 驗證伺服器地址的有效性
- 依據介面文件實現業務邏輯
-
填寫伺服器配置
登入微信公眾平臺官網後,在公眾平臺後臺管理頁面 - 開發者中心頁,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信訊息和事件的介面URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和介面URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作訊息體加解密金鑰。
同時,開發者可選擇訊息加解密方式:明文模式、相容模式和安全模式。模式的選擇與伺服器配置在提交後都會立即生效,請開發者謹慎填寫及選擇。加解密方式的預設狀態為明文模式,選擇相容模式和安全模式需要提前配置好相關加解密程式碼,詳情請參考訊息體簽名及加解密部分的文件。
1.進入微信公眾平臺後,找到開發欄,進入基本配置
2.利用測試平臺
測試平臺登入地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
在手機微信上進行掃碼登入即可
二丶驗證伺服器地址的有效性
開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶四個引數:
開發者通過檢驗signature對請求進行校驗。若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。
校驗流程:
- 將token、timestamp、nonce三個引數進行字典序排序
- 將三個引數字串拼接成一個字串進行sha1加密
- 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
1.根據上面微信公眾平臺提供的開發文件進行程式碼編寫
程式碼實現如下
# coding:utf-8
from flask import Flask, request, abort
import hashlib
# 常量
# 微信的token令牌
WECHAT_TOKEN = "cdtaogang"
app = Flask(__name__)
@app.route("/wechat8007")
def wechat():
"""對接微信公眾號伺服器"""
# 接收微信伺服器傳送的引數
signature = request.args.get("signature")
timestamp = request.args.get("timestamp")
nonce = request.args.get("nonce")
echostr = request.args.get("echostr")
# 校驗引數
if not all([signature, timestamp, nonce, echostr]):
abort(400)
# 按照微信的流程進行計算簽名
li = [WECHAT_TOKEN, timestamp, nonce]
# 排序
li.sort()
# 拼接字串
tmp_str = ''.join(li)
# 進行sha1加密, 得到正確的簽名值
sign = hashlib.sha1(tmp_str).hexdigest()
# 將自己計算的簽名值與請求的簽名引數進行對比,如果相同,則證明請求來自微信伺服器
if sign != signature:
# 表示請求不是微信發的
abort(403)
else:
return echostr
if __name__ == '__main__':
app.run(port=8007, debug=True)
2.測試連線開發者伺服器
- step1 使用ssh命令測試連線伺服器
- step2 使用scp命令將程式檔案推送到伺服器
- step3 在開發者伺服器上執行wechat程式
- step4 回到微信公眾測試平臺配置介面
注意:當沒有在伺服器執行wechat程式時,進行提交會顯示失敗
此時,回頭看伺服器程式執行日誌,微信給我發了一個以get方式請求過來的資料