WeChat-Django旨在為接入微信公眾平台的django開發者提供便捷的微信及微信支付功能封裝及基本的後台管理支援.
專案官方網址: https://github.com/Xavier-Lam/wechat-django
本拓展基於wechatpy ,支援的最低django版本為1.11. WeChat-Django只是一個預覽版本,可能存在較多bug並且有api及資料結構變更可能,請密切關注CHANGELOG).
USE_TZ = True
至此,您已可以開始輕鬆使用wechat_django.專案尚未提供具體的使用文檔,如需客製化需求,煩請先閱讀程式碼
想使用最新功能或是自行編輯程式碼,可clone本專案後,採用pip install -e 直接安裝到你的django專案目錄
一般而言,預設配置足以滿足需求
參數名 | 預設值 | 說明 |
---|---|---|
WECHAT_SITE_HOST | None | 用於接收微信回呼的預設域名 |
WECHAT_SITE_HTTPS | True | 接收微信回呼網域是否為https |
WECHAT_PATCHADMINSITE | True | 是否將django預設的adminsite替換為wechat_django預設的adminsite, 預設替換 |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | 用於儲存微信accesstoken等資料的wechatpy.session.SessionStorage 物件,或接收wechat_django.models.WeChatApp 物件並產生其實例的工廠方法 |
WECHAT_MESSAGETIMEOFFSET | 180 | 微信請求訊息時,timestamp與伺服器時間差超過該值的請求將被拋棄 |
WECHAT_MESSAGENOREPEATNONCE | True | 是否對微信訊息防重播檢查預設檢查 |
logger | 說明 |
---|---|
wechat.admin.{appname} | admin異常日誌最低等級warning |
wechat.api.{appname} | api日誌最低等級debug |
wechat.handler.{appname} | 訊息處理日誌最低等級debug |
wechat.oauth.{appname} | 網頁授權異常日誌最低等級warning |
wechat.site.{appname} | 網站view異常日誌(如素材代理) 最低等級warning |
可透過wechat_django.oauth.wechat_auth
裝飾器進行網頁授權,授權後,request將被附上一個名為wechat的wechat_django.oauth.WeChatOAuthInfo
物件,可透過request.wechat.user 拿到wechat_django.models.WeChatUser
,透過request.wechat.user 拿到wechat_django.models.WeChatUser,透過request.wechat.user request.wechat.app 拿到wechat_django.models.WeChatApp
實例,以下是一個基本範例
from wechat_django import wechat_auth
@wechat_auth("your_app_name")
def your_view(request, *args, **kwargs):
""":type request: wechat_django.requests.WeChatOAuthRequest"""
user = request.wechat.user
對於預設重新導向行為不滿意的,可以自訂response,具體的參數說明參見wechat_django.oauth.wechat_auth
裝飾器的docstring
對於class based view,可繼承wechat_django.oauth.WeChatOAuthView
類別,具體參見程式碼
透過wechat_django.models.WeChatApp.auth
進行授權,輸入客戶端傳來的code, 輸出一個使用者物件以及原始回應.這個方法只能拿到使用者的openid與unionid.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
對於授權後得到的session_key,框架會持久化至資料庫,此後可以透過呼叫wechat_django.models.WeChatUser.session
來執行相關操作.
auth方法同樣適用於網頁授權,第二個參數填寫網頁授權的scope,預設base.
對於已經進行過小程式授權並且session_key尚未過期的使用者,可以使用wechat_django.models.Session.decrypt_message
來解密客戶端傳來的敏感數據
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
也可使用wechat_django.models.Session.validate_message
來校驗客戶端傳來的數據
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
用戶端呼叫wx.getUserInfo
,可將rawData與signature傳遞至後端,後端透過呼叫wechat_django.models.Session.validate_message
與wechat_django.models.User.update
來更新使用者資訊
from django.http.response import HttpResponse
from wechatpy.exceptions import InvalidSignatureException
signature = request.POST["signature"]
raw_data = request.POST["rawData"]
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
return HttpResponse(status=401)
使用update方法更新用戶數據
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
具體client的使用方式,請移步wechatpy文檔
在背景設定自訂回覆,填寫自訂回覆處理程式碼的路徑,程式碼必須由wechat_django.handler.message_handler
裝飾對應的方法接收一個wechat_django.models.WeChatMessageInfo
物件,傳回字串或一個wechatpy.replies.BaseReply
物件
from wechat_django import message_handler
@message_handler
def custom_business(message):
"""
:type message: wechat_django.models.WeChatMessageInfo
"""
user = message.user
msg = message.message
text = "hello, {0}! we received a {1} message.".format(
user, msg.type)
return TextReply(content=text.encode())
使用微信付款,需要在INSTALLED_APP的wechat_django
後面加上wechat_django.pay
.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
order = app.pay.create_order(
user="user-instance", body="body", total_fee=1,
out_trade_no="***debug***20190613001") # 也可以用openid="openid"代替user参数
prepay = order.prepay(request)
將jsapi參數交給前端
jsapi_params = order.jsapi_params(prepay["prepay_id"])
主動查詢訂單狀態
order.sync()
當訂單更新時,會發出wechat_django.pay.signals.order_updated
信號,sender為訂單wechat_django.utils.func.Static("{appname}.{payname}")
.信號提供4個變量
變數 | 說明 |
---|---|
result | 訂單結果( wechat_django.pay.models.UnifiedOrderResult ) |
order | 更新的訂單( wechat_django.pay.models.UnifiedOrder ) |
state | 訂單狀態( wechat_django.pay.models.UnifiedOrderResult.State ) |
attach | 結果附帶的資訊(產生訂單時傳給微信伺服器的attach) |
使用範例
from django.dispatch import receiver
from wechat_django.pay import signals
@receiver(signals.order_updated)
def order_updated(result, order, state, attach):
if state == UnifiedOrderResult.State.SUCCESS:
pass
注意! 每次主動調用,微信通知或是後台重新觸發都會發送信號,請自行確保訂單成功信號邏輯只執行一次!
本專案class-based OAuth授權相容django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
的視圖類別;appname
屬性;permission_classes
(若資源必須授權才可存取,請在permission_classes中新增wechat_django.oauth.WeChatAuthenticated
);handle_exception
方法中捕獲rest_framework.exceptions.NotAuthenticated
,自行處理.可以參考範例專案的rest.py檔.
請參閱管理後台使用簡介文檔
可參考本項目sample資料夾
Xavier-Lam@NetDragon