import config
import logging
import sqlite3
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types.message import ContentType
from datetime import datetime, timedelta

# логирование
logging.basicConfig(level=logging.INFO)

# инициализация
bot = Bot(token=config.TOKEN_PAY)
dp = Dispatcher(bot)

# подключение к базе данных
conn = sqlite3.connect('subscriptions.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS subscriptions 
                  (user_id INTEGER PRIMARY KEY, valid_until TIMESTAMP)''')
conn.commit()

# ценники
PRICE = types.LabeledPrice(label='Подписка на 1 месяц', amount=50*100)  # в копейках (руб)

keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(types.KeyboardButton('Купить подписку'))

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await message.answer('Привет! Я бот для подписок. Нажмите кнопку ниже, чтобы оформить подписку.', reply_markup=keyboard)

# buy
@dp.message_handler(lambda message: message.text == 'Купить подписку')
async def send_buy_invoice(message: types.Message):
    if config.PAYMENTS_TOKEN.split(':')[1] == 'TEST':
        await bot.send_message(message.chat.id, 'Тестовый платеж!!!')

    await bot.send_invoice(message.chat.id,
                           title='Подписка на бота',
                           description='Активация подписки на бота на 1 месяц',
                           provider_token=config.PAYMENTS_TOKEN,
                           currency='rub',
                           photo_url='https://www.aroged.com/wp-content/uploads/2022/06/Telegram-has-a-premium-subscription.jpg',
                           photo_width=416,
                           photo_height=234,
                           photo_size=416,
                           is_flexible=False,
                           prices=[PRICE],
                           start_parameter='one-month-subscription',
                           payload='test-invoice-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):
    logging.info('SUCCESSFUL PAYMENT:')
    payment_info = message.successful_payment.to_python()
    for k, v in payment_info.items():
        logging.info(f'{k} = {v}')

    user_id = message.from_user.id

    # проверка существования подписки
    cursor.execute('SELECT valid_until FROM subscriptions WHERE user_id = ?', (user_id,))
    result = cursor.fetchone()

    if result:
        existing_valid_until = datetime.strptime(result[0], '%Y-%m-%d %H:%M:%S.%f')
        # продлеваем с текущего срока окончания
        valid_until = existing_valid_until + timedelta(days=31)
    else:
        # создаем новую подписку
        valid_until = datetime.now() + timedelta(days=31)

    cursor.execute('INSERT OR REPLACE INTO subscriptions(user_id, valid_until) VALUES(?, ?)', (user_id, valid_until))
    conn.commit()

    await bot.send_message(message.chat.id,
                           f'Платеж на сумму {message.successful_payment.total_amount // 100} {message.successful_payment.currency} прошел успешно!!! Ваша подписка активна до {valid_until.strftime("%Y-%m-%d %H:%M:%S")}')


if __name__ == '__main__':
    try:
        executor.start_polling(dp, skip_updates=True)
    finally:
        conn.close()
 нужно что бы кнопка всплывала сразу даже без команды старт