Skip to content

[BUG] Overpay: POST /orders/ возвращает 404, нужно /orders/preflight #2915

Description

@lesha19

Описание / Конфигурация

В app/services/overpay_service.py, метод create_payment (строка ~196), бот шлёт POST на endpoint /orders/ — но в актуальном API Overpay (https://api-pay.overpay.io) такого endpoint не существует. Все попытки создать платёж через Overpay падают с 404 NotFound.

Реальный endpoint для создания платежа — POST /orders/preflight (см. официальный OpenAPI spec Overpay).

Воспроизводится на v3.51.0 — v3.52.1.

.env:

OVERPAY_ENABLED=true
OVERPAY_API_URL=https://api-pay.overpay.io
OVERPAY_USERNAME=<скрыто>
OVERPAY_PASSWORD=<скрыто>
OVERPAY_PROJECT_ID=985
OVERPAY_P12_PATH=/app/certs/overpay.p12
OVERPAY_P12_PASSPHRASE=<скрыто>
OVERPAY_PAYMENT_METHODS=fps

Шаги для воспроизведения

  1. Настроить Overpay (получить от провайдера USERNAME / PASSWORD / PROJECT_ID / P12-сертификат с пассфразой), прописать в .env обязательные OVERPAY_* переменные.
  2. OVERPAY_ENABLED=true, docker compose up -d --force-recreate --no-deps remnawave-bot.
  3. В боте → пополнить баланс → выбрать «Overpay» → ввести сумму ≥ 100 ₽.
  4. Платёж не создаётся, юзер видит ошибку.

Фактический результат

В логах remnawave-bot:

[httpx] HTTP Request: POST https://api-pay.overpay.io/orders/ "HTTP/1.1 404 Not Found"
[app.services.overpay_service] Overpay create_payment error
  status_code=404
  error_msg='Not found'
  response_data={'name': 'NotFoundError', 'message': 'Not found', 'code': 404, 'type': 'NOT_FOUND'}
[app.payments] Overpay: ошибка создания платежа
  error=OverpayAPIError('Overpay API error (404): Not found')

Traceback:
  /app/app/services/payment/overpay.py:109 in create_overpay_payment
  /app/app/services/overpay_service.py:219 in create_payment
    raise OverpayAPIError(response.status_code, error_msg)

Прямой curl с теми же credentials и сертификатом, только меняя путь, подтверждает где проблема:

# Текущий код Bedolaga (404)
curl --cert cert.pem --key key.pem \
  -u "$USERNAME:$PASSWORD" \
  -X POST "https://api-pay.overpay.io/orders/" \
  -H "Content-Type: application/json" \
  -d '{"amount":"100.00","currency":"RUB","livetimeMinutes":30,"projectId":"985","merchantTransactionId":"test_1","paymentMethods":["fps"]}'
# → HTTP 404 {"name":"NotFoundError","message":"Not found","code":404,"type":"NOT_FOUND"}

# Правильный endpoint
curl --cert cert.pem --key key.pem \
  -u "$USERNAME:$PASSWORD" \
  -X POST "https://api-pay.overpay.io/orders/preflight" \
  -H "Content-Type: application/json" \
  -d '{"amount":"100.00","currency":"RUB","livetimeMinutes":30,"projectId":"985","merchantTransactionId":"test_1","paymentMethods":["fps"]}'
# → HTTP 200 {"id":"177321658924761","resultUrl":"https://paylink.overpay.io/checkout/177321658924761"}

Ожидаемое поведение

Бот получает от Overpay HTTP 200 с resultUrl (https://paylink.overpay.io/checkout/<id>) и отдаёт её юзеру.

Дополнительная информация

Источник истины — OpenAPI spec Overpay

Официальная OpenAPI spec доступна по https://pay-docs.overpay.io/api/spec и перечисляет endpoints:

POST  /orders/preflight       ← создание платежа
POST  /orders/authorize
POST  /orders/credit
POST  /api/orders/init
GET   /orders/{id}            ← Bedolaga использует правильно ✓
PUT   /orders/{id}/charge
PUT   /orders/{id}/refund     ← Bedolaga использует правильно ✓
PUT   /orders/{id}/reverse
POST  /orders/{id}/complete3d20
GET   /orders                 ← список
GET   /operations

POST /orders/ отсутствует.

Предлагаемый фикс

В app/services/overpay_service.py метод create_payment (строка ~196):

             response = await client.post(
-                f'{self.api_url}/orders/',
+                f'{self.api_url}/orders/preflight',
                 json=payload,
                 headers={'Content-Type': 'application/json'},
             )

И docstring (строка 169):

-        POST {API_URL}/orders/
+        POST {API_URL}/orders/preflight

Методы get_payment (GET /orders/{id}) и refund_payment (PUT /orders/{id}/refund) трогать не нужно — они уже соответствуют актуальной spec.

Дополнительные мелочи (не блокеры)

  • Дефолтный OVERPAY_API_URL = 'https://api.overpay.io' в app/config.py:634 тоже устарел — актуальный домен https://api-pay.overpay.io (старый возвращает 404 на любой путь). Юзеры обходят это через .env override, но дефолт стоит обновить.
  • projectId в payload должен быть строкой — текущий код уже это обеспечивает (OVERPAY_PROJECT_ID: str | None), менять не надо.
  • В документации docs.bedolagam.ru/bot/payments#overpay endpoint не упоминается — править не нужно.

Окружение

  • Bedolaga: v3.52.1 (баг присутствует с v3.51.0, момент добавления интеграции коммитом 2c3ffc8c)
  • Python 3.13
  • Overpay: production project (SBP), сертификат от Overpay CA

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions