Aiogram2. FSMContext не записываются данные
Подскажите плз пишу бота на аиограм2, немного запустался в state, мне нужно чтобы пользователь ввел данные и стейт обновился и потом данные из стейта я мог отправить в обработчик оплаты, но почему то когда доходит дело до инвойса в переменной стейта(amount_tickets) лежит None( не могу понять что делаю не так.
from aiogram import Bot, Dispatcher, types, executor
from aiogram.types.message import ContentType
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
import random
import sqlite3
import logging
import markups as nav
TELEGRAM_TOKEN = ''
API_TOKEN = ''
# Подключаем БД
conn = sqlite3.connect('lottery.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS tickets
(id INTEGER PRIMARY KEY,
user_id INTEGER,
number TEXT,
phone_number TEXT UNIQUE)''')
conn.commit()
logging.basicConfig(level=logging.INFO)
bot = Bot(token=TELEGRAM_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot)
class AmountTickets(StatesGroup):
waiting_for_tickets = State()
@dp.message_handler(commands=['start'])
async def start(message: types.Message, state: FSMContext):
await state.set_state(AmountTickets.waiting_for_tickets)
await message.answer('Введите количество билетов"',
reply_markup=nav.mainMenu)
@dp.message_handler()
async def bot_message(message: types.Message, state: FSMContext):
if message.text.isdigit():
await state.update_data(amount_tickets=int(message.text))
await bot.send_message(message.from_user.id, 'Описание розыгрыша',
reply_markup=nav.sub_inline_markup)
if message.text == 'Количество участников':
cursor.execute('SELECT COUNT(*) FROM tickets')
total_users = cursor.fetchone()[0]
await bot.send_message(message.from_user.id, f'Количество участников розыгрыша: {total_users}',
reply_markup=nav.mainMenu)
@dp.callback_query_handler(text='ticket')
async def ticket(call: types.CallbackQuery, state: FSMContext):
await bot.delete_message(call.from_user.id, call.message.message_id)
data = await state.get_data()
amount_tickets = data.get('amount_tickets')
print(amount_tickets)
await bot.send_invoice(
chat_id=call.from_user.id,
title='Покупка билета',
description='описание',
payload='ticket_giveaway',
provider_token=API_TOKEN,
currency='RUB',
start_parameter='test_bot',
need_phone_number=True,
prices=[{
'label': 'Привет',
'amount': (amount_tickets) * 34900
}]
)
@dp.pre_checkout_query_handler()
async def process_pre_checkout_query(pre_checkout_query:
types.PreCheckoutQuery):
await bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)
@dp.message_handler(content_types=[ContentType.SUCCESSFUL_PAYMENT,])
async def process_pay(message: types.Message):
if message.successful_payment.invoice_payload == 'ticket_giveaway':
ticket_number = random.randint(1000, 9999)
phone_num = message.successful_payment.order_info.phone_number
cursor.execute('INSERT INTO tickets (user_id, number, phone_number) VALUES (?, ?, ?)',
(message.from_user.id, ticket_number, phone_num))
conn.commit()
await bot.send_message(message.from_user.id, f'Вы купили билет номер {ticket_number}')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)