from fastapi import APIRouter, HTTPException from pydantic import BaseModel from yookassa import Payment from yookassa.domain.notification import WebhookNotification from app.services.db_manager import DatabaseManager router = APIRouter() class CreatePaymentRequest(BaseModel): telegram_id: int amount: float class PaymentResponse(BaseModel): payment_url: str payment_id: str @router.post("/payment/create", response_model=PaymentResponse) async def create_payment(request: CreatePaymentRequest): """ Создаёт платёж через ЮKassa и возвращает ссылку для оплаты. """ try: # Создание платежа через API ЮKassa payment = Payment.create({ "amount": { "value": f"{request.amount:.2f}", "currency": "RUB" }, "confirmation": { "type": "redirect", # Тип подтверждения (redirect или embedded) "return_url": "https://your-app.com/success" # URL возврата }, "description": f"Пополнение баланса для пользователя {request.telegram_id}" }) # Возвращаем ссылку для оплаты и ID платежа return PaymentResponse( payment_url=payment.confirmation.confirmation_url, payment_id=payment.id ) except Exception as e: raise HTTPException(status_code=500, detail=f"Ошибка создания платежа: {str(e)}") @router.post("/payment/notification") async def payment_notification(notification: dict, database_manager: DatabaseManager): """ Обрабатывает уведомления от ЮKassa. """ try: # Парсим уведомление webhook = WebhookNotification(notification) payment_object = webhook.object # Проверяем статус платежа if payment_object["status"] == "succeeded": # Обновляем баланс пользователя telegram_id = int(payment_object["description"].split()[-1]) amount = float(payment_object["amount"]["value"]) await database_manager.update_balance(telegram_id, amount) return {"status": "ok"} except Exception as e: raise HTTPException(status_code=500, detail=f"Ошибка обработки уведомления: {str(e)}")