Богдан Вагнер, сегодня в 21:04
import telegram
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler, MessageHandler, Filters
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
import paypalrestsdk

# Заключительный авторизационный токен
PAYPAL_ACCESS_TOKEN = ‘YOUR_ACCESS_TOKEN’

# Инициализация Firebase
cred = credentials.Certificate(‘path/to/serviceAccountKey.json’)
firebase_admin.initialize_app(cred, {
    ‘databaseURL’: ‘https://your-project-id.firebaseio.com/’
})

# Ссылка на узел с пользователями
users_ref = db.reference(‘users’)

# Ссылка на узел с транзакциями
transactions_ref = db.reference(‘transactions’)

# Инициализация PayPal
paypalrestsdk.configure({
    “mode”: “sandbox”,
    “client_id”: “YOUR_CLIENT_ID”,
    “client_secret”: “YOUR_CLIENT_SECRET”
})

CALCULATOR, FIRST_NUMBER, SECOND_NUMBER, OPERATION = range(4)

def start(update, context):
    keyboard = [[InlineKeyboardButton(‘Калькулятор’, callback_data=‘calculator’)]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(‘Выберите действие?’, reply_markup=reply_markup)

def button(update, context):
    query = update.callback_query
    if query.data == ‘calculator’:
        query.edit_message_text(text=‘Введите первое число:’)
        return FIRST_NUMBER

def get_first_number(update, context):
    context.user_data[‘first_number’] = int(update.message.text)
    update.message.reply_text(‘Введите второе число:’)
    return SECOND_NUMBER

def get_second_number(update, context):
    context.user_data[‘second_number’] = int(update.message.text)
    update.message.reply_text(‘Выберите действие:\n1. Сложение\n2. Вычитание\n3. Умножение\n4. Деление’)
    return OPERATION

def perform_operation(update, context):
    first_number = context.user_data[‘first_number’]
    second_number = context.user_data[‘second_number’]
    operation = int(update.message.text)

    if operation == 1:
        result = first_number + second_number
    elif operation == 2:
        result = first_number - second_number
    elif operation == 3:
        result = first_number * second_number
    elif operation == 4:
        result = first_number / second_number

    update.message.reply_text(f’Результат: {result}')

    # Сохранение транзакции в базу данных
    user_id = str(update.message.from_user.id)
    transactions_ref.push().set({
        ‘user_id’: user_id,
        ‘operation’: operation,
        ‘result’: result
    })

    return ConversationHandler.END

def cancel(update, context):
    update.message.reply_text(‘Операция прервана.’)
    return ConversationHandler.END

def donate(update, context):
    user_id = str(update.message.from_user.id)
    username = update.message.from_user.username

    # Сохранение пользователя в базу данных
    users_ref.child(user_id).set({
        ‘username’: username
    })

    # Генерация ссылки на оплату в PayPal
    payment = paypalrestsdk.Payment({
        “intent”: “sale”,
        “payer”: {
            “payment_method”: “paypal”
        },
        “redirect_urls”: {
            “return_url”: “https://example.com/success”,
            “cancel_url”: “https://example.com/cancel”
        },
        “transactions”: [{
            “item_list”: {
                “items”: [{
                    “name”: “Пожертвование”,
                    “sku”: “donate”,
                    “price”: “10”,
                    “currency”: “USD”,
                    “quantity”: 1
                }]
            },
            “amount”: {
                “total”: “10”,
                “currency”: “USD”
            },
            “description”: “Пожертвование пользователем {0} ({1})”.format(username, user_id)
        }]
    })

    if payment.create():
        for link in payment.links:
            if link.rel == “approval_url”:
                update.message.reply_text(“Ссылка на оплату: {0}”.format(link.href))

                # Сохранен
[Ссылка]
Example Domain
https://example.com/success

Богдан Вагнер, сегодня в 21:04
ие информации о платеже в базу данных
                transactions_ref.push().set({
                    ‘user_id’: user_id,
                    ‘payment_id’: payment.id,
                    ‘state’: payment.state
                })
        return

    update.message.reply_text(payment.error)

def main():
    # Replace ‘BOT_TOKEN’ with your bot’s token received from BotFather
    updater = Updater(token=‘BOT_TOKEN’, use_context=True)
    dispatcher = updater.dispatcher

    # Registering handler for command ‘/start’
    start_handler = CommandHandler(‘start’, start)
    dispatcher.add_handler(start_handler)

    # Registering handler for handling inline button callback
    callback_query_handler = CallbackQueryHandler(button)

    # Registering conversation handler for calculator
    calculator_conv_handler = ConversationHandler(
        entry_points=[CallbackQueryHandler(button)],
        states={
            FIRST_NUMBER: [MessageHandler(Filters.text & (~Filters.command), get_first_number)],
            SECOND_NUMBER: [MessageHandler(Filters.text & (~Filters.command), get_second_number)],
            OPERATION: [MessageHandler(Filters.text & (~Filters.command), perform_operation)],
        },
        fallbacks=[CommandHandler(‘cancel’, cancel)]
    )
    dispatcher.add_handler(calculator_conv_handler)

    # Registering handler for command ‘/donate’
    donate_handler = CommandHandler(‘donate’, donate)
    dispatcher.add_handler(donate_handler)

    # Starting the bot
    updater.start_polling()
    updater.idle()

if name == ‘main’:
    main()

В данном коде, функция donate добавляет возможность пожертвований через PayPal. После того, как пользователь подтверждает платеж на странице PayPal, в Firebase Realtime Database сохраняется информация о платеже. В качестве примера, в Firebase добавляются новые записи со следующими полями:

- user_id: идентификатор пользователя в Telegram;
- payment_id: идентификатор платежа в PayPal;
- state: состояние платежа в PayPal (например, created, approved, failed и т.д.).

Дополнительно можно добавить обработчики для успешного и отмененного платежа, чтобы проинформировать пользователя об этом событии. Добавь в код инлайн кнопку подписки на чат инвесторов, после которой будет доступно пользование ботом и добавь в базу данных баланс пользователя и время создания