WeChat-Django zielt darauf ab, Django-Entwicklern, die auf die öffentliche WeChat-Plattform zugreifen, eine praktische Kapselung der WeChat- und WeChat-Zahlungsfunktionen sowie grundlegende Unterstützung für die Backend-Verwaltung bereitzustellen.
Offizielle Projektadresse: https://github.com/Xavier-Lam/wechat-django
Diese Erweiterung basiert auf Wechatpy und die mindestens unterstützte Django-Version ist 1.11. WeChat-Django ist nur eine Vorschauversion. Es kann viele Fehler geben und es kann zu Änderungen an der API und der Datenstruktur kommen. Bitte beachten Sie CHANGELOG.
USE_TZ = True
An diesem Punkt können Sie problemlos mit der Verwendung von wechat_django beginnen. Das Projekt hat noch keine spezifischen Nutzungsdokumente bereitgestellt. Wenn Sie individuelle Anforderungen benötigen, lesen Sie bitte zuerst den Code.
Wenn Sie die neuesten Funktionen nutzen oder den Code selbst bearbeiten möchten, können Sie dieses Projekt klonen und mit pip install -e direkt in Ihrem Django-Projektverzeichnis installieren.
Im Allgemeinen ist die Standardkonfiguration ausreichend
Parametername | Standardwert | veranschaulichen |
---|---|---|
WECHAT_SITE_HOST | Keiner | Standarddomänenname, der zum Empfang von WeChat-Rückrufen verwendet wird |
WECHAT_SITE_HTTPS | WAHR | Erhalten Sie einen WeChat-Rückruf, unabhängig davon, ob der Domainname https ist |
WECHAT_PATCHADMINSITE | WAHR | Ob die Standard-Adminsite von Django durch die Standard-Adminsite von wechat_django ersetzt werden soll, Standardersetzung |
WECHAT_SESSIONSTORAGE | „django.core.cache.cache“ | Das wechatpy.session.SessionStorage -Objekt, das zum Speichern von Daten wie dem WeChat-Zugriffstoken verwendet wird, oder die Factory-Methode, die wechat_django.models.WeChatApp -Objekt empfängt und seine Instanz generiert |
WECHAT_MESSAGETIMEOFFSET | 180 | Wenn WeChat Nachrichten anfordert, werden Anfragen, deren Zeitstempel um mehr als diesen Wert von der Serverzeit abweicht, verworfen. |
WECHAT_MESSAGENOREPEATNONCE | WAHR | Ob standardmäßig die Anti-Wiedergabe von WeChat-Nachrichten aktiviert werden soll |
Logger | veranschaulichen |
---|---|
wechat.admin.{appname} | Warnung der niedrigsten Ebene des Admin-Ausnahmeprotokolls |
wechat.api.{appname} | API-Protokoll, Debug auf niedrigster Ebene |
wechat.handler.{appname} | Debuggen des Nachrichtenverarbeitungsprotokolls auf der niedrigsten Ebene |
wechat.oauth.{appname} | Die unterste Ebene des Ausnahmeprotokolls für die Webseitenautorisierung ist die Warnung. |
wechat.site.{appname} | Warnung der niedrigsten Ebene der Site-Ansichtsausnahme (z. B. Material-Proxy). |
Die Webseitenautorisierung kann über wechat_django.oauth.wechat_auth
durchgeführt werden. Nach der Autorisierung wird die Anfrage mit einem wechat_django.oauth.WeChatOAuthInfo
-Objekt namens wechat angehängt. Die wechat_django.models.WeChatUser
-Instanz kann über request.wechat.user abgerufen werden . request.wechat.app Holen Sie sich die Instanz wechat_django.models.WeChatApp
. Das Folgende ist ein einfaches Beispiel
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
Wenn Sie mit dem Standardumleitungsverhalten nicht zufrieden sind, können Sie die Antwort anpassen. Spezifische Parameterbeschreibungen finden Sie im Dokumentstring des wechat_django.oauth.wechat_auth
Dekorators.
Für die klassenbasierte Ansicht können Sie die Klasse wechat_django.oauth.WeChatOAuthView
erben. Weitere Informationen finden Sie im Code
Autorisieren Sie über wechat_django.models.WeChatApp.auth
, geben Sie den Code vom Client ein und geben Sie ein Benutzerobjekt und die ursprüngliche Antwort aus. Diese Methode kann nur die OpenID und UnionID des Benutzers abrufen.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
Für den nach der Autorisierung erhaltenen Sitzungsschlüssel wird das Framework in der Datenbank gespeichert. Anschließend können Sie entsprechende Vorgänge ausführen, indem Sie wechat_django.models.WeChatUser.session
aufrufen.
Die Authentifizierungsmethode gilt auch für die Webseitenautorisierung. Der zweite Parameter füllt den Umfang der Webseitenautorisierung aus.
Für Benutzer, die das Miniprogramm bereits autorisiert haben und deren Sitzungsschlüssel noch nicht abgelaufen ist, können Sie wechat_django.models.Session.decrypt_message
verwenden, um vom Client gesendete vertrauliche Daten zu entschlüsseln.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
Sie können auch wechat_django.models.Session.validate_message
verwenden, um die vom Client gesendeten Daten zu überprüfen
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
Der Client ruft wx.getUserInfo
auf, um Rohdaten und Signaturen an das Backend zu übergeben. Das Backend aktualisiert Benutzerinformationen durch Aufrufen wechat_django.models.Session.validate_message
und 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)
Aktualisieren Sie Benutzerdaten mithilfe der Update-Methode
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Spezifische Anweisungen zur Verwendung des Clients finden Sie in der Wechatpy-Dokumentation.
Konfigurieren Sie eine benutzerdefinierte Antwort im Hintergrund und geben Sie den Pfad des benutzerdefinierten Antwortverarbeitungscodes ein. Der Code muss mit wechat_django.handler.message_handler
Die entsprechende Methode empfängt ein wechat_django.models.WeChatMessageInfo
Objekt und gibt einen String oder eine wechatpy.replies.BaseReply
Objekt.
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())
Um die WeChat-Zahlung zu nutzen, müssen Sie wechat_django.pay
nach wechat_django
in INSTALLED_APP hinzufügen.
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)
Übergeben Sie JSAPI-Parameter an das Frontend
jsapi_params = order.jsapi_params(prepay["prepay_id"])
Bestellstatus aktiv prüfen
order.sync()
Wenn die Bestellung aktualisiert wird, wird wechat_django.pay.signals.order_updated
ausgegeben. Der Absender stellt 4 Variablen für die Bestellung bereit wechat_django.utils.func.Static("{appname}.{payname}")
Variable | veranschaulichen |
---|---|
Ergebnis | Bestellergebnis ( wechat_django.pay.models.UnifiedOrderResult ) |
Befehl | Aktualisierte Bestellung ( wechat_django.pay.models.UnifiedOrder ) |
Zustand | Bestellstatus ( wechat_django.pay.models.UnifiedOrderResult.State ) |
befestigen | An das Ergebnis angehängte Informationen (Anhang, der beim Generieren einer Bestellung an den WeChat-Server übergeben wird) |
Anwendungsbeispiel
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
Achtung! Bei jedem aktiven Anruf, jeder WeChat-Benachrichtigung oder jedem Hintergrund-Retrigger wird ein Signal gesendet. Bitte stellen Sie sicher, dass die Signallogik für den Bestellerfolg nur einmal ausgeführt wird!
Die klassenbasierte OAuth-Autorisierung dieses Projekts ist mit dem Django-Rest-Framework kompatibel.
wechat_django.oauth.WeChatOAuthViewMixin
erbt.appname
Attribut in der Ansichtsklasse.permission_classes
nach Bedarf (wenn Ressourcen vor dem Zugriff autorisiert werden müssen, fügen Sie bitte wechat_django.oauth.WeChatAuthenticated
in „permission_classes“ hinzu).rest_framework.exceptions.NotAuthenticated
in der Methode handle_exception
und behandeln Sie sie selbst.Sie können die rest.py-Datei des Beispielprojekts sehen.
Weitere Informationen finden Sie im Einführungsdokument zur Verwendung des Verwaltungshintergrunds
Bitte beachten Sie den Beispielordner dieses Projekts
Xavier-Lam@NetDragon