Changelog¶
История изменений aioyookassa.
Версия 2.2.2¶
Улучшения:
Рефакторинг кода: - Устранено дублирование кода: создана утилита remove_none_values для удаления None значений из словарей - Заменено 14 вхождений повторяющегося паттерна на использование утилиты - Оптимизирован метод _remove_none_values (ранее _delete_none): теперь не мутирует оригинальный словарь - Улучшена типизация в BaseAPI: добавлены явные типы для результатов запросов - Улучшена типизация в BaseAPIClient: убран type: ignore[no-any-return] с помощью явной типизации
Улучшения типизации: - Исправлена типизация методов в aioyookassa.core.api.base - Добавлены явные аннотации типов для результатов API запросов - Улучшена поддержка mypy для модуля core.api
Технические детали:
Все изменения обратно совместимы
Покрытие тестами сохранено на уровне 92%
Версия 2.2.0¶
Новые возможности:
Добавлен обработчик webhook-уведомлений: - WebhookHandler — базовый обработчик для интеграции с любым веб-фреймворком - WebhookServer — готовый сервер на aiohttp для быстрого старта - WebhookIPValidator — валидатор IP-адресов для проверки запросов от YooKassa - Автоматический парсинг уведомлений в типизированные Pydantic-модели - Поддержка регистрации callbacks для событий (одиночные, множественные, паттерны) - Поддержка синхронных и асинхронных callbacks
Новые типы данных: - WebhookNotification — модель для входящих webhook-уведомлений
Новые исключения: - InvalidWebhookIPError — невалидный IP-адрес - InvalidWebhookDataError — невалидные данные уведомления
Улучшения:
Добавлено логирование во все компоненты webhook-обработки
Валидация IP-адресов по умолчанию включена (можно отключить)
Поддержка IPv4 и IPv6 адресов
Поддержка CIDR-диапазонов и отдельных IP-адресов
Документация:
Добавлена полная документация по обработке webhook-уведомлений
Примеры использования готового сервера и независимого обработчика
Примеры интеграции с aiohttp и FastAPI
Версия 2.1.0¶
Новые возможности:
Добавлена поддержка API выплат (Payouts API): - Создание выплат на банковские карты, через СБП и на кошельки ЮMoney - Получение информации о выплатах - Поддержка выплат самозанятым с чеками
Добавлена поддержка API самозанятых (Self-Employed API): - Создание объектов самозанятых - Получение информации о статусе самозанятых - Поддержка подтверждения через redirect
Добавлена поддержка API участников СБП (SBP Banks API): - Получение списка участников Системы быстрых платежей - Информация о банках и платежных сервисах
Добавлена поддержка API персональных данных (Personal Data API): - Создание персональных данных для выплат с проверкой получателя (СБП) - Создание персональных данных для выписок из реестра - Получение информации о статусе персональных данных
Добавлена поддержка API безопасных сделок (Deals API): - Создание безопасных сделок - Получение списка сделок с фильтрацией - Получение информации о конкретной сделке
Добавлена поддержка API webhooks (Webhooks API): - Создание webhooks для подписки на события - Получение списка webhooks - Удаление webhooks - Важно: Webhooks API требует OAuth-токен для аутентификации
Улучшения:
Унифицированы типы данных: - PaymentAmount переименован в Money (с alias для обратной совместимости) - Удалены дублирующиеся типы PayoutCancellationDetails и PayoutDeal - Использование общих типов CancellationDetails и Deal для всех API доменов
Исправлена опечатка: receipt_operation_details → receipt_operational_details
Все импорты в модуле types/ теперь используют относительные пути
Улучшена обработка пустых ответов от DELETE методов (204 No Content)
Добавлена поддержка OAuth-токенов для Webhooks API
Новые типы данных:
Payout, PayoutDestination, PayoutReceipt
SelfEmployed, SelfEmployedConfirmation
SbpParticipantBank, SbpBanksList
PersonalData, PersonalDataCancellationDetails
Deal, DealsList (для безопасных сделок)
Webhook, WebhooksList
WebhookEvent enum
Новые параметры:
CreatePayoutParams, PayoutDestinationData
CreateSelfEmployedParams
CreatePersonalDataParams, SbpPayoutRecipientData, PayoutStatementRecipientData
CreateDealParams, GetDealsParams
CreateWebhookParams
Технические детали:
Все новые API полностью покрыты тестами
Покрытие кода: 95%
Полная обратная совместимость с версией 2.0.x
Версия 2.0.0 ⚠️ BREAKING CHANGES¶
⚠️ ВАЖНО: Эта версия содержит критические изменения, несовместимые с версией 1.x
Новые возможности: - Объединены дублирующиеся типы для улучшения консистентности API - Улучшена архитектура с помощью BaseAPI и BaseAPIMethod классов - Добавлена поддержка создания способов оплаты (Payment Methods API) - Улучшена типизация и валидация параметров
Критические изменения (Breaking Changes): - Удалены дублирующиеся типы:
# Старый код (1.x) from aioyookassa.types import ( RefundCancellationDetails, RefundSettlement, ReceiptSettlement ) # Новый код (2.0+) from aioyookassa.types import ( CancellationDetails, # Используется для всех cancellation details Settlement # Используется для всех settlements )
Изменения в типах: - RefundCancellationDetails → CancellationDetails - RefundSettlement → Settlement - ReceiptSettlement → Settlement
Изменения в API клиентах - методы теперь принимают Pydantic модели:
# Старый код (1.x) payment = await client.payments.create_payment( amount=Money(value=100.00, currency=Currency.RUB), description="Test payment", confirmation=Confirmation(...), capture=False, client_ip="192.168.1.1" ) # Новый код (2.0+) from aioyookassa.types.params import CreatePaymentParams params = CreatePaymentParams( amount=Money(value=100.00, currency=Currency.RUB), description="Test payment", confirmation=Confirmation(...), capture=False, client_ip="192.168.1.1" ) payment = await client.payments.create_payment(params) # Также поддерживается dict для обратной совместимости payment = await client.payments.create_payment({ "amount": {"value": 100.00, "currency": "RUB"}, "description": "Test payment" })
Улучшения: - Рефакторинг кода для уменьшения дублирования - Улучшена архитектура с помощью базовых классов BaseAPI и BaseAPIMethod - Добавлены helper функции для нормализации параметров - Улучшена типизация с помощью Pydantic моделей для параметров API - Покрытие тестами увеличено до 92%
Исправления: - Исправлены проблемы с циклическими импортами - Улучшена обработка типов в mypy - Исправлены проблемы с валидацией параметров
Технические детали: - Python 3.8.1+ поддержка - Зависимости: aiohttp >= 3.9.0, pydantic >= 2.0.0 - Полная совместимость с YooKassa API v3
Руководство по миграции: См. раздел Миграция с версии 1.x на 2.0.0 ⚠️ для подробных инструкций по миграции с версии 1.x на 2.0.
Версия 1.0.3¶
Улучшения: - Улучшена обработка параметров API - Исправлены мелкие баги
Версия 1.0.0 ⚠️ BREAKING CHANGES¶
⚠️ ВАЖНО: Эта версия содержит критические изменения, несовместимые с версиями 0.x
Новые возможности: - Полная переработка архитектуры библиотеки - Добавлена полная поддержка всех API модулей YooKassa - Реализованы API для работы с платежами, возвратами, чеками и счетами - Добавлена поддержка всех типов данных YooKassa API - Создана система исключений для обработки ошибок - Новый модульный подход к API (payments, refunds, receipts, invoices, payment_methods)
Критические изменения (Breaking Changes): - Изменена структура доступа к API - теперь используется модульный подход:
# Старый код (0.x) payment = await client.create_payment(...) payments = await client.get_payments(...) # Новый код (1.0+) payment = await client.payments.create_payment(...) payments = await client.payments.get_payments(...)
Изменена структура импортов:
# Старый код (0.x) from aioyookassa.core.client import YooKassa # Новый код (1.0+) from aioyookassa import YooKassa
Изменена обработка дат - теперь используются datetime объекты вместо строк:
# Старый код (0.x) payments = await client.get_payments(created_at="2023-01-01T00:00:00.000Z") # Новый код (1.0+) from datetime import datetime payments = await client.payments.get_payments(created_at=datetime(2023, 1, 1))
Изменена структура ответов - в JSON используется ключ items, но в Python коде доступно поле list:
# В Python коде (1.0+) for payment in payments.list: print(payment.id) # JSON содержит ключ "items", но Pydantic автоматически маппит его в поле "list"
Обновлены зависимости - требуются новые версии: - Pydantic >= 2.0.0 (было 1.x) - aiohttp >= 3.9.0 (было 3.8.0)
Улучшения: - Полная типизация с использованием Pydantic v2 - Асинхронная архитектура для высокой производительности - Подробная документация с примерами - 90% покрытие кода тестами - Улучшенная система обработки ошибок - Оптимизированная работа с HTTP соединениями
Исправления: - Исправлена обработка datetime объектов в API запросах - Улучшена система обработки ошибок - Оптимизирована работа с HTTP соединениями - Исправлены проблемы с типизацией
Технические детали: - Python 3.8.1+ поддержка - Зависимости: aiohttp >= 3.9.0, pydantic >= 2.0.0 - Полная совместимость с YooKassa API v3
Руководство по миграции: См. раздел Миграция с версии 0.x на 1.0.0 ⚠️ для подробных инструкций по миграции с версии 0.x на 1.0.
Версия 0.1.6¶
Новые возможности: - Добавлена базовая поддержка API модулей - Реализованы базовые методы для работы с платежами
Улучшения: - Улучшена документация - Добавлены примеры использования
Технические детали: - Python 3.8+ поддержка - Зависимости: aiohttp, pydantic 1.x - Базовая совместимость с YooKassa API v3
Версия 0.1.5¶
Новые возможности: - Добавлена базовая поддержка платежей - Реализован основной клиент YooKassa
Улучшения: - Улучшена документация - Добавлены примеры использования
Исправления: - Исправлены ошибки в базовом клиенте
Версия 0.1.4¶
Новые возможности: - Первая публичная версия - Базовая функциональность для работы с API
Технические детали: - Начальная реализация асинхронного клиента - Поддержка основных операций с платежами
Планы на будущее¶
Версия 2.1.0 (Планируется)¶
Новые возможности: - Добавление поддержки webhook’ов для обработки уведомлений - Расширенная система логирования с возможностью кастомизации - Метрики и мониторинг интеграции - Кэширование ответов API для улучшения производительности
Улучшения: - Оптимизация производительности - Расширенная документация с дополнительными примерами - Дополнительные примеры интеграции с популярными фреймворками
Версия 3.0.0 (Долгосрочные планы)¶
Новые возможности: - Полная переработка архитектуры для улучшения производительности - Поддержка новых функций YooKassa API - Расширенная типизация с использованием новых возможностей Python - Async/await оптимизации
Улучшения: - Улучшенная производительность - Расширенная документация - Дополнительные примеры использования
Критические изменения: - Возможные breaking changes для улучшения API - Обновление минимальной версии Python до 3.10+
Миграция между версиями¶
Миграция с версии 1.x на 2.0.0 ⚠️¶
⚠️ ВАЖНО: Версия 2.0.0 содержит критические изменения, несовместимые с версией 1.x
Пошаговое руководство по миграции¶
Обновите зависимости
Убедитесь, что у вас установлена правильная версия библиотеки:
pip install aioyookassa>=2.0.0
Обновите импорты типов
# Старый код (1.x) from aioyookassa.types import ( RefundCancellationDetails, RefundSettlement, ReceiptSettlement ) # Новый код (2.0+) from aioyookassa.types import ( CancellationDetails, # Используется везде Settlement # Используется везде )
Обновите использование типов в коде
# Старый код (1.x) from aioyookassa.types import RefundCancellationDetails, RefundSettlement cancellation_details = RefundCancellationDetails( party=CancellationParty.MERCHANT, reason=CancellationReason.CANCELED_BY_MERCHANT ) settlement = RefundSettlement( type="payout", amount=Money(value=100, currency="RUB") ) # Новый код (2.0+) from aioyookassa.types import CancellationDetails, Settlement cancellation_details = CancellationDetails( party=CancellationParty.MERCHANT, reason=CancellationReason.CANCELED_BY_MERCHANT ) settlement = Settlement( type="payout", amount=Money(value=100, currency="RUB") )
Обновите использование ReceiptSettlement
# Старый код (1.x) from aioyookassa.types import ReceiptSettlement receipt_settlement = ReceiptSettlement( type="prepayment", amount=Money(value=100, currency="RUB") ) # Новый код (2.0+) from aioyookassa.types import Settlement receipt_settlement = Settlement( type="prepayment", amount=Money(value=100, currency="RUB") )
Обновите вызовы API методов - теперь используются Pydantic модели
# Старый код (1.x) payment = await client.payments.create_payment( amount=Money(value=100.00, currency=Currency.RUB), description="Test payment", confirmation=Confirmation(...), capture=False ) payments = await client.payments.get_payments( created_at=datetime.now(), status=PaymentStatus.SUCCEEDED, limit=10 ) # Новый код (2.0+) from aioyookassa.types.params import CreatePaymentParams, GetPaymentsParams # Создание платежа params = CreatePaymentParams( amount=Money(value=100.00, currency=Currency.RUB), description="Test payment", confirmation=Confirmation(...), capture=False ) payment = await client.payments.create_payment(params) # Получение списка платежей params = GetPaymentsParams( created_at=datetime.now(), status=PaymentStatus.SUCCEEDED, limit=10 ) payments = await client.payments.get_payments(params) # Также поддерживается dict для обратной совместимости payment = await client.payments.create_payment({ "amount": {"value": 100.00, "currency": "RUB"}, "description": "Test payment" })
Полный пример миграции¶
Старый код (1.x): .. code-block:: python
- from aioyookassa.types import (
RefundCancellationDetails, RefundSettlement, ReceiptSettlement
) from aioyookassa.types.enum import CancellationParty, CancellationReason from aioyookassa.types.payment import Money, Confirmation from aioyookassa.types.enum import ConfirmationType, Currency
# Создание платежа (множество параметров) payment = await client.payments.create_payment(
amount=Money(value=100.00, currency=Currency.RUB), description=”Test payment”, confirmation=Confirmation(type=ConfirmationType.REDIRECT, return_url=”https://example.com”), capture=False
)
# Для возвратов cancellation_details = RefundCancellationDetails(
party=CancellationParty.MERCHANT, reason=CancellationReason.CANCELED_BY_MERCHANT
)
- refund_settlement = RefundSettlement(
type=”payout”, amount=Money(value=100, currency=”RUB”)
)
# Для чеков receipt_settlement = ReceiptSettlement(
type=”prepayment”, amount=Money(value=100, currency=”RUB”)
)
Новый код (2.0+): .. code-block:: python
from aioyookassa.types import CancellationDetails, Settlement from aioyookassa.types.enum import CancellationParty, CancellationReason, ConfirmationType, Currency from aioyookassa.types.payment import Money, Confirmation from aioyookassa.types.params import CreatePaymentParams
# Создание платежа (Pydantic модель) params = CreatePaymentParams(
amount=Money(value=100.00, currency=Currency.RUB), description=”Test payment”, confirmation=Confirmation(type=ConfirmationType.REDIRECT, return_url=”https://example.com”), capture=False
) payment = await client.payments.create_payment(params)
# Для возвратов cancellation_details = CancellationDetails(
party=CancellationParty.MERCHANT, reason=CancellationReason.CANCELED_BY_MERCHANT
)
- refund_settlement = Settlement(
type=”payout”, amount=Money(value=100, currency=”RUB”)
)
# Для чеков receipt_settlement = Settlement(
type=”prepayment”, amount=Money(value=100, currency=”RUB”)
)
Проверка миграции¶
После миграции проверьте:
✅ Все импорты обновлены (используются CancellationDetails и Settlement)
✅ Все использования RefundCancellationDetails заменены на CancellationDetails
✅ Все использования RefundSettlement заменены на Settlement
✅ Все использования ReceiptSettlement заменены на Settlement
✅ Все вызовы API методов обновлены для использования Pydantic моделей (CreatePaymentParams, GetPaymentsParams, и т.д.)
✅ Все тесты проходят
Известные проблемы¶
Если вы столкнулись с проблемами после миграции:
ImportError для RefundCancellationDetails: Используйте CancellationDetails вместо RefundCancellationDetails
ImportError для RefundSettlement: Используйте Settlement вместо RefundSettlement
ImportError для ReceiptSettlement: Используйте Settlement вместо ReceiptSettlement
TypeError при вызове API методов: Теперь методы принимают Pydantic модели или dict. Используйте CreatePaymentParams, GetPaymentsParams, и т.д.
Ошибка “too many arguments”: Оберните параметры в Pydantic модель (например, CreatePaymentParams(…))
Получение помощи¶
Если у вас возникли проблемы с миграцией:
Создайте issue на GitHub с тегом migration
Обратитесь к разработчику в Telegram: @masaasibaata
Проверьте документацию: https://aioyookassa.readthedocs.io
Миграция с версии 0.x на 1.0.0 ⚠️¶
⚠️ ВАЖНО: Версия 1.0.0 содержит критические изменения, несовместимые с версиями 0.x
Пошаговое руководство по миграции¶
Обновите зависимости
Убедитесь, что у вас установлены правильные версии зависимостей:
pip install aioyookassa==1.0.0 pip install pydantic>=2.0.0 pip install aiohttp>=3.9.0
Обновите импорты
# Старый код (0.x) from aioyookassa.core.client import YooKassa # Новый код (1.0+) from aioyookassa import YooKassa
Обновите доступ к API модулям
# Старый код (0.x) client = YooKassa('token', 12345) payment = await client.create_payment(...) payments = await client.get_payments(...) payment = await client.get_payment('id') payment = await client.capture_payment('id') payment = await client.cancel_payment('id') # Новый код (1.0+) client = YooKassa(api_key='token', shop_id=12345) payment = await client.payments.create_payment(...) payments = await client.payments.get_payments(...) payment = await client.payments.get_payment('id') payment = await client.payments.capture_payment('id') payment = await client.payments.cancel_payment('id')
Обновите работу с датами
# Старый код (0.x) payments = await client.get_payments( created_at="2023-01-01T00:00:00.000Z" ) # Новый код (1.0+) from datetime import datetime payments = await client.payments.get_payments( created_at=datetime(2023, 1, 1, 0, 0, 0) )
Обновите работу со списками
# Старый код (0.x) payments = await client.get_payments() for payment in payments.list: print(payment.id) # Новый код (1.0+) payments = await client.payments.get_payments() for payment in payments.list: print(payment.id)
Обновите обработку исключений
Структура исключений не изменилась, но рекомендуется использовать новые импорты:
# Старый код (0.x) from aioyookassa.exceptions.base import APIError # Новый код (1.0+) - работает так же, но лучше использовать from aioyookassa.exceptions import APIError, NotFound, InvalidCredentials
Полный пример миграции¶
Старый код (0.x): .. code-block:: python
import asyncio from aioyookassa.core.client import YooKassa from aioyookassa.types import Confirmation from aioyookassa.types.payment import Money from aioyookassa.types.enum import ConfirmationType, Currency
- async def process_payment():
- async with YooKassa(‘token’, 12345) as client:
confirmation = Confirmation(type=ConfirmationType.REDIRECT, return_url=’https://example.com’) payment = await client.create_payment(
amount=PaymentAmount(value=100, currency=Currency.RUB), description=’Test payment’, confirmation=confirmation
)
payments = await client.get_payments() for payment in payments.list:
print(payment.id)
payment_info = await client.get_payment(payment.id) print(payment_info.status)
Новый код (1.0+): .. code-block:: python
import asyncio from datetime import datetime from aioyookassa import YooKassa from aioyookassa.types.payment import Money, Confirmation
- async def process_payment():
- async with YooKassa(api_key=’token’, shop_id=12345) as client:
- confirmation = Confirmation(
type=ConfirmationType.REDIRECT, return_url=’https://example.com’
) payment = await client.payments.create_payment(
amount=PaymentAmount(value=100, currency=Currency.RUB), description=’Test payment’, confirmation=confirmation
)
- payments = await client.payments.get_payments(
created_at=datetime.now()
) for payment in payments.list:
print(payment.id)
payment_info = await client.payments.get_payment(payment.id) print(payment_info.status)
Проверка миграции¶
После миграции проверьте:
✅ Все импорты обновлены
✅ Все вызовы API используют модульный подход (client.payments.*)
✅ Все даты используют datetime объекты
✅ Все списки используют поле items вместо list
✅ Зависимости обновлены до требуемых версий
Известные проблемы¶
Если вы столкнулись с проблемами после миграции:
Ошибка импорта: Убедитесь, что используете from aioyookassa import YooKassa
AttributeError на client.create_payment: Используйте client.payments.create_payment
Ошибка с датами: Убедитесь, что используете datetime объекты, а не строки
Ошибка с payments.items: Используйте payments.list вместо payments.items
Получение помощи¶
Если у вас возникли проблемы с миграцией:
Создайте issue на GitHub с тегом migration
Обратитесь к разработчику в Telegram: @masaasibaata
Проверьте документацию: https://aioyookassa.readthedocs.io
Совместимость¶
Python версии: - 3.8.1+ (рекомендуется 3.9+) - Проверено на Python 3.8.1, 3.9, 3.10, 3.11, 3.12
Зависимости: - aiohttp >= 3.9.0 (обновлено с 3.8.0 в версии 1.0.0) - pydantic >= 2.0.0 (критическое изменение с версии 1.0.0, было 1.x)
YooKassa API: - Полная совместимость с YooKassa API v3 - Поддержка всех текущих методов и типов данных - Поддержка всех API модулей (payments, refunds, receipts, invoices, payment_methods)
Операционные системы: - Linux (Ubuntu, Debian, CentOS, и др.) - macOS (10.15+) - Windows (10+)
Несовместимость: - Версии 0.x (полная несовместимость из-за breaking changes) - Pydantic 1.x (требуется Pydantic 2.0+) - aiohttp < 3.9.0 (требуется aiohttp >= 3.9.0)
Поддержка¶
Время поддержки версий: - Текущая версия (2.0.x): 18 месяцев - Версия 1.x: Поддержка прекращена (критические исправления безопасности: 6 месяцев) - Версия 0.x: Поддержка прекращена - Критические исправления безопасности: 24 месяца для всех версий
Политика версионирования: - MAJOR версии (2.0, 3.0, и т.д.): Могут содержать breaking changes - MINOR версии (2.1, 2.2, и т.д.): Новые функции, обратно совместимые - PATCH версии (2.0.1, 2.0.2, и т.д.): Исправления багов, обратно совместимые
Каналы поддержки: - GitHub Issues: для багов и предложений - Telegram: @masaasibaata для вопросов - Документация: https://aioyookassa.readthedocs.io
Политика безопасности: - Критические уязвимости исправляются в течение 24 часов - Обычные уязвимости исправляются в течение 7 дней - Все исправления безопасности публикуются в отдельном релизе
Вклад в развитие¶
Как внести вклад: 1. Форкните репозиторий 2. Создайте ветку для новой функции 3. Внесите изменения 4. Добавьте тесты 5. Создайте Pull Request
Требования к PR: - Покрытие тестами не менее 90% - Соответствие стилю кода (black, flake8) - Обновление документации - Добавление changelog записи
Типы вкладов: - Исправление багов - Новые функции - Улучшение документации - Оптимизация производительности - Добавление примеров