Update payment_service.py

This commit is contained in:
Egor
2025-09-17 15:57:27 +03:00
committed by GitHub
parent a2536b576e
commit a0b95cc24c

View File

@@ -272,40 +272,21 @@ class PaymentService:
receipt_phone: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None
) -> Optional[Dict[str, Any]]:
"""
Создает платеж через СБП (Систему быстрых платежей) с использованием YooKassa
Args:
db: Сессия базы данных
user_id: ID пользователя
amount_kopeks: Сумма в копейках
description: Описание платежа
receipt_email: Email для чека (опционально)
receipt_phone: Телефон для чека (опционально)
metadata: Метаданные платежа (опционально)
Returns:
Словарь с информацией о платеже или None в случае ошибки
"""
# Проверяем, инициализирован ли YooKassa сервис
if not self.yookassa_service:
logger.error("YooKassa сервис не инициализирован")
return None
try:
# Конвертируем копейки в рубли
amount_rubles = amount_kopeks / 100
# Подготавливаем метаданные платежа
payment_metadata = metadata or {}
payment_metadata.update({
"user_id": str(user_id),
"amount_kopeks": str(amount_kopeks),
"type": "balance_topup_sbp" # Тип платежа - через СБП
"type": "balance_topup_sbp"
})
# Создаем платеж через YooKassa сервис с указанием метода оплаты СБП
yookassa_response = await self.yookassa_service.create_sbp_payment(
amount=amount_rubles,
currency="RUB",
@@ -315,12 +296,10 @@ class PaymentService:
receipt_phone=receipt_phone
)
# Проверяем, успешно ли создан платеж
if not yookassa_response or yookassa_response.get("error"):
logger.error(f"Ошибка создания платежа YooKassa СБП: {yookassa_response}")
return None
# Парсим дату создания платежа
yookassa_created_at = None
if yookassa_response.get("created_at"):
try:
@@ -332,16 +311,13 @@ class PaymentService:
logger.warning(f"Не удалось парсить created_at: {e}")
yookassa_created_at = None
# Получаем confirmation_token для embedded платежей
confirmation_token = None
if yookassa_response.get("confirmation"):
confirmation_token = yookassa_response["confirmation"].get("confirmation_token")
# Обновляем метаданные с confirmation_token если он есть
if confirmation_token:
payment_metadata["confirmation_token"] = confirmation_token
# Сохраняем информацию о платеже в локальной базе данных
local_payment = await create_yookassa_payment(
db=db,
user_id=user_id,
@@ -352,15 +328,13 @@ class PaymentService:
status=yookassa_response["status"],
confirmation_url=yookassa_response.get("confirmation_url"),
metadata_json=payment_metadata,
payment_method_type="bank_card", # Для СБП указываем тип bank_card
payment_method_type="bank_card",
yookassa_created_at=yookassa_created_at,
test_mode=yookassa_response.get("test_mode", False)
)
# Логируем успешное создание платежа
logger.info(f"Создан платеж YooKassa СБП {yookassa_response['id']} на {amount_rubles}₽ для пользователя {user_id}")
# Возвращаем информацию о платеже
return {
"local_payment_id": local_payment.id,
"yookassa_payment_id": yookassa_response["id"],
@@ -793,10 +767,8 @@ class PaymentService:
)
if not updated_payment.transaction_id:
# Получаем сумму в USD из платежа
amount_usd = updated_payment.amount_float
# Конвертируем в рубли по текущему курсу с улучшенной обработкой ошибок
try:
amount_rubles = await currency_converter.usd_to_rub(amount_usd)
amount_kopeks = int(amount_rubles * 100)
@@ -808,7 +780,6 @@ class PaymentService:
amount_kopeks = int(amount_usd * 100)
conversion_rate = 1.0
# Проверяем корректность конвертированной суммы
if amount_kopeks <= 0:
logger.error(f"Некорректная сумма после конвертации: {amount_kopeks} копеек для платежа {invoice_id}")
return False