117 lines
4.0 KiB
Python
117 lines
4.0 KiB
Python
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),
|
||
)
|