136 lines
4.6 KiB
Python
136 lines
4.6 KiB
Python
"""
|
||
Сервис для работы с Ю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()
|
||
|
||
|