first commit

This commit is contained in:
2026-04-12 21:58:52 +03:00
commit acfaa2a40c
44 changed files with 2895 additions and 0 deletions

View File

View File

@@ -0,0 +1,116 @@
import logging
from datetime import datetime, timezone
from uuid import uuid4
import aiogram.types as types
from aiogram import Router
from aiogram.fsm.context import FSMContext
from aiogram.filters import StateFilter
from create_bot import bot, orm
from keyboards.inline_keyboards import get_pay_link_kb
from services.wata import WataAPIError, WataClient, build_telegram_payment_return_url
from states.client_states import MainStates
from utils.amount_parser import format_rub_amount, parse_rub_amount
payment_router = Router()
logger = logging.getLogger(__name__)
wata_client = WataClient()
@payment_router.message(StateFilter(MainStates.waiting_amount))
async def create_payment_link(message: types.Message, state: FSMContext):
if not message.text:
await message.answer("Отправьте сумму текстом. Например: 1000 рублей.")
return
amount = parse_rub_amount(message.text)
if amount is None:
await message.answer(
"Не удалось распознать сумму. Напишите её в рублях, например: 1000 или 1000 рублей."
)
return
bot_username = (await bot.get_me()).username
order_id = f"tg-{message.from_user.id}-{uuid4().hex[:12]}"
description = f"WechatPayBot payment {order_id}"
await orm.create_payment(
user_id=message.from_user.id,
order_id=order_id,
amount=amount,
currency="RUB",
description=description,
created_at=datetime.now(timezone.utc),
)
try:
payment_link = await wata_client.create_payment_link(
amount=amount,
order_id=order_id,
description=description,
success_redirect_url=build_telegram_payment_return_url(
bot_username=bot_username,
order_id=order_id,
success=True,
),
fail_redirect_url=build_telegram_payment_return_url(
bot_username=bot_username,
order_id=order_id,
success=False,
),
)
except WataAPIError as exc:
logger.exception("Failed to create WATA payment link for order %s", order_id)
await orm.update_payment_status(
order_id=order_id,
status="error",
transaction_status=None,
updated_at=datetime.now(timezone.utc),
error_description=exc.message,
)
await message.answer(
f"Не удалось создать ссылку на оплату.\nПричина: {exc.message}"
)
return
except Exception:
logger.exception("Unexpected error while creating WATA payment link")
await orm.update_payment_status(
order_id=order_id,
status="error",
transaction_status=None,
updated_at=datetime.now(timezone.utc),
error_description="Internal error while creating payment link",
)
await message.answer(
"Не удалось создать ссылку на оплату из-за внутренней ошибки. Попробуйте позже."
)
return
await orm.update_payment_link(
order_id=order_id,
payment_link_id=payment_link.id,
payment_url=payment_link.url,
payment_link_status=payment_link.status,
updated_at=datetime.now(timezone.utc),
)
logger.info(
"Payment link created",
extra={
"user_id": message.from_user.id,
"order_id": order_id,
"amount": str(amount),
"payment_link_id": payment_link.id,
},
)
await state.set_state(MainStates.main)
await message.answer(
text=(
f"Сумма к оплате: {format_rub_amount(amount)}\n\n"
"Нажмите кнопку ниже, чтобы перейти к безопасной оплате."
),
reply_markup=get_pay_link_kb(payment_link.url),
)