WeChat-Django стремится предоставить удобную инкапсуляцию платежных функций WeChat и WeChat, а также базовую поддержку управления серверной частью для разработчиков Django, которые получают доступ к общедоступной платформе WeChat.
Официальный адрес проекта: https://github.com/Xavier-Lam/wechat-django.
Это расширение основано на wechatpy, а минимальная поддерживаемая версия Django — 1.11. WeChat-Django — это только предварительная версия, может быть много ошибок и могут быть изменения API и структуры данных, пожалуйста, обратите пристальное внимание на CHANGELOG).
USE_TZ = True
На этом этапе вы можете легко начать использовать wechat_django. Проект еще не предоставил конкретные документы по использованию. Если вам нужны индивидуальные требования, сначала прочитайте код.
Если вы хотите использовать новейшие функции или редактировать код самостоятельно, вы можете клонировать этот проект и использовать pip install -e, чтобы установить его непосредственно в каталог проекта Django.
Вообще говоря, конфигурации по умолчанию достаточно.
Имя параметра | значение по умолчанию | иллюстрировать |
---|---|---|
WECHAT_SITE_HOST | Никто | Доменное имя по умолчанию, используемое для получения обратных вызовов WeChat |
WECHAT_SITE_HTTPS | Истинный | Получите обратный вызов WeChat, если доменное имя https. |
WECHAT_PATCHADMINSITE | Истинный | Заменить ли административный сайт django по умолчанию на административный сайт wechat_django по умолчанию, замена по умолчанию |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | Объект wechatpy.session.SessionStorage используемый для хранения данных, таких как токен доступа WeChat, или фабричный метод, который получает объект wechat_django.models.WeChatApp и генерирует его экземпляр. |
WECHAT_MESSAGETIMEOFFSET | 180 | Когда WeChat запрашивает сообщения, запросы, временная метка которых отличается от времени сервера более чем на это значение, будут отброшены. |
WECHAT_MESSAGENOREPEATNONCE | Истинный | Следует ли проверять по умолчанию защиту от повтора сообщений WeChat. |
лесоруб | иллюстрировать |
---|---|
wechat.admin.{имя приложения} | Предупреждение нижнего уровня журнала исключений администратора |
wechat.api.{имя приложения} | API-журнал отладки самого низкого уровня |
wechat.handler.{имя приложения} | Отладка самого низкого уровня журнала обработки сообщений |
wechat.oauth.{имя приложения} | Самый низкий уровень журнала исключений авторизации веб-страницы — предупреждение. |
wechat.site.{имя приложения} | Журнал исключений просмотра сайта (например, прокси материала) предупреждение самого низкого уровня |
Авторизацию веб-страницы можно выполнить через декоратор wechat_django.oauth.wechat_auth
. После авторизации к запросу будет прикреплен объект wechat_django.oauth.WeChatOAuthInfo
с именем wechat. Экземпляр wechat_django.models.WeChatUser
можно получить через request.wechat.user. . запрос.wechat.app Получите экземпляр wechat_django.models.WeChatApp
, ниже приведен базовый пример.
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
.
Метод аутентификации также применим к авторизации веб-страницы. Второй параметр задает область авторизации веб-страницы. По умолчанию используется базовый вариант.
Для пользователей, которые уже авторизовали мини-программу и у которых срок действия 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 и подписи на серверную часть. Серверная часть обновляет информацию о пользователе, вызывая 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)
Обновить данные пользователя с помощью метода обновления
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Конкретные инструкции по использованию клиента можно найти в документации wechatpy.
Настройте собственный ответ в фоновом режиме и укажите путь к коду обработки пользовательского ответа. Код должен быть оформлен 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
. Отправитель предоставляет 4 переменные для заказа wechat_django.utils.func.Static("{appname}.{payname}")
.
переменная | иллюстрировать |
---|---|
результат | Результат заказа ( wechat_django.pay.models.UnifiedOrderResult ) |
заказ | Обновлен заказ ( wechat_django.pay.models.UnifiedOrder ) |
состояние | Статус заказа ( wechat_django.pay.models.UnifiedOrderResult.State ) |
прикреплять | Информация, прикрепленная к результату (прикрепление передается на сервер WeChat при формировании заказа) |
Пример использования
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_django.oauth.WeChatAuthenticated
в Permission_classes);rest_framework.exceptions.NotAuthenticated
в методе handle_exception
и обрабатывайте их самостоятельно.Вы можете увидеть файл rest.py примера проекта.
См. вводный документ по использованию фонового управления.
Пожалуйста, обратитесь к образцу папки этого проекта.
Ксавье-Лам@NetDragon