1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xavier-lam-django-wechat

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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).

Содержание:

  • Функции;
  • Установка и настройка;
    • Первоначальная установка;
    • Прямое добавление в проект;
    • Обновление;
    • Настройка;
    • Журнал;
    • Примечания;
  • Использование некоторых функций;
    • Авторизация веб-страницы;
    • Авторизация мини-программы;
      • Шифрование и расшифровка информации о мини-программе и обновление пользовательских данных;
    • Активный вызов API WeChat;
    • Настраиваемый ответ WeChat;
    • Платёжная система WeChat;
      • Создание единого заказа;
      • Уведомление об обновлении заказа (обратный вызов);
    • Django-rest-framework;
  • Краткое введение в использование бэкенда;
  • Пример проекта;
  • TODOS:
    • Планируемые функции;
    • Известные ошибки.
  • Changelog. Перевод текста на русский язык:

Можно использовать декоратор 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)

Активное использование API WeChat

from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()

Более подробную информацию об использовании client см. в документации wechatpy.

Настройка ответов WeChat

Настройте ответы 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, добавьте 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 или повторном запуске из бэкенда будет отправляться сигнал. Пожалуйста, убедитесь, что логика сигнала об успешном выполнении заказа выполняется только один раз!

Django-rest-framework

В этом проекте класс OAuth-авторизации совместим с django-rest-framework.

  1. Создайте класс, который наследуется от wechat_django.oauth.WeChatOAuthViewMixin.
  2. В классе определите атрибут appname.
  3. При необходимости определите permission_classes (например, если доступ к ресурсу должен быть авторизован, добавьте wechat_dragon.oauth.WechatAuthenticated в `permission_classes).
  4. При необходимости самостоятельно обрабатывайте исключения в методе handle_exception, перехватывая rest_framework.exceptions.NotAuthenticated.

Пример проекта можно найти в файле rest.py.

Использование бэкенда

Подробности смотрите в документе административное использование бэкенда.

Пример проекта

Можно посмотреть в папке образец проекта.

TODOS:

  • Можно ли сделать миграцию полностью самостоятельной? Перестроить модуль разрешений?
  • Опциональное шифрование конфиденциальных данных.
  • Cookbook
  • Логирование сообщений и ответов на уровне приложения.
  • Улучшение модульного тестирования.
  • Проверка форм в бэкенде.

Планируемые функции

  • Командная строка.
  • Подключение к сторонним платформам.
  • Предоставление доступа к токенам доступа третьим сторонам и взаимодействие с ними.
  • Сообщения и диалоги службы поддержки клиентов.
  • Очистка и защита постоянных материалов.
  • Кэш для ответов и некоторых запросов.
  • Импорт и экспорт меню и обработчиков сообщений.
  • Хранилище материалов.

Известные ошибки

  • Повторная синхронизация обработчика сообщений приводит к дублированию создания постоянных материалов.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Цель — предоставить разработчикам на Django, подключающимся к платформе WeChat, удобную обёртку над функциями WeChat и базовую поддержку для управления бэкендом. Этот репозиторий является личным репозиторием разработчика, проблемы (issues) и совместная разработка доступны в репозитории GitHub. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xavier-lam-django-wechat.git
git@api.gitlife.ru:oschina-mirror/xavier-lam-django-wechat.git
oschina-mirror
xavier-lam-django-wechat
xavier-lam-django-wechat
master