WeChat-Django предназначен для разработчиков, подключающих своё Django-приложение к платформе WeChat. Он предоставляет удобные функции интеграции с WeChat и его платёжной системой, а также базовую поддержку управления через административную панель.
Проект доступен на GitHub: https://github.com/Xavier-Lam/wechat-django.
WeChat-Django основан на wechatpy и поддерживает минимальную версию Django 1.11. WeChat-Django является предварительной версией и может содержать множество ошибок, а также возможны изменения в API и структуре данных. Следите за CHANGELOG (CHANGELOG.md).
Содержание:
Можно использовать декоратор wechat_django.oauth.wechat_auth
для авторизации веб-страницы, после авторизации request будет дополнен объектом wechat_django.oauth.WeChatOAuthInfo
, который называется wechat. Можно получить экземпляр wechat_django.models.WeChatUser
через request.wechat.user
и экземпляр wechat_django.models.WeChatApp
через request.wechat.app
. Вот базовый пример:
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
Если вас не устраивает поведение по умолчанию при перенаправлении, вы можете настроить ответ. Подробные инструкции см. в документации декоратора wechat_django.oauth.wechat_auth
.
Для представления на основе класса можно наследовать класс wechat_django.oauth.WeChatOAuthView
, подробности см. в коде.
Выполните авторизацию с помощью wechat_django.models.WeChatApp.auth
, предоставив код, полученный от клиента. В результате вы получите объект пользователя и исходный ответ. Этот метод позволяет получить только 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 также подходит для авторизации на веб-странице. Второй параметр должен содержать область действия веб-страницы авторизации, по умолчанию 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 на сервере. Укажите путь к коду обработки настраиваемых ответов. Код должен быть оформлен как соответствующий метод, украшенный 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())
Чтобы использовать платежи WeChat, добавьте wechat_django.pay
после wechat_django
в 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)
Передайте параметры 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}")
). Сигнал содержит четыре переменные:
Переменная | Описание |
---|---|
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
Внимание! Каждый раз при активном вызове, уведомлении от WeChat или повторном запуске из бэкенда будет отправляться сигнал. Пожалуйста, убедитесь, что логика сигнала об успешном выполнении заказа выполняется только один раз!
В этом проекте класс OAuth-авторизации совместим с django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
.appname
.permission_classes
(например, если доступ к ресурсу должен быть авторизован, добавьте wechat_dragon.oauth.WechatAuthenticated
в `permission_classes).handle_exception
, перехватывая rest_framework.exceptions.NotAuthenticated
.Пример проекта можно найти в файле rest.py.
Подробности смотрите в документе административное использование бэкенда.
Можно посмотреть в папке образец проекта.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )