Как только создается оплата появляется ошибка buy_14days
{'days': 14, 'price': 50}
Subscription: {'active': False}
Price: 50
Payment ID: 02112024-02-22-32-VWGXYOUXNYCH-HLATM
Error in payment processing: string indices must be integers, not 'str'  @bot.message_handler(commands=['qr'])
def qr_handler(message):
    user = get_user_info(message.from_user.id)
    
    if not user.vpn_link:
        bot.reply_to(message, 
            "❌ *У вас нет активной VPN ссылки*\n\n" +
            "🎁 Используйте /test для получения пробного периода\n" +
            "💳 Или /buy для покупки подписки",
            parse_mode='MarkdownV2'
        )
        return

    qr_image = vpn_manager.generate_qr_code(user.vpn_link)
    bot.send_message(message.chat.id, 
        "📱 *QR\\-код для подключения:*\n" +
        "_Нажмите на изображение ниже, чтобы показать_",
        parse_mode='MarkdownV2'
    )
    bot.send_photo(message.chat.id, qr_image, has_spoiler=True)

@bot.message_handler(commands=['buy'])
def buy_handler(message):
    subscription = check_active_subscription(message.from_user.id)
    
    if subscription and subscription['active']:
        escaped_link = escape_markdown(subscription['vpn_link'])
        expiry_date = escape_markdown(subscription['expiry_date'].strftime('%d.%m.%Y'))
        bot.reply_to(message,
            "ℹ️ *Информация о подписке:*\n\n" +
            "✅ *Статус:* Активна\n" +
            f"📅 *Действует до:* {expiry_date}\n" +
            f"⏳ *Осталось дней:* {escape_markdown(subscription['remaining_days'])}\n\n" +
            "🔗 *Ваша ссылка:*\n" +
            f"||`{escaped_link}`||",
            parse_mode='MarkdownV2'
        )
        return

    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("🎯 14 дней - 50₽", callback_data="buy_14days"),
        types.InlineKeyboardButton("📅 1 месяц - 100₽", callback_data="buy_month"),
        types.InlineKeyboardButton("📅 3 месяца - 250₽", callback_data="buy_3months"),
        types.InlineKeyboardButton("📅 6 месяцев - 450₽", callback_data="buy_6months"),
        types.InlineKeyboardButton("📅 12 месяцев - 800₽", callback_data="buy_12months")
    )

    bot.reply_to(message, 
        "🛍 *Доступные планы:*\n\n" +
        "🎯 14 дней \\- *50₽*\n" +
        "📅 1 месяц \\- *100₽*\n" +
        "📅 3 месяца \\- *250₽*\n" +
        "📅 6 месяцев \\- *450₽*\n" +
        "📅 12 месяцев \\- *800₽*\n\n" +
        "_Выберите подходящий план:_", 
        parse_mode='MarkdownV2',
        reply_markup=keyboard
    )

def generate_payment_id():
    """Генерирует уникальный ID платежа"""
    now = datetime.now()
    
    # Буквы и цифры, используемые для генерации ID
    chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    
    # Генерация 12 символов X
    random_x = ''.join(random.choice(chars) for _ in range(12)).upper()
    
    # Генерация 5 символов Y
    random_y = ''.join(random.choice(chars) for _ in range(5)).upper()
    
    # Формирование полного идентификатора
    payment_id = f"{now.strftime('%d%m%Y-%H-%M-%S')}-{random_x}-{random_y}"
    return payment_id

@bot.callback_query_handler(func=lambda call: True)
def callback_query(call):
    subscription_plans = {
        "buy_14days": {"days": 14, "price": 50},
        "buy_month": {"days": 30, "price": 100},
        "buy_3months": {"days": 90, "price": 250},
        "buy_6months": {"days": 180, "price": 450},
        "buy_12months": {"days": 365, "price": 800}
    }
    
    # Обработка кнопки отмены оплаты
    if call.data == 'cancel_payment':
        try:
            bot.delete_message(call.message.chat.id, call.message.message_id)
            bot.answer_callback_query(
                call.id,
                "🚫 Оплата отменена",
                show_alert=True
            )
            return
        except Exception as e:
            print(f"Error in cancel payment: {e}")
            return

    if call.data in subscription_plans:
        print(call.data)
        print(subscription_plans.get(call.data))

        # Инициализируем payment_id здесь, чтобы он был доступен в блоке except
        payment_id = None
        try:
            subscription = check_active_subscription(call.from_user.id)
            print("Subscription:", subscription)

            # Убедитесь, что subscription — это словарь
            if not isinstance(subscription, dict):
                subscription = {'active': False}
            if subscription and subscription['active']:
                bot.answer_callback_query(
                    call.id,
                    "⚠️ У вас уже есть активная подписка! Дождитесь её окончания.",
                    show_alert=True
                )
                return
            
            plan = subscription_plans[call.data]
            payment_id = generate_payment_id()
            price = int(plan['price'])
            days = int(plan['days'])
            # Сохраняем информацию о платеже
            if not save_payment_info(
                user_id=call.from_user.id,
                payment_id=payment_id,
                amount=price,
                plan_days=days
            ):
                raise Exception("Failed to save payment info")
            
            
            # Создание платежа
            quickpay = Quickpay(
                receiver="4100117555061641",
                quickpay_form="shop",
                targets="VPN Subscription",
                paymentType="SB",
                sum=round(price * 1.03, 2),  # +3% к цене
                label=str(payment_id)
            )
            print("Price:", price)
            print("Payment ID:", payment_id)


            # Создание клавиатуры с кнопками оплаты
            markup = types.InlineKeyboardMarkup()
            pay_button = types.InlineKeyboardButton(
                f"Оплатить {plan['price']}₽", 
                url=quickpay.redirected_url
            )
            cancel_button = types.InlineKeyboardButton(
                'Отменить', 
                callback_data='cancel_payment'
            )
            markup.add(pay_button)
            markup.add(cancel_button)

            # Удаление предыдущего сообщения и отправка нового
            bot.delete_message(call.message.chat.id, call.message.message_id)
            msg = bot.send_message(
                call.message.chat.id,
                f"💸 *Оплата подписки:*\n\n"
                f"📅 Тариф: {plan['days']} дней\n"
                f"💰 Сумма: {plan['price']}₽\n"
                f"🕐 Время на оплату: 5 минут\n\n"
                f"🆔 ID: `{payment_id}`\n\n"
                f"_Нажмите кнопку ниже для оплаты:_",
                parse_mode='MarkdownV2',
                reply_markup=markup
            )

            # Проверка оплаты
            token = "B6BCB8D70B1301E1B33698F209CE4F25D24D02C8CAA9D19426C2DA3E0D38732313E74EE50E50C6938F6CFA0FBF9C32E208D79761278981497D3662DEA7C220C6ED013A9626C33C5CEBD4D49218FB93E6547392868DEA2654D99521B6EECEC828E246C929255C335588A80732AD85EC0A89A5E4BB2933776E7ECF58E637C1F63C"
            client = Client(token)
            start_time = int(time.time())
            
            while True:
                if int(time.time()) - start_time > 300:  # 5 минут таймаут
                    # Отмечаем платёж как просроченный
                    update_payment_status(payment_id, 'expired')
                    
                    bot.delete_message(call.message.chat.id, msg.message_id)
                    bot.send_message(
                        call.message.chat.id,
                        "⏰ *Время на оплату истекло*\n\n"
                        "Попробуйте заказать подписку снова\\.",
                        parse_mode='MarkdownV2'
                    )
                    return

                history = client.operation_history(label=payment_id)
                print("Operations:", history.operations)
                for operation in history.operations:
                    if getattr(operation, 'status', None) == 'success':
                        # Проверяем сумму платежа
                        if abs(float(operation.amount) - round(price * 1.03, 2)) > 0.01:
                            update_payment_status(payment_id, 'invalid_amount')
                            bot.send_message(
                                call.message.chat.id,
                                "❌ *Ошибка оплаты*\n\n"
                                "Сумма платежа не соответствует заказу\\.\n"
                                "Пожалуйста, обратитесь в поддержку\\.",
                                parse_mode='MarkdownV2'
                            )
                            return

                        # Отмечаем платёж как успешный
                        update_payment_status(payment_id, 'success')
                        
                        # Создаём VPN
                        vpn_link = vpn_manager.create_vpn_user(days=days)
                        
                        if vpn_link:
                            result = create_subscription(
                                call.from_user.id, 
                                vpn_link, 
                                days=plan["days"]
                            )
                            
                            if result['success']:
                                escaped_link = escape_markdown(vpn_link)
                                expiry_date = escape_markdown(
                                    result['expiry_date'].strftime('%d.%m.%Y')
                                )
                                
                                # Отправляем уведомление в админский чат
                                bot.send_message(
                                    ADMIN_CHAT_ID,
                                    f"💰 Новая оплата!\n\n"
                                    f"👤 Пользователь: @{call.from_user.username}\n"
                                    f"💵 Сумма: {plan['price']}₽\n"
                                    f"📅 Тариф: {plan['days']} дней\n"
                                    f"🆔 ID: {payment_id}"
                                )
                                
                                # Отправляем информацию пользователю
                                bot.delete_message(call.message.chat.id, msg.message_id)
                                bot.send_message(
                                    call.message.chat.id,
                                    "✅ *План успешно оплачен\!*\n\n"
                                    "🔗 *Ваша VPN ссылка:*\n"
                                    f"||`{escaped_link}`||\n\n"
                                    f"📅 *Срок действия:* до {expiry_date}\n"
                                    f"⏳ _{escape_markdown(str(result['days']))} дней_\n\n"
                                    "_Скопируйте ссылку и импортируйте её в приложение_\n\n"
                                    "❓ Если нужна помощь \\- напишите в поддержку",
                                    parse_mode='MarkdownV2'
                                )
                                return
                            else:
                                update_payment_status(payment_id, 'error_subscription')
                                bot.send_message(
                                    call.message.chat.id,
                                    "❌ *Ошибка создания подписки*\n\n"
                                    "Оплата прошла успешно, но возникла ошибка\\.\\.\n"
                                    "Администраторы уже уведомлены и скоро всё исправят\\!",
                                    parse_mode='MarkdownV2'
                                )
                                # Уведомляем админов
                                bot.send_message(
                                    ADMIN_CHAT_ID,
                                    f"⚠️ Ошибка создания подписки!\n\n"
                                    f"👤 Пользователь: @{call.from_user.username}\n"
                                    f"💵 Сумма: {plan['price']}₽\n"
                                    f"🆔 ID: {payment_id}\n\n"
                                    f"Платёж успешен, но подписка не создана!"
                                )
                                return
                        else:
                            update_payment_status(payment_id, 'error_vpn')
                            bot.send_message(
                                call.message.chat.id,
                                "❌ *Ошибка создания VPN*\n\n"
                                "Оплата прошла успешно, но возникла ошибка\\.\\.\n"
                                "Администраторы уже уведомлены и скоро всё исправят\\!",
                                parse_mode='MarkdownV2'
                            )
                            # Уведомляем админов
                            bot.send_message(
                                ADMIN_CHAT_ID,
                                f"⚠️ Ошибка создания VPN!\n\n"
                                f"👤 Пользователь: @{call.from_user.username}\n"
                                f"💵 Сумма: {plan['price']}₽\n"
                                f"🆔 ID: {payment_id}\n\n"
                                f"Платёж успешен, но VPN не создан!"
                            )
                            return
                            
                time.sleep(5)  # Проверка каждые 5 секунд

        except Exception as e:
            print(f"Error in payment processing: {e}")
            # Теперь payment_id доступен здесь
            if payment_id:
                update_payment_status(payment_id, 'error_processing')
            bot.send_message(
                call.message.chat.id,
                "❌ *Произошла ошибка при обработке оплаты*\n\n"
                "🔄 Пожалуйста, попробуйте позже\\.\n"
                "Если ошибка повторится \\- обратитесь в поддержку\\.",
                parse_mode='MarkdownV2'
            )
            # Уведомляем админов
            bot.send_message(
                ADMIN_CHAT_ID,
                f"⚠️ Ошибка обработки платежа!\n\n"
                f"👤 Пользователь: @{call.from_user.username}\n"
                f"🆔 ID: {payment_id if payment_id else 'Не создан'}\n\n"
                f"Ошибка: {str(e)}"
            )