python之微信公眾號開發(基本配置和校驗)


前言

最近有微信公眾號開發的業務,以前沒有用python做過微信公眾號開發,記錄一下自己的學習和開發歷程,共勉!

公眾號類型

  • 訂閱號

  • 普通訂閱號

  • 認證訂閱號

  • 服務號

  • 普通服務號

  • 認證服務號

服務方式

  • 公眾號消息會話:包括被動回復

  • 公眾號內嵌網頁

公眾號消息類型

  • 群發消息:由公眾號想用戶發送消息;

  • 被動回復消息:客戶端發送消息,公眾號回復;

  • 客服消息:當用戶主動發消息給公眾號,公眾號48小時里可以無限發送消息;

  • 模板消息:使用特定的模板內容主動向用戶發送消息;

公眾號的網頁接口

  • 接口1:

  • 網頁被授權獲取用戶的基本信息,由微信提供接口;

  • 接口2:

  • 微型JS-SDK,用js代碼使用原生的微信工具包;

微信公眾號開發

先注冊一個微信公眾號

  • 注冊網址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=register/step1_tmpl&lang=zh_CN

  • 進入注冊網址后按相關步驟操作即可;

  • 注冊成功后會進入微信公眾平台管理頁面

  • 登錄后進入首頁

  • 進行公眾號設置

  • 包括頭像,二維碼,名稱等;

  • 可以設置微信號;

  • 注意:

1.公眾號類型一旦被選擇就無法更改;

對接微信公眾平台

  • 填寫服務器配置

  • URL:可以是域名網址或直接的ip加端口;http必須為80端口,https必須為443端口;

  • Token: 生成簽名,微信服務器用來識別公眾號服務器;

  • EncodingAESKey:設置消息加解密密匙;

  • 驗證服務器地址的有效性

  • 開發者必須自己架設服務器,當填寫URL提交后,微信服務器會發送get請求到開發者的服務器,攜帶四個參數,自定義返回echostr參數;

  • 校驗流程:

將token、timestamp、nonce三個參數進行字典序排序
將三個參數字符串拼接成一個字符串進行sha1加密
開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信

  • 校驗的經典代碼,適用於Django、Flask、web.py等框架;
import hashlib
# 在視圖函數中
def handle(request):
    try:
        # 先獲取request
        # data = web.input()
        # if len(data) == 0:
            # return "hello, this is handle view"
        signature = request.get("signature")  # 先獲取加密簽名
        timestamp = data.timestamp  # 獲取時間戳
        nonce = request.get("nonece")  # 獲取隨機數
        echostr = request.get("echostr") # 獲取隨機字符串
        token = "xxxx" #自己設置的token
        # 使用字典序排序(按照字母或數字的大小順序進行排序)
        list = [token, timestamp, nonce]
        list.sort()
    <span class="hljs-comment"># 進行sha1加密</span>
    temp = <span class="hljs-string">''</span>.join(list)
    sha1 = hashlib.sha1(temp.encode(<span class="hljs-string">'utf-8))
    # map(sha1.update, list)
    hashcode = sha1.hexdigest()
    
    # 將加密后的字符串和signatrue對比,如果相同返回echostr,表示驗證成功
    if hashcode == signature:
        return echostr
    else:
        return ""
except Exception as e:
    return e

  • 也可以通過第三方包wechatpy實現
from wechatpy.utils import check_signature
from flask import Flask

app = Flask(name)

def get_all_args(req_dict:Dict):
echostr = req_dict.get("echostr") # 獲取隨機字符串
signature = req_dict.get("signature") # 先獲取加密簽名
timestamp = req_dict.get("timestamp") # 獲取時間戳
nonce = req_dict.get("nonce") # 獲取隨機數
return echostr,signature,timestamp,nonce

@app.route('/wechat_verify/',methods=['GET'])
def wechat_verify():
'''
用來處理微信服務器對本后台的驗證,GET方法。
:return:
'''

# 獲取參數
rq_dict = request.args
if len(rq_dict) == 0:
return ""
tuple_args = get_all_args(rq_dict)
token = current_app.config.get('TOKEN')
try:
check_signature(token, tuple_args[1], tuple_args[2], tuple_args[3])
except InvalidSignatureException as e:
logger.error(e,exc_info=True)
return ''
else:
return tuple_args[0]

  • 根據接口實現業務邏輯

  • 業務1:接收回復普通消息

當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上,這時我們的公眾號將覆蓋微信提供的自動回復的功能;

  • 微信消息的通信使用的是XMl的數據格式,在python中使用xmltodict模塊處理xml的數據;主要有兩個方法:
xmltodict.parse():可以將xml數據轉為python中的dict字典數據;
xmltodict.unparse():可以將字典轉換為xml字符串
  1. 文本消息
# 一般也有固定的格式

<xml>
<ToUserName><![CDATA[公眾號]]></ToUserName> # 開發者微信號
<FromUserName><![CDATA[粉絲號]]></FromUserName> # 發送方微信號
<CreateTime>1460537339</CreateTime> # 消息的創建時間
<MsgType><![CDATA[text]]></MsgType> # 文本的格式
<Content><![CDATA[歡迎開啟公眾號開發者模式]]></Content> # 內容
<MsgId>6272960105994287618</MsgId> # 消息本身的id
</xml>

  1. 回復文本
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName> # 接收方賬號 
<FromUserName><![CDATA[fromUser]]></FromUserName> # 開發者賬號
<CreateTime>12345678</CreateTime> # 創建時間
<MsgType><![CDATA[text]]></MsgType> # 文本類型
<Content><![CDATA[你好]]></Content> # 文本內容
</xml>
  • 圖片消息
<MsgType><![CDATA[image]]></MsgType>  # 圖片的類型為image
<PicUrl><![CDATA[this is a url]]></PicUrl> # 圖片鏈接
<MediaId><![CDATA[media_id]]></MediaId>  # 圖片消息id
  • 視頻消息
<MsgType><![CDATA[video]]></MsgType> # 視頻類型為video,小視頻為shortvideo
  • 語音消息
<MsgType><![CDATA[voice]]></MsgType>  # 語音格式
<MediaId><![CDATA[media_id]]></MediaId>  # 消息id
<Format><![CDATA[Format]]></Format> # 語音格式,如amr

視圖處理原則

  • 可以將普通的消息處理放置在一個視圖中,在一個視圖中進行判斷處理,減少視圖的數量。

  • 如果不能再5秒內及時返回,可以先返回成功或空字符串,避免出現嚴重的錯誤。

實現內嵌網頁

分成三步走:

  1. 第一步:用戶同意授權,獲取code,code指的是用戶的授權書;這時有微信發起的;
  2. 第二步:通過code換取網頁授權access_token,這時微信發下的通信證;
  3. 第三步:拉取用戶信息(需scope為 snsapi_userinfo);
  • 設置網頁授權回調域名

注意

  • 填寫的是域名,而不是URL,所以不需要添加http://等;

  • 可以填寫IP和端口;

相關文檔

  • 獲取微信公眾號access_token接口憑證:url: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

  • 獲取微信IP地址:https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN

  • 自定義菜單接口:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

  • 微信開發文檔:https://mp.weixin.qq.com/wiki/home/index.html

總結:本篇博客是對開發微信公眾號的一些整體需要做的准備工作和整體的認識,下一篇開始正式開發。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM