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), )