現在很多人都在做微信公眾號開發,但大多數人都是按照騰訊公司給出的文件在用 PHP 或者 Java 做開發,那麼用 Python 如何做?
微信公眾號的準備
- 註冊
訪問地址:https://mp.weixin.qq.com/,按照提示註冊即可。
注意:本文樣例使用個人公眾號,由於個人公眾號沒有介面許可權,自定義選單無法進行開發,同學們不要註冊錯!
- 配置
需要準備好自己的伺服器地址,可以使用騰訊雲阿里雲京東雲等等皆可,沒有域名用 IP 也可以。
在公眾平臺官網的開發-基本設定頁面,勾選協議成為開發者,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token 和 EncodingAESKey,其中 URL 是開發者用來接收微信訊息和事件的介面 URL。Token 可由開發者可以任意填寫,用作生成簽名(該 Token 會和介面 URL 中包含的 Token 進行比對,從而驗證安全性)。EncodingAESKey 由開發者手動填寫或隨機生成,將用作訊息體加解密金鑰。
按照要求對開發基本資訊配置,如下:
- 連線
伺服器配置提交後,微信伺服器傳送 GET 請求到填寫的伺服器地址 URL 上,GET 請求攜帶引數包括 signature、timestamp、nonce、echostr,服務端程式通過檢驗 signature 對請求進行校驗(下面有校驗方式)。
若確認此次 GET 請求來自微信伺服器,請原樣返回 echostr 引數內容給微信伺服器確認後接入生效。加密/校驗流程如下,下文中有程式碼具體實現:
將 token、timestamp、nonce 三個引數進行字典序排序;
將三個引數字串拼接成一個字串進行 sha1 加密;
開發者獲得加密後的字串可與 signature 對比,標識該請求來源於微信。
▌基於 Django 開發微信公眾號後臺
1.準備工作
新建 django project,專案名稱為 weixin:
django-admin.py startproject weixin
新建 app,進入專案目錄下,cd weixin 然後執行下面的命令:
python manage.py startapp weixin
或者如下命令:
django-admin.py startapp weixin
修改 settings.py 加入剛才建立的 weixin 應用:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'weixin',
)
修改專案同名 app 內的 urls.py,新增新的 weixin 的路由解析跳轉:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^weixin/', include('weixin.urls',namespace="weixin")),
]
2.編寫 weixin 應用的 urls.py
修改 app weixin 內的 urls.py,新增針對檢視函式的解析,預設訪問指向檢視函式的 weixin_index 方法。
app_name = 'weixin'
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='weixin_index'),
]
3.編寫 weinxin 應用的 views.py
GET 方法做校驗,POST 方法傳 xml 資料,解析和拼湊 xml 資料實現自動回覆功能:
from django.http.response import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from wechat_sdk import WechatBasic
from wechat_sdk.exceptions import ParseError
from wechat_sdk.messages import TextMessage
wechat_instance = WechatBasic(
token='您設定的token',
appid='您的公眾號id',
appsecret='您的公眾號的祕鑰'
)
@csrf_exempt
def index(request):
if request.method == 'GET':
# 從 request 中提取基本資訊 (signature, timestamp, nonce, xml)
signature = request.GET.get('signature')
timestamp = request.GET.get('timestamp')
nonce = request.GET.get('nonce')
if not wechat_instance.check_signature(
signature=signature, timestamp=timestamp, nonce=nonce):
return HttpResponseBadRequest('Verify Failed')
return HttpResponse(
request.GET.get('echostr', ''), content_type="text/plain")
# 解析本次請求的 XML 資料
else:
try:
print(request.body)
wechat_instance.parse_data(data=request.body)
except ParseError:
return HttpResponseBadRequest('Invalid XML Data')
# 獲取解析好的微信請求資訊
message = wechat_instance.get_message()
# 關注事件以及不匹配時的預設回覆
response = wechat_instance.response_text(
content=(
'感謝您的關注!\n回覆【功能】兩個字檢視支援的功能,還可以回覆任意內容開始聊天'
))
if isinstance(message, TextMessage):
# 當前會話內容
content = message.content.strip()
if content == '功能':
reply_text = (
'目前支援的功能:\n1. 關鍵詞後面加上【教程】兩個字可以搜尋教程,'
'比如回覆 "Django 後臺教程"\n'
'2.回覆任意詞語,查天氣,陪聊天,講故事,無所不能!\n'
'還有更多功能正在開發中哦 ^_^\n'
)
response = wechat_instance.response_text(content=reply_text)
print(response)
return HttpResponse(response, content_type="application/xml")
▌配置公網域名對映後,執行程式進行效果展示
python manage.py runserver 0.0.0.0:80
發現不能正常使用,提示“該公眾號提供的服務出現故障,請稍後再試”。
於是百度裡各種找資料,又是檢視微信公眾號開發文件,各種百度和 Google,都沒有解決。微信公眾平臺關閉啟用,重置金鑰。仔細核對填寫,都沒有問題。沒有填寫錯誤。
我開啟了開發-運維中心-介面報警-告警規則全部調到“1次/5分鐘”,偶爾會收到這樣的報錯:302 網頁重定向出錯。
最後,我就查到微信公眾平臺-開發-基本配置-伺服器配置-伺服器地址(url),這裡的 http:// 頭改成 https://。
再試自動回覆真的可以了。