Как узнать какой товар был куплен у телеграм бота

Рейтинг: -2Ответов: 1Опубликовано: 11.01.2023

У меня есть бот для покупки ключей для игр.

Как сделать чтоб в функции successful payment печатало какой товар был куплен?

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import ContentType
bot = Bot(token="token")
dp = Dispatcher(bot)
payment="payment"


@dp.message_handler(commands=['start'])
async def inserting_text_cars(message: types.Message):
    await message.answer("/buy чтоб купить ключ к игре")


@dp.message_handler(commands=['buy'])
async def inserting_text_cars(message: types.Message):
    kb = types.InlineKeyboardMarkup()
    rust = types.InlineKeyboardButton(text='Купить RUST', callback_data='rust')
    gta5 = types.InlineKeyboardButton(text='Купить GTA5', callback_data='gta5')
    kb.add(rust, gta5)
    await bot.send_message(message.chat.id, "Какую игру хотите купить?",reply_markup=kb)

PRICE = types.LabeledPrice(label='RUST', amount=100 + 100)
PRICE2 = types.LabeledPrice(label='GTA5', amount=1000 + 1000)

@dp.callback_query_handler(lambda call: True)
async def callback_inline(call):
    if call.data == 'rust':
        await bot.send_invoice(call.message.chat.id,
                               title="Ключь к игре",
                               description='Игра RUST" ',
                               provider_token=payment,
                               currency="eur",
                               photo_url="https://i.imgur.com/ht7t2JB.png",
                               photo_width=416,
                               photo_height=236,
                               photo_size=416,
                               is_flexible=False,
                               prices=[PRICE],
                               start_parameter="rust",
                               payload="test-invoce-payload")
    elif call.data == 'gta5':
        await bot.send_invoice(call.message.chat.id,
                               title="Ключь к игре",
                               description='Игра GTA5" ',
                               provider_token=payment,
                               currency="eur",
                               photo_url="https://i.imgur.com/z4CQfg7.png",
                               photo_width=416,
                               photo_height=236,
                               photo_size=416,
                               is_flexible=False,
                               prices=[PRICE],
                               start_parameter="gta5",
                               payload="test-invoce-payload")




@dp.pre_checkout_query_handler(lambda query: True)
async def pre_checkout_query(pre_checkout_q: types.PreCheckoutQuery):
    await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True)


@dp.message_handler(content_types=ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment(message: types.Message):
    print("SUCCESSFUL PAYMENT:")

    payment_info = message.successful_payment.to_python()
    for k, v in payment_info.items():
        print(f"{k} = {v}")
    await bot.send_message(message.chat.id,
                           f"Платеж нa сумму {message.successful_payment.total_amount // 100} {message.successful_payment.currency} выполнен")


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Ответы

▲ 0

Данные о товаре передаются в payload - там у тебя сейчас 'test-invoce-payload'.

Вместо этого, туда можно засунуть название игры, а после этого получить payload через message.successful_payment.invoice_payload

Пример в коде:

@dp.message_handler(content_types=ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment(message: types.Message):

    game = message.successful_payment.invoice_payload
    
    if game == 'rust':

        ...

    else:

        ...

А инвойс можно создать, например, так:

await bot.send_invoice(*args, **kwargs, payload="rust")