WeChat-Django vise à fournir une encapsulation pratique des fonctions de paiement WeChat et WeChat et une prise en charge de base de la gestion backend pour les développeurs Django qui accèdent à la plate-forme publique WeChat.
Adresse officielle du projet : https://github.com/Xavier-Lam/wechat-django
Cette extension est basée sur wechatpy, et la version minimale prise en charge de Django est 1.11. WeChat-Django n'est qu'une version préliminaire, il peut y avoir de nombreux bugs et l'API et la structure des données peuvent changer, veuillez prêter une attention particulière à CHANGELOG).
USE_TZ = True
À ce stade, vous pouvez facilement commencer à utiliser wechat_django. Le projet n'a pas encore fourni de documents d'utilisation spécifiques. Si vous avez besoin d'exigences personnalisées, veuillez d'abord lire le code.
Si vous souhaitez utiliser les dernières fonctionnalités ou modifier le code vous-même, vous pouvez cloner ce projet et utiliser pip install -e pour l'installer directement dans le répertoire de votre projet Django.
De manière générale, la configuration par défaut est suffisante
Nom du paramètre | valeur par défaut | illustrer |
---|---|---|
WECHAT_SITE_HOST | Aucun | Nom de domaine par défaut utilisé pour recevoir les rappels WeChat |
WECHAT_SITE_HTTPS | Vrai | Recevez un rappel WeChat si le nom de domaine est https |
WECHAT_PATCHADMINSITE | Vrai | S'il faut remplacer le site d'administration par défaut de Django par le site d'administration par défaut de wechat_django, remplacement par défaut |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | L'objet wechatpy.session.SessionStorage utilisé pour stocker des données telles que le jeton d'accès WeChat, ou la méthode d'usine qui reçoit wechat_django.models.WeChatApp et génère son instance |
WECHAT_MESSAGETIMEOFFSET | 180 | Lorsque WeChat demande des messages, les demandes dont l'horodatage diffère de l'heure du serveur de plus que cette valeur seront rejetées. |
WECHAT_MESSAGENOREPEATNONCE | Vrai | S'il faut vérifier l'anti-relecture des messages WeChat par défaut |
enregistreur | illustrer |
---|---|
wechat.admin.{nom de l'application} | Avertissement de niveau le plus bas du journal des exceptions de l'administrateur |
wechat.api.{nom de l'application} | débogage du niveau le plus bas du journal API |
wechat.handler.{nom de l'application} | Journal de traitement des messages, débogage de niveau le plus bas |
wechat.oauth.{nom de l'application} | Le niveau le plus bas du journal des exceptions d’autorisation de page Web est l’avertissement. |
wechat.site.{nom de l'application} | Journal des exceptions de la vue du site (tel qu'un proxy matériel) avertissement de niveau le plus bas |
L'autorisation de la page Web peut être effectuée via wechat_django.oauth.wechat_auth
. Après autorisation, la demande sera jointe à un objet wechat_django.oauth.WeChatOAuthInfo
nommé wechat. L'instance wechat_django.models.WeChatUser
peut être obtenue via request.wechat.user. .demande.wechat.app Obtenez l'instance wechat_django.models.WeChatApp
, ce qui suit est un exemple de base
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
Si vous n'êtes pas satisfait du comportement de redirection par défaut, vous pouvez personnaliser la réponse pour des descriptions de paramètres spécifiques, consultez la docstring du décorateur wechat_django.oauth.wechat_auth
.
Pour une vue basée sur les classes, vous pouvez hériter de la classe wechat_django.oauth.WeChatOAuthView
, voir le code pour plus de détails
Autorisez via wechat_django.models.WeChatApp.auth
, entrez le code du client et affichez un objet utilisateur et la réponse originale. Cette méthode ne peut obtenir que l'openid et l'unionid de l'utilisateur.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
Pour la session_key obtenue après autorisation, le framework sera conservé dans la base de données, et vous pourrez ensuite effectuer les opérations associées en appelant wechat_django.models.WeChatUser.session
.
La méthode auth est également applicable à l'autorisation de page Web. Le deuxième paramètre remplit la portée de l'autorisation de page Web. La valeur par défaut est base.
Pour les utilisateurs qui ont déjà autorisé le mini programme et dont la clé de session n'a pas expiré, vous pouvez utiliser wechat_django.models.Session.decrypt_message
pour décrypter les données sensibles envoyées par le client.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
Vous pouvez également utiliser wechat_django.models.Session.validate_message
pour vérifier les données envoyées par le client
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
Le client appelle wx.getUserInfo
pour transmettre les données brutes et la signature au backend. Le backend met à jour les informations utilisateur en appelant wechat_django.models.Session.validate_message
et 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)
Mettre à jour les données utilisateur à l'aide de la méthode de mise à jour
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Pour des instructions spécifiques sur la façon d'utiliser le client, veuillez vous référer à la documentation wechatpy.
Configurez une réponse personnalisée en arrière-plan et renseignez le chemin du code de traitement de la réponse personnalisée. Le code doit être décoré par wechat_django.handler.message_handler
La méthode correspondante reçoit un objet wechat_django.models.WeChatMessageInfo
et renvoie une chaîne ou un wechatpy.replies.BaseReply
Objet 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())
Pour utiliser le paiement WeChat, vous devez ajouter wechat_django.pay
après wechat_django
dans INSTALLED_APP.
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)
Transmettre les paramètres jsapi au front-end
jsapi_params = order.jsapi_params(prepay["prepay_id"])
Vérifier activement l'état de la commande
order.sync()
Lorsque la commande est mise à jour, wechat_django.pay.signals.order_updated
sera émis. L'expéditeur fournit 4 variables pour la commande wechat_django.utils.func.Static("{appname}.{payname}")
.
variable | illustrer |
---|---|
résultat | Résultat de la commande ( wechat_django.pay.models.UnifiedOrderResult ) |
commande | Commande mise à jour ( wechat_django.pay.models.UnifiedOrder ) |
État | Statut de la commande ( wechat_django.pay.models.UnifiedOrderResult.State ) |
attacher | Informations jointes au résultat (pièce jointe transmise au serveur WeChat lors de la génération d'une commande) |
Exemple d'utilisation
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
Attention ! Un signal sera envoyé pour chaque appel actif, notification WeChat ou redéclenchement en arrière-plan. Veuillez vous assurer que la logique du signal de réussite de la commande n'est exécutée qu'une seule fois !
L'autorisation OAuth basée sur les classes de ce projet est compatible avec Django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
;appname
dans la classe view ;permission_classes
si nécessaire (si la ressource doit être autorisée avant l'accès, veuillez ajouter wechat_django.oauth.WeChatAuthenticated
dans permission_classes) ;rest_framework.exceptions.NotAuthenticated
dans la méthode handle_exception
et gérez-les vous-même.Vous pouvez voir le fichier rest.py de l'exemple de projet.
Voir le document d'introduction à l'utilisation en arrière-plan de gestion
Veuillez vous référer au dossier d'exemple de ce projet
Xavier-Lam@NetDragon