WeChat-Django tem como objetivo fornecer encapsulamento conveniente de funções de pagamento WeChat e WeChat e suporte básico de gerenciamento de back-end para desenvolvedores Django que acessam a plataforma pública WeChat.
Endereço oficial do projeto: https://github.com/Xavier-Lam/wechat-django
Esta extensão é baseada em wechatpy, e a versão mínima do Django suportada é 1.11. WeChat-Django é apenas uma versão de visualização, pode haver muitos bugs e a API e a estrutura de dados podem mudar, preste muita atenção ao CHANGELOG).
USE_TZ = True
Neste ponto, você pode começar a usar o wechat_django facilmente. O projeto ainda não forneceu documentos de uso específicos. Se você precisar de requisitos personalizados, leia o código primeiro.
Se você quiser usar os recursos mais recentes ou editar o código você mesmo, você pode clonar este projeto e usar pip install -e para instalá-lo diretamente no diretório do projeto Django.
De modo geral, a configuração padrão é suficiente
Nome do parâmetro | valor padrão | ilustrar |
---|---|---|
WECHAT_SITE_HOST | Nenhum | Nome de domínio padrão usado para receber retornos de chamada do WeChat |
WECHAT_SITE_HTTPS | Verdadeiro | Receba retorno de chamada do WeChat se o nome de domínio for https |
WECHAT_PATCHADMINSITE | Verdadeiro | Se deve substituir o adminsite padrão do Django pelo adminsite padrão do wechat_django, substituição padrão |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | O objeto wechatpy.session.SessionStorage usado para armazenar dados como o token de acesso WeChat ou o método de fábrica que recebe wechat_django.models.WeChatApp e gera sua instância |
WECHAT_MESSAGETIMEOFFSET | 180 | Quando o WeChat solicita mensagens, as solicitações cujo carimbo de data e hora difere do horário do servidor em mais que esse valor serão descartadas. |
WECHAT_MESSAGENOREPEATNONCE | Verdadeiro | Se deve verificar a anti-repetição de mensagens do WeChat por padrão |
registrador | ilustrar |
---|---|
wechat.admin.{nome do aplicativo} | Aviso de nível mais baixo do registro de exceção do administrador |
wechat.api.{nome do aplicativo} | log da API depuração de nível mais baixo |
wechat.handler.{nome do aplicativo} | Depuração de nível mais baixo do log de processamento de mensagens |
wechat.oauth.{nome do aplicativo} | O nível mais baixo do log de exceção de autorização de página da web é aviso. |
wechat.site.{nome do aplicativo} | Log de exceção de visualização do site (como proxy de material) aviso de nível mais baixo |
A autorização da página web pode ser realizada wechat_django.models.WeChatUser
wechat_django.oauth.wechat_auth
Após a autorização, a solicitação será anexada a um objeto wechat_django.oauth.WeChatOAuthInfo
chamado wechat. .solicitação.wechat.app Obtenha a instância wechat_django.models.WeChatApp
, a seguir está um exemplo 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
Se você não estiver satisfeito com o comportamento de redirecionamento padrão, poderá personalizar a resposta. Para descrições de parâmetros específicos, consulte a documentação do decorador wechat_django.oauth.wechat_auth
.
Para visualização baseada em classe, você pode herdar a classe wechat_django.oauth.WeChatOAuthView
, consulte o código para obter detalhes
Autorize por meio de wechat_django.models.WeChatApp.auth
, insira o código do cliente e produza um objeto de usuário e a resposta original. Este método só pode obter o openid e o unionid do usuário.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
Para o session_key obtido após a autorização, a estrutura será persistida no banco de dados e você poderá então executar operações relacionadas chamando wechat_django.models.WeChatUser.session
.
O método auth também é aplicável à autorização de páginas da web. O segundo parâmetro preenche o escopo da autorização de páginas da web. O padrão é base.
Para usuários que já autorizaram o miniprograma e cuja session_key não expirou, você pode usar wechat_django.models.Session.decrypt_message
para descriptografar dados confidenciais enviados do cliente.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
Você também pode usar wechat_django.models.Session.validate_message
para verificar os dados enviados do cliente
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
O cliente chama wx.getUserInfo
para passar rawData e assinatura para o backend. O backend atualiza as informações do usuário chamando wechat_django.models.Session.validate_message
e 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)
Atualizar dados do usuário usando o método de atualização
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Para obter instruções específicas sobre como usar o cliente, consulte a documentação do wechatpy.
Configure uma resposta personalizada em segundo plano e preencha o caminho do código de processamento de resposta personalizado. O código deve ser decorado por wechat_django.handler.message_handler
O método correspondente recebe um objeto wechat_django.models.WeChatMessageInfo
e retorna uma string ou um 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 usar o pagamento WeChat, você precisa adicionar wechat_django.pay
após wechat_django
em 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)
Passe parâmetros jsapi para o front end
jsapi_params = order.jsapi_params(prepay["prepay_id"])
Verifique ativamente o status do pedido
order.sync()
Quando o pedido for atualizado, wechat_django.pay.signals.order_updated
será emitido. O remetente fornece 4 variáveis para o pedido wechat_django.utils.func.Static("{appname}.{payname}")
.
variável | ilustrar |
---|---|
resultado | Resultado do pedido ( wechat_django.pay.models.UnifiedOrderResult ) |
ordem | Pedido atualizado ( wechat_django.pay.models.UnifiedOrder ) |
estado | Status do pedido ( wechat_django.pay.models.UnifiedOrderResult.State ) |
anexar | Informações anexadas ao resultado (anexo passado ao servidor WeChat ao gerar um pedido) |
Exemplo 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
Atenção! Um sinal será enviado para cada chamada ativa, notificação do WeChat ou reativação em segundo plano. Certifique-se de que a lógica do sinal de sucesso do pedido seja executada apenas uma vez!
A autorização OAuth baseada em classe deste projeto é compatível com Django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
;appname
na classe de visualização;permission_classes
conforme necessário (se o recurso precisar ser autorizado antes do acesso, adicione wechat_django.oauth.WeChatAuthenticated
em permission_classes);rest_framework.exceptions.NotAuthenticated
no método handle_exception
e trate disso sozinho.Você pode ver o arquivo rest.py do projeto de exemplo.
Consulte o documento de introdução ao uso do histórico de gerenciamento
Consulte a pasta de amostra deste projeto
Xavier-Lam@NetDragon