Как можно передать данные из callback в хендлер successful_payment в aiogram 3.2.0?

Как я могу передать данные об оплате и отправить их через сообщение `message.successful_payment`, используя callback и конструкцию бд с SQLAlchemy? Могут ли мне здесь помочь FSM состояния? Как реализовать их или найти другое решение? Мне нужно передать данные переменных для отправки геолокации.
  • 25 декабря 2023 г. 21:17
Ответы на вопрос 1
В aiogram 3.2.0 вы можете использовать FSM (Finite State Machine) для обработки статусов пользователей и передачи данных между хендлерами. 

Вот пример того, как можно реализовать это:

1. Сначала определите состояния пользователя в составном стейт-машине (FSM). Например, вам может понадобиться состояние "ожидание оплаты" и состояние "ожидание геолокации".

```python
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command

# Определение состояний
class PaymentState(StatesGroup):
    waiting_for_payment = State()
    waiting_for_location = State()

# Обработчик команды /start
@dp.message_handler(Command('start'))
async def cmd_start(message: types.Message, state: FSMContext):
    # Сохраняем состояние пользователя
    await state.set_state(PaymentState.waiting_for_payment)
    await message.reply('Пожалуйста, совершите оплату.')

# Обработчик успешной оплаты
@dp.message_handler(content_types=types.ContentType.SUCCESSFUL_PAYMENT, state=PaymentState.waiting_for_payment)
async def successful_payment(message: types.Message, state: FSMContext):
    # Получаем данные об оплате
    successful_payment_data = message.successful_payment

    # Сохраняем данные об оплате в состоянии
    await state.update_data(successful_payment_data=successful_payment_data)

    # Переходим к следующему состоянию ожидания геолокации
    await state.set_state(PaymentState.waiting_for_location)
    await message.reply('Оплата прошла успешно. Теперь отправьте геолокацию.')

# Обработчик геолокации
@dp.message_handler(content_types=types.ContentType.LOCATION, state=PaymentState.waiting_for_location)
async def handle_location(message: types.Message, state: FSMContext):
    # Получаем данные об оплате из состояния
    data = await state.get_data()
    successful_payment_data = data.get('successful_payment_data')

    # Отправляем геолокацию и данные об оплате
    await message.reply_location(latitude=message.location.latitude, longitude=message.location.longitude)
    await message.reply(f'Данные об оплате: {successful_payment_data}')
```

2. Каждый раз, когда пользователь выполняет оплату, его состояние переходит в "ожидание оплаты" и все ожидающие оплату сообщения маркируются как "ожидающие" (например, сообщением `await message.reply('Пожалуйста, совершите оплату.')`). Когда пользователь совершает оплату, его состояние переходит в "ожидание геолокации" (в хендлере `successful_payment`), и он получает сообщение с просьбой отправить геолокацию (`await message.reply('Оплата прошла успешно. Теперь отправьте геолокацию.')`).

3. В хендлере `handle_location` пользователь получает геолокацию (`message.location`) и данные об оплате (`successful_payment_data`).

Это простой пример использования состояний FSM для передачи данных между хендлерами в aiogram. Вы также можете использовать SQLAlchemy для сохранения данных о пользователе и их получения в разных хендлерах.
Похожие вопросы