Описание / Конфигурация
В 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
Шаги для воспроизведения
- Настроить Overpay (получить от провайдера USERNAME / PASSWORD / PROJECT_ID / P12-сертификат с пассфразой), прописать в
.env обязательные OVERPAY_* переменные.
OVERPAY_ENABLED=true, docker compose up -d --force-recreate --no-deps remnawave-bot.
- В боте → пополнить баланс → выбрать «Overpay» → ввести сумму ≥ 100 ₽.
- Платёж не создаётся, юзер видит ошибку.
Фактический результат
В логах 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
Описание / Конфигурация
В
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:Шаги для воспроизведения
.envобязательныеOVERPAY_*переменные.OVERPAY_ENABLED=true,docker compose up -d --force-recreate --no-deps remnawave-bot.Фактический результат
В логах
remnawave-bot:Прямой
curlс теми же credentials и сертификатом, только меняя путь, подтверждает где проблема:Ожидаемое поведение
Бот получает от 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/отсутствует.Предлагаемый фикс
В
app/services/overpay_service.pyметодcreate_payment(строка ~196):И docstring (строка 169):
Методы
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 на любой путь). Юзеры обходят это через.envoverride, но дефолт стоит обновить.projectIdв payload должен быть строкой — текущий код уже это обеспечивает (OVERPAY_PROJECT_ID: str | None), менять не надо.docs.bedolagam.ru/bot/payments#overpayendpoint не упоминается — править не нужно.Окружение
2c3ffc8c)