說明:該篇部落格是部落客一字一碼編寫的,實屬不易,請尊重原創,謝謝大家!
接着上一篇部落格繼續往下寫 :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方式請求過來的資料