源代碼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地址添加到白名單中