начало сап системы и помойму всё
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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)}")
|
||||
|
||||
Reference in New Issue
Block a user