Python+Django開發微信公衆號後臺

源代碼Github地址:https://github.com/2637977081/workspace-django/tree/master/HelloWorld

一、微信公衆號註冊配置

1、進入https://mp.weixin.qq.com註冊賬號密碼,(個人開發)選擇訂閱號

2、註冊成功後,進入管理頁面=》開發=》基本配置

公衆號開發信息
1、開發者ID(AppID)
開發者ID是公衆號開發識別碼,配合開發者密碼可調用公衆號的接口能力。

2、開發者密碼(AppSecret)重置 【生成後複製保存】
開發者密碼是校驗公衆號開發者身份的密碼,具有極高的安全性。切記勿把密碼直接交給第三方開發者或直接存儲在代碼中。如需第三方代開發公衆號,請使用授權方式接入。

3、IP白名單查看
通過開發者ID及密碼調用獲取access_token接口時,需要設置訪問來源IP爲白名單。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
服務器配置(已啓用)
1、服務器地址(URL) 服務器api接口

2、令牌(Token) 自定義,這裏token驗證的時候需要你提供的服務器URL【api】可以訪問,這在Python部分會講述

3、消息加解密密鑰(EncodingAESKey) 加密祕鑰

4、消息加解密方式 建議直接使用明文模式,不需要使用到加密祕鑰

二、Python+Django

1、創建Django項目以及接口

1、接口需要滿足token驗證 get請求

2、接口需要滿足我們公衆號平臺的簡單回覆響應    post請求

所以我們接口格式應該是這個樣子:
if request.method == 'GET':
    # token 驗證
    xxxx
elif request.method == 'POST':
    # 公衆號業務邏輯消息處理
    xxx

2、token驗證,微信平臺會發生get請求到服務url上,我們需要對其校驗返回。完成這部分代碼開發後,我們就可以完成token驗證了

接收參數:signature、echostr、timestamp、nonce
hash加密規則(python3):【這部分代碼是根據騰訊api及網上查詢修改的,吐槽騰訊api文檔】

    def token_verification(token, timestamp, nonce):
		list = [token, timestamp, nonce]
		list.sort()
		sha1 = hashlib.sha1()
		sha1.update(list[0].encode('utf-8'))
		sha1.update(list[1].encode('utf-8'))
		sha1.update(list[2].encode('utf-8'))
		hashcode = sha1.hexdigest()
		return hashcode


我們需要驗證返回的hashcode,驗證成功返回echostr,這樣可以校驗成功token
	
	if hashcode==signature:
        message = echostr
    return HttpResponse(message)

3、初始化對象

使用wechat_sdk,Django版本:
	from wechat_sdk import WechatBasic
	
初始化:
	WECHAT_TOKEN = '你服務配置的token'
	WEIXIN_APPID = '公衆號平臺上的多appid'
	WEIXIN_APPSECRET = '生成的祕鑰'
	wechat = WechatBasic(token=WECHAT_TOKEN, appid=WEIXIN_APPID,appsecret=WEIXIN_APPSECRET)

4、接收消息

【還有其它如ShortVideoMessage、LinkMessage、LinkMessage、EventMessage等】    
    from wechat_sdk.messages import TextMessage, ImageMessage, VoiceMessage, VideoMessage,LocationMessage
【注】
	文本類我們可以直接接收context內容處理
	媒體類我們使用mediaId可以指明緩存數據,用於下載或者上傳
	
使用wechat的jdk轉換數據
    wechat.parse_data(data=request.body)
    message = wechat.get_message()
    if isinstance(message, TextMessage):# isinstance 可以比較兩個對象,用於識別message是什麼類型數據
        xx業務邏輯xx

5、返回消息

【注】同接收消息
	文本類我們可以直接發送context內容處理
	媒體類我們使用mediaId可以指明緩存數據
result  = wechat.response_text(context)
result = wechat.response_image(mediaId)

最終返回http響應類型爲xml
return HttpResponse(result, content_type='application/xml

6、上傳下載圖片

上傳照片
    img = open(path, 'rb')
    we_img = wechat.upload_media(media_file=img, media_type='image')

下載照片
    we_img_bytes=wechat.download_media(we_img['media_id'])
    bytes_stream = BytesIO(we_img_bytes.content)
    img_file = Image.open(bytes_stream)

三、踩坑

1、token驗證失敗

檢查服務器url是否有效,是否返回進行token驗證,是否返回echostr

2、Invalid HTTP_HOST header

Invalid HTTP_HOST header: 'xxx'. You may need to add 'xx' to ALLOWED_HOSTS.

在settings.py中添加 ALLOWED_HOSTS = ['xxxx']

3、ip禁止

wechat_sdk.exceptions.OfficialAPIError: 40164: invalid ip xxx ipv6 ::ffff:xxx, not in whitelist hint: [Qv4aVa0443e508]

ip禁止,將該ip地址添加到白名單中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章