Телеграм-бот - кнопка "Добавить в корзину "

У меня не выходит кнопку добавить под этой инфой товара

в utils.py я написала этот код

def generate_add_to_card_button(product_id):

    button = {"inline_keyboard": []}
    products = database.get_products_from_one_category(product_id) 
    for i in products:
        button['inline_keyboard'].append([{
            'text': "Добавить",
            'callback_data': "add_to_card"
        }])
    return button

этот код в bot.py

    elif "products" in data:
                    product_id = data.split("_")[2]
                    await self.bot.send_message(text=utils.generate_add_to_card_button(product_id), chat_id=chat_id)

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Violet

в функции generate_add_to_card_button() сериализуйте button в строку JSON-формата:

import json
...


def generate_add_to_card_button():
    products = ['asd']
    button = {"inline_keyboard": []}
    for _ in products:
        button['inline_keyboard'].append([{
            'text': "Добавить",
            'callback_data': "add_to_card"
        }])
    return json.dumps(button)

Вопрос только как вы поймёте, что именно было добавлено в корзину, ведь callback_data не содержит информации о товаре.

Можно воспользоваться следующим кодом для передачи дополнительных данных:

{"inline_keyboard":
[[{"text": "Утвердить",
"callback_data": "['order_true', '123']"},
{"text": "Отклонить",
"callback_data": "['order_false', '456']"}]]}

import ast
...

if call.data.startswith("['order_true'"):
        number = ast.literal_eval(call.data)[1]
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                              text='{0}\n{1}'.format(call.message.text, number))

Таким образом в сообщении number будет 123.

Только не забывайте про ограничение на callback_data в 64 байта.

Так же можете рассмотреть вариант со встроенным функционалом приёма платежей.

Демо магазин в Telegram.

→ Ссылка