FIX "Новые вебхуки"

This commit is contained in:
Boris Kovalskii
2025-10-16 23:42:35 +00:00
committed by GitHub
parent e2090b00ed
commit 2766dc9d00
2 changed files with 59 additions and 14 deletions
+53 -6
View File
@@ -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")
+6 -8
View File
@@ -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: