微信公衆號之接入微信公衆號服務器開發(二)

說明:該篇博客是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝你們!python

接着上一篇博客繼續往下寫 :https://blog.csdn.net/qq_41782425/article/details/85319116nginx

一丶敘述

  • 開發說明

  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. 博主之因此這樣作,那是由於我尚未購買服務器(●︿●)
  • 接入微信公衆平臺

接入微信公衆平臺開發,開發者須要按照以下步驟完成:flask

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

登陸微信公衆平臺官網後,在公衆平臺後臺管理頁面 - 開發者中心頁,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。安全

同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務器配置在提交後都會當即生效,請開發者謹慎填寫及選擇。加解密方式的默認狀態爲明文模式,選擇兼容模式和安全模式須要提早配置好相關加解密代碼,詳情請參考消息體簽名及加解密部分的文檔。服務器

1.進入微信公衆平臺後,找到開發欄,進入基本配置微信

2.利用測試平臺app

測試平臺登陸地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login微信公衆平臺

在手機微信上進行掃碼登陸便可框架

二丶驗證服務器地址的有效性

開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:ssh

開發者經過檢驗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方式請求過來的數據

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

相關文章
相關標籤/搜索