WeChat-Django tiene como objetivo proporcionar una encapsulación conveniente de WeChat y la función de pago de WeChat y soporte básico de administración de backend para los desarrolladores de Django que acceden a la plataforma pública de WeChat.
Dirección oficial del proyecto: https://github.com/Xavier-Lam/wechat-django
Esta extensión se basa en wechatpy y la versión mínima admitida de Django es 1.11. WeChat-Django es solo una versión preliminar, puede haber muchos errores y la API y la estructura de datos pueden cambiar; preste mucha atención a CHANGELOG).
USE_TZ = True
En este punto, puede comenzar a usar wechat_django fácilmente. El proyecto aún no ha proporcionado documentos de uso específicos. Si necesita requisitos personalizados, primero lea el código.
Si desea utilizar las funciones más recientes o editar el código usted mismo, puede clonar este proyecto y usar pip install -e para instalarlo directamente en el directorio de su proyecto Django.
En términos generales, la configuración predeterminada es suficiente.
Nombre del parámetro | valor predeterminado | ilustrar |
---|---|---|
WECHAT_SITE_HOST | Ninguno | Nombre de dominio predeterminado utilizado para recibir devoluciones de llamadas de WeChat |
WECHAT_SITE_HTTPS | Verdadero | Reciba una devolución de llamada de WeChat si el nombre de dominio es https |
WECHAT_PATCHADMINSITE | Verdadero | Si se debe reemplazar el sitio de administración predeterminado de django con el sitio de administración predeterminado de wechat_django, reemplazo predeterminado |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | El objeto wechatpy.session.SessionStorage utilizado para almacenar datos como el token de acceso de WeChat o el método de fábrica que recibe wechat_django.models.WeChatApp y genera su instancia. |
WECHAT_MESSAGETIMEOFFSET | 180 | Cuando WeChat solicita mensajes, las solicitudes cuya marca de tiempo difiera de la hora del servidor en más de este valor se descartarán. |
WECHAT_MESSAGENOREPEATNONCE | Verdadero | Si se debe verificar la antirreproducción de mensajes de WeChat de forma predeterminada |
registrador | ilustrar |
---|---|
wechat.admin.{nombre de la aplicación} | Advertencia de nivel más bajo del registro de excepciones de administrador |
wechat.api.{nombre de aplicación} | depuración del nivel más bajo del registro de API |
wechat.handler.{nombre de aplicación} | Depuración del nivel más bajo del registro de procesamiento de mensajes |
wechat.oauth.{nombre de la aplicación} | El nivel más bajo del registro de excepciones de autorización de la página web es advertencia. |
wechat.site.{appname} | Advertencia de nivel más bajo del registro de excepciones de vista del sitio (como proxy de material) |
La autorización de la página web se puede realizar a través wechat_django.oauth.wechat_auth
. Después de la autorización, la solicitud se adjuntará con un objeto wechat_django.oauth.WeChatOAuthInfo
llamado wechat. La instancia wechat_django.models.WeChatUser
se puede obtener a través de request.wechat.user. solicitud.wechat.app Obtenga la instancia wechat_django.models.WeChatApp
, el siguiente es un ejemplo básico
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 no está satisfecho con el comportamiento de redirección predeterminado, puede personalizar la respuesta. Para obtener descripciones de parámetros específicos, consulte la cadena de documentación del decorador wechat_django.oauth.wechat_auth
.
Para una vista basada en clases, puede heredar la clase wechat_django.oauth.WeChatOAuthView
; consulte el código para obtener más detalles.
Autorice a través de wechat_django.models.WeChatApp.auth
, ingrese el código del cliente y genere un objeto de usuario y la respuesta original. Este método solo puede obtener el openid y el unionid del usuario.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
Para la clave de sesión obtenida después de la autorización, el marco se conservará en la base de datos y luego podrá realizar operaciones relacionadas llamando a wechat_django.models.WeChatUser.session
.
El método de autenticación también es aplicable a la autorización de la página web. El segundo parámetro completa el alcance de la autorización de la página web.
Para los usuarios que ya han autorizado el mini programa y cuya clave de sesión no ha caducado, pueden usar wechat_django.models.Session.decrypt_message
para descifrar los datos confidenciales enviados desde el cliente.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
También puedes usar wechat_django.models.Session.validate_message
para verificar los datos enviados desde el cliente.
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
El cliente llama wx.getUserInfo
para pasar rawData y la firma al backend. El backend actualiza la información del usuario llamando a wechat_django.models.Session.validate_message
y 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)
Actualizar los datos del usuario usando el método de actualización
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Para obtener instrucciones específicas sobre cómo utilizar el cliente, consulte la documentación de wechatpy.
Configure una respuesta personalizada en segundo plano y complete la ruta del código de procesamiento de respuesta personalizada. El código debe estar decorado con wechat_django.handler.message_handler
El método correspondiente recibe un objeto wechat_django.models.WeChatMessageInfo
y devuelve una cadena o un 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())
Para utilizar el pago WeChat, debe agregar wechat_django.pay
después de wechat_django
en 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)
Pasar parámetros jsapi al front-end
jsapi_params = order.jsapi_params(prepay["prepay_id"])
Verificar activamente el estado del pedido
order.sync()
Cuando se actualiza el pedido, se emitirá wechat_django.pay.signals.order_updated
. El remitente proporciona 4 variables para el pedido wechat_django.utils.func.Static("{appname}.{payname}")
La señal.
variable | ilustrar |
---|---|
resultado | Resultado del pedido ( wechat_django.pay.models.UnifiedOrderResult ) |
orden | Orden actualizada ( wechat_django.pay.models.UnifiedOrder ) |
estado | Estado del pedido ( wechat_django.pay.models.UnifiedOrderResult.State ) |
adjuntar | Información adjunta al resultado (el adjunto se pasa al servidor WeChat al generar un pedido) |
Ejemplo de uso
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
¡Atención! Se enviará una señal por cada llamada activa, notificación de WeChat o reactivación en segundo plano. ¡Asegúrese de que la lógica de señal de éxito del pedido solo se ejecute una vez!
La autorización OAuth basada en clases de este proyecto es compatible con django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
;appname
en la clase de vista;permission_classes
según sea necesario (si el recurso debe estar autorizado antes del acceso, agregue wechat_django.oauth.WeChatAuthenticated
en permiso_clases);rest_framework.exceptions.NotAuthenticated
en el método handle_exception
y manéjelo usted mismo.Puede ver el archivo rest.py del proyecto de ejemplo.
Consulte el documento de introducción al uso de antecedentes de gestión.
Consulte la carpeta de muestra de este proyecto.
Xavier-Lam@NetDragon