66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
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: str
|
|
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)}")
|