From 2766dc9d001ae7d33c99e38ee50322842a4cf2ab Mon Sep 17 00:00:00 2001 From: Boris Kovalskii <36034823+JustYay@users.noreply.github.com> Date: Thu, 16 Oct 2025 23:42:35 +0000 Subject: [PATCH] =?UTF-8?q?FIX=20"=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=B2?= =?UTF-8?q?=D0=B5=D0=B1=D1=85=D1=83=D0=BA=D0=B8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/payments/heleket/webhook.py | 59 +++++++++++++++++++++++++--- handlers/payments/kassai/webhook.py | 14 +++---- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/handlers/payments/heleket/webhook.py b/handlers/payments/heleket/webhook.py index 9c7c31dd..e1c90755 100644 --- a/handlers/payments/heleket/webhook.py +++ b/handlers/payments/heleket/webhook.py @@ -1,9 +1,11 @@ import base64 import hashlib import json +from aiohttp import web from logger import logger from config import HELEKET_API_KEY -from database import async_session_maker, update_payment_status, add_balance_to_user +from database import async_session_maker, update_payment_status, update_balance, add_payment, get_payment_by_payment_id +from handlers.payments.utils import send_payment_success_notification def verify_heleket_signature(data: dict) -> bool: @@ -77,17 +79,42 @@ async def process_heleket_webhook(data: dict) -> bool: return False balance_amount = rub_amount if rub_amount else float(merchant_amount) async with async_session_maker() as session: - await update_payment_status(session, order_id, "success") - await add_balance_to_user(session, tg_id, balance_amount) - await session.commit() + payment = await get_payment_by_payment_id(session, order_id) + if payment: + if payment.get("status") == "success": + logger.info(f"Heleket: платёж {order_id} уже обработан") + return True + ok = await update_payment_status(session=session, internal_id=int(payment["id"]), new_status="success") + if not ok: + logger.error(f"Heleket: не удалось обновить статус платежа {order_id}") + return False + await update_balance(session, tg_id, balance_amount) + await send_payment_success_notification(tg_id, balance_amount, session) + await session.commit() + else: + await add_payment( + session=session, + tg_id=tg_id, + amount=balance_amount, + payment_system="HELEKET", + status="success", + currency="USD", + payment_id=order_id, + metadata=None, + ) + await update_balance(session, tg_id, balance_amount) + await send_payment_success_notification(tg_id, balance_amount, session) + await session.commit() logger.info(f"Heleket: платёж {order_id} для пользователя {tg_id} успешно обработан, баланс пополнен на {balance_amount} RUB") return True elif status in ['fail', 'wrong_amount', 'cancel', 'system_fail']: logger.warning(f"Heleket: неудачный платёж {order_id}, статус: {status}") async with async_session_maker() as session: - await update_payment_status(session, order_id, "failed") - await session.commit() + payment = await get_payment_by_payment_id(session, order_id) + if payment: + await update_payment_status(session=session, internal_id=int(payment["id"]), new_status="failed") + await session.commit() return True else: logger.info(f"Heleket: промежуточный статус {status} для платежа {order_id}") @@ -95,3 +122,23 @@ async def process_heleket_webhook(data: dict) -> bool: except Exception as e: logger.error(f"Ошибка обработки Heleket webhook: {e}") return False + + +async def heleket_webhook(request: web.Request): + """Обработчик вебхука Heleket для aiohttp""" + try: + data = await request.json() + logger.info(f"Heleket webhook received from {request.remote}") + + if not verify_heleket_signature(data): + logger.error("Heleket webhook: неверная подпись") + return web.Response(status=400, text="Invalid signature") + + success = await process_heleket_webhook(data) + if success: + return web.Response(status=200, text="OK") + else: + return web.Response(status=400, text="Processing failed") + except Exception as e: + logger.error(f"Ошибка обработки Heleket webhook: {e}") + return web.Response(status=500, text="Internal server error") diff --git a/handlers/payments/kassai/webhook.py b/handlers/payments/kassai/webhook.py index d3c44f00..529c5b0d 100644 --- a/handlers/payments/kassai/webhook.py +++ b/handlers/payments/kassai/webhook.py @@ -36,14 +36,10 @@ async def kassai_webhook(request: web.Request): amount_raw = data.get('AMOUNT') order_id = data.get('MERCHANT_ORDER_ID') - status = data.get('STATUS', '') if not amount_raw or not order_id: logger.error("KassaAI webhook: отсутствуют обязательные параметры") return web.Response(status=400) - if status.upper() != 'SUCCESS': - logger.warning(f"KassaAI webhook: неуспешный статус {status} для заказа {order_id}") - return web.Response(text="OK") amount = float(amount_raw) @@ -65,6 +61,9 @@ async def kassai_webhook(request: web.Request): if not ok: logger.error(f"KassaAI: не удалось обновить статус платежа {order_id}") return web.Response(status=500) + await update_balance(session, tg_id, amount) + await send_payment_success_notification(tg_id, amount, session) + await session.commit() else: await add_payment( session=session, @@ -76,10 +75,9 @@ async def kassai_webhook(request: web.Request): payment_id=order_id, metadata=None, ) - - await update_balance(session, tg_id, amount) - await send_payment_success_notification(tg_id, amount, session) - await session.commit() + await update_balance(session, tg_id, amount) + await send_payment_success_notification(tg_id, amount, session) + await session.commit() logger.info(f"KassaAI: платёж {order_id} успешно обработан, баланс пользователя {tg_id} пополнен на {amount} RUB") return web.Response(text="OK") except Exception as e: