Как узнать статус платежа в системе Robokassa?

Добрый день! Я работаю над интеграцией платёжной системы Robokassa в своем телеграмм-боте с использованием Aiogram 3.7 и файла, предоставленного разработчиками. У меня возникла проблема с тем, что именно необходимо передать в запросе в функции result_payment. Я уже успешно сгенерировал платёж и осуществил его оплату с помощью функции generate_payment_link. 

Мне важно отметить, что я не могу изменить параметры платёжной системы, так как пароли и ID указаны корректно. 

Вот код, который я использую: 

```python
def calculate_signature(*args) -> str:
    """Create signature MD5."""
    return hashlib.md5(':'.join(str(arg) for arg in args).encode()).hexdigest()

def parse_response(request: str) -> dict:
    """
    :param request: Link.
    :return: Dictionary.
    """
    params = {}
    
    for item in urlparse(request).query.split('&'):
        key, value = item.split('=')
        params[key] = value
    return params

def check_signature_result(merchant_login,
                            order_number: int,  # invoice number
                            received_sum: int,  # cost of goods, RU
                            received_signature: hex,  # SignatureValue
                            password: str  # Merchant password
                           ) -> bool:
    signature = calculate_signature(merchant_login, received_sum, order_number, password)
    return signature.lower() == received_signature.lower()

# Формирование URL переадресации пользователя на оплату.

def generate_payment_link(
    number: int,  # Invoice number
    description: str,  # Description of the purchase,
) -> str:
    """URL for redirection of the customer to the service."""
    signature = calculate_signature(
        PaymentConfig.merchant_login,
        PaymentConfig.merchant_cost,
```

Можете ли вы объяснить, что именно следует передать в запросе функции result_payment?
  • 27 августа 2024 г. 19:24
Ответы на вопрос 1
Для проверки статуса платежа в системе Robokassa, вам нужно использовать метод "result_payment", который обычно вызывается в ответ на уведомление от Robokassa о результате платежа. Этот метод должен обрабатывать запрос от Robokassa с необходимыми параметрами и проверять их подпись.

Когда Robokassa отправляет запрос о результате платежа, она включает в него несколько параметров, которые вы должны проверить. Вот список основных параметров, которые могут быть переданы в запросе от Robokassa:

1. `MerchantLogin` (логин мерчанта) – ваш логин в системе Robokassa.
2. `OutSum` (сумма платежа) – сумма, которую вы получили.
3. `InvId` (номер инвойса) – уникальный номер вашего заказа.
4. `SignatureValue` (подпись) – подпись, которая используется для проверки целостности данных.
5. `Shp_*` (дополнительные параметры) – если вы передавали дополнительные параметры, они будут начинаться с префикса `Shp_`.

В функции `result_payment` вам нужно будет принимать эти параметры и проверять подпись. Вот пример того, как это может выглядеть:

```python
from flask import Flask, request
import hashlib

app = Flask(__name__)

@app.route('/result_payment', methods=['POST'])
def result_payment():
    # Получаем параметры из запроса
    merchant_login = request.form.get('MerchantLogin')
    out_sum = float(request.form.get('OutSum'))
    inv_id = int(request.form.get('InvId'))
    signature_value = request.form.get('SignatureValue')

    # Проверяем подпись
    if check_signature_result(merchant_login, inv_id, out_sum, signature_value, PaymentConfig.merchant_password):
        # Если подпись верна, обработаем платеж
        # Например, обновим статус заказа в базе данных
        return "OK"  # Ответ для Robokassa, чтобы сделать зеленую галочку
    else:
        # Если подпись неверна, вы можете вернуть ошибку
        return "Invalid signature"
```

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

Что касается параметров для отправки в запросе, в данном случае вам нужно передавать их из `request.form`, так как они приходят в POST-запросе. Убедитесь, что вы правильно настроили URL для обработки платежей, чтобы Robokassa могла отправлять данные на правильный адрес. 

Не забудьте также зарегистрировать ваш обработчик `result_payment` в вашем маршрутизаторе Flask или другом web-фреймворке, который вы используете.
Похожие вопросы