Files
WeechatPayBot/bot/handlers/client/payments.py

117 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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),
)