天天看點

微信公衆号之接入微信公衆号伺服器開發(二)一丶叙述二丶驗證伺服器位址的有效性

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

接着上一篇部落格繼續往下寫 :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方式請求過來的資料

微信公衆号之接入微信公衆号伺服器開發(二)一丶叙述二丶驗證伺服器位址的有效性

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

繼續閱讀