Как узнать статус покупки через Robokassa в Telegram-боте?

Каков способ получения статуса оплаты в боте, написанном на Python с использованием фреймворка aiogram, если кнопка для оплаты открывает страницу робокассы в браузере, и бот не использует вебхуки?
  • 26 сентября 2024 г. 19:03
Ответы на вопрос 1
Для получения статуса платежа через Robokassa в Telegram-боте, написанном на Python с использованием фреймворка `aiogram`, даже если вы не используете вебхуки, вы можете использовать следующий подход:

1. **Отправка и получение платежа**: При отправке пользователя на страницу Robokassa для оплаты, вам нужно сохранять уникальный идентификатор покупки (например, `InvId`) и сопоставлять его с состоянием в вашей базе данных.

2. **Проверка статуса оплаты**: Чтобы проверить статус платежа, вы можете периодически запрашивать Robokassa о статусе платежа с помощью их API. Это можно сделать с помощью запросов с использованием `requests` или другого HTTP-клиента.

3. **Создание команды для проверки статуса**: Вам нужно будет создать команду или обработчик в вашем боте, который будет проверять статус каждой платежной транзакции.

Вот пример реализации:

### 1. Отправка пользователя на страницу Robokassa

```python
import hashlib
import requests
from aiogram import Bot, Dispatcher, types, executor

API_TOKEN = 'YOUR_API_TOKEN'
ROBOKASSA_LOGIN = 'YOUR_LOGIN'
ROBOKASSA_SECRET1 = 'YOUR_SECRET1'
ROBOKASSA_SECRET2 = 'YOUR_SECRET2'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['pay'])
async def process_payment(message: types.Message):
    inv_id = 'unique_invoice_id'  # Генерируйте уникальный ID для каждой транзакции
    amount = '100.00'  # Сумма платежа
    signature = hashlib.md5(f"{ROBOKASSA_LOGIN}:{amount}:{inv_id}:{ROBOKASSA_SECRET1}".encode()).hexdigest()

    payment_url = f"https://auth.robokassa.ru/Merchant/Index.aspx?MrchLogin={ROBOKASSA_LOGIN}&OutSum={amount}&InvId={inv_id}&SignatureValue={signature}&IncCurrLabel=RUB"
    
    await message.answer("Перейдите по ссылке для оплаты: " + payment_url)
```

### 2. Проверка статуса платежа

```python
async def check_payment_status(inv_id):
    # Параметры для запроса статуса платежа
    params = {
        'MrchLogin': ROBOKASSA_LOGIN,
        'InvId': inv_id,
        'Signature': hashlib.md5(f"{ROBOKASSA_LOGIN}:{inv_id}:{ROBOKASSA_SECRET2}".encode()).hexdigest()
    }

    response = requests.get("https://api.robokassa.ru/Payment/History", params=params)
    return response.json()  # Замените на нужную вам обработку ответа
```

### 3. Команда для проверки статуса

```python
@dp.message_handler(commands=['check_payment'])
async def command_check_payment(message: types.Message):
    inv_id = 'передайте уникальный ID транзакции'
    status = await check_payment_status(inv_id)
    await message.answer(f"Статус платежа {inv_id}: {status}")  # Обработайте вывод статуса по вашему усмотрению
```

В этом примере была реализована базовая функциональность для отправки пользователя на страницу оплаты Robokassa и проверки статуса оплаты. Обязательно замените переменные на ваши реальные данные и добавьте обработку ошибок и другие необходимые функциональности.

Также учтите, что для более профессиональной реализации может понадобиться использование асинхронных библиотек для HTTP-запросов, таких как `aiohttp`, чтобы не блокировать цикл событий `aiogram`.
Похожие вопросы