first commit
This commit is contained in:
0
bot/handlers/client/__init__.py
Normal file
0
bot/handlers/client/__init__.py
Normal file
116
bot/handlers/client/payments.py
Normal file
116
bot/handlers/client/payments.py
Normal 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),
|
||||
)
|
||||
Reference in New Issue
Block a user