1. 程式人生 > >微信公眾號之接入微信公眾號伺服器開發(二)

微信公眾號之接入微信公眾號伺服器開發(二)

說明:該篇部落格是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝大家!

接著上一篇部落格繼續往下寫 :https://blog.csdn.net/qq_41782425/article/details/85319116

一丶敘述

  • 開發說明

  1. Python程式碼實現(以Flask框架為例)
  2. 將使用公眾號訊息會話
  3. 客戶端---->微信伺服器---->nginx伺服器---->開發者伺服器
  4. 在微信伺服器與開發者伺服器之間搭建了nginx伺服器預設為80埠(也是微信支援的埠),跟開發者伺服器屬於同一個主機
  5. 在nginx伺服器上配置了多個埠,方便多人進行測試,轉發規則:location/wechat8007
  6. 在微信公眾號測試平臺介面配置url為host/wechat8007時,當微信伺服器傳送訊息給host/wechat8007時,host為nginx伺服器時,就會按照/wechat8007轉發規則匹配,一旦匹配成功後,由nginx伺服器轉發給開發者伺服器上127.0.0.1:8007程序的使用者,這樣可以實現多個賬號共享一個80埠,並可以收到微信伺服器對應使用者的訊息
  7. 注:在寫的flask程式中檢視網址也必須是/wechat8007,因為nginx在向後臺轉發的時候,它只是按照/wechat8007規則知道轉發給誰,它會把微信使用者的請求原封不動的往後去發,因為微信伺服器在向我們傳送請求路徑就是/wechat:8007,意味著nginx再轉發給我們的時候,在我們寫的flask程式收到的請求裡面,你會發現對應的請求路徑也是/wechat8007,所以我們flask程式中的route路徑也必須是/wechat8007
  8. 如果是在公司做開發的話,不涉及到多個賬戶使用一個80埠,所以直接把程式在開發者伺服器上以80埠執行,然後在微信公眾測試平臺配置url為配置程式地址即可
  9. 博主之所以這樣做,那是因為我還沒有購買伺服器(●︿●)
  • 接入微信公眾平臺

接入微信公眾平臺開發,開發者需要按照如下步驟完成:

  1. 填寫伺服器配置
  2. 驗證伺服器地址的有效性
  3. 依據介面文件實現業務邏輯
  • 填寫伺服器配置

登入微信公眾平臺官網後,在公眾平臺後臺管理頁面 - 開發者中心頁,點選“修改配置”按鈕,填寫伺服器地址(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引數內容,則接入生效,成為開發者成功,否則接入失敗。

 

校驗流程:

  1. 將token、timestamp、nonce三個引數進行字典序排序
  2. 將三個引數字串拼接成一個字串進行sha1加密
  3. 開發者獲得加密後的字串可與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方式請求過來的資料

大功告成!說明該伺服器具有有效性....