54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
from aiohttp import web
|
|
|
|
from database import add_payment, async_session_maker, get_payment_by_payment_id, update_balance, update_payment_status
|
|
from handlers.payments.utils import send_payment_success_notification
|
|
from logger import logger
|
|
|
|
from .service import check_payment_signature
|
|
|
|
|
|
async def robokassa_webhook(request: web.Request):
|
|
try:
|
|
params = await request.post()
|
|
if not check_payment_signature(params):
|
|
return web.Response(status=400)
|
|
|
|
amount_raw = params.get("OutSum")
|
|
inv_id = params.get("InvId")
|
|
shp_id = params.get("Shp_id") or params.get("shp_id") or params.get("id")
|
|
shp_pid = params.get("Shp_pid") or params.get("shp_pid") or params.get("pid")
|
|
|
|
if not amount_raw or not inv_id or not shp_id or not shp_pid:
|
|
return web.Response(status=400)
|
|
|
|
tg_id = int(shp_id)
|
|
amount = float(amount_raw)
|
|
|
|
async with async_session_maker() as session:
|
|
payment = await get_payment_by_payment_id(session, shp_pid)
|
|
if payment:
|
|
if payment.get("status") == "success":
|
|
return web.Response(text=f"OK{inv_id}")
|
|
ok = await update_payment_status(session=session, internal_id=int(payment["id"]), new_status="success")
|
|
if not ok:
|
|
return web.Response(status=500)
|
|
else:
|
|
await add_payment(
|
|
session=session,
|
|
tg_id=tg_id,
|
|
amount=amount,
|
|
payment_system="ROBOKASSA",
|
|
status="success",
|
|
currency="RUB",
|
|
payment_id=shp_pid,
|
|
metadata=None,
|
|
)
|
|
|
|
await update_balance(session, tg_id, amount)
|
|
await send_payment_success_notification(tg_id, amount, session)
|
|
|
|
return web.Response(text=f"OK{inv_id}")
|
|
except Exception as e:
|
|
logger.error(f"Error processing ROBOKASSA webhook: {e}")
|
|
return web.Response(status=500)
|