uchill/backend/apps/subscriptions/yookassa_service.py

136 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Сервис для работы с ЮKassa API.
"""
import uuid
import logging
from decimal import Decimal
from typing import Optional, Dict, Any
from django.conf import settings
from yookassa import Configuration, Payment as YooPayment
logger = logging.getLogger(__name__)
class YooKassaService:
"""Сервис для работы с ЮKassa."""
def __init__(self):
"""Инициализация конфигурации ЮKassa."""
if settings.YOOKASSA_SHOP_ID and settings.YOOKASSA_SECRET_KEY:
Configuration.account_id = settings.YOOKASSA_SHOP_ID
Configuration.secret_key = settings.YOOKASSA_SECRET_KEY
else:
logger.warning("ЮKassa credentials not configured")
def create_payment(
self,
amount: Decimal,
description: str,
return_url: str,
metadata: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:
"""
Создать платеж в ЮKassa.
Args:
amount: Сумма платежа
description: Описание платежа
return_url: URL для возврата после оплаты
metadata: Дополнительные данные
Returns:
Словарь с данными платежа
"""
try:
idempotence_key = str(uuid.uuid4())
payment = YooPayment.create({
"amount": {
"value": str(amount),
"currency": "RUB"
},
"confirmation": {
"type": "redirect",
"return_url": return_url
},
"capture": True,
"description": description,
"metadata": metadata or {}
}, idempotence_key)
logger.info(f"Payment created: {payment.id}")
return {
'id': payment.id,
'status': payment.status,
'amount': payment.amount.value,
'currency': payment.amount.currency,
'confirmation_url': payment.confirmation.confirmation_url if payment.confirmation else None,
'created_at': payment.created_at,
'metadata': payment.metadata,
}
except Exception as e:
logger.error(f"Error creating payment: {e}")
raise Exception(f"Ошибка создания платежа: {str(e)}")
def get_payment(self, payment_id: str) -> Dict[str, Any]:
"""
Получить информацию о платеже.
Args:
payment_id: ID платежа в ЮKassa
Returns:
Словарь с данными платежа
"""
try:
payment = YooPayment.find_one(payment_id)
return {
'id': payment.id,
'status': payment.status,
'amount': payment.amount.value,
'currency': payment.amount.currency,
'paid': payment.paid,
'created_at': payment.created_at,
'metadata': payment.metadata,
'payment_method': payment.payment_method.type if payment.payment_method else None,
}
except Exception as e:
logger.error(f"Error getting payment {payment_id}: {e}")
raise Exception(f"Ошибка получения платежа: {str(e)}")
def cancel_payment(self, payment_id: str) -> Dict[str, Any]:
"""
Отменить платеж.
Args:
payment_id: ID платежа в ЮKassa
Returns:
Словарь с данными платежа
"""
try:
idempotence_key = str(uuid.uuid4())
payment = YooPayment.cancel(payment_id, idempotence_key)
logger.info(f"Payment canceled: {payment_id}")
return {
'id': payment.id,
'status': payment.status,
}
except Exception as e:
logger.error(f"Error canceling payment {payment_id}: {e}")
raise Exception(f"Ошибка отмены платежа: {str(e)}")
# Глобальный экземпляр сервиса
yookassa_service = YooKassaService()