Skip to content

Matching

matching — это специальный сценарий, в котором мерчант заранее создаёт спрос на выплату, а затем этот спрос закрывается входящими invoice pay-in сделками.

С точки зрения интеграции это не отдельный новый API-домен, а orchestration flow поверх уже существующих endpoint-ов pay-out, pay-in и public invoice confirmation.


Какие endpoint-ы используются

Section titled “Какие endpoint-ы используются”

В matching flow участвуют следующие endpoint-ы:

  1. Создание matching-заявки:
POST /payment/pay-out
  1. Наполнение matching-заявки invoice-платежами:
POST /payment/pay-in
  1. Загрузка чека / подтверждения оплаты для invoice pay-in:
POST /file/trading/pay-in/invoice/upload/public?tradeId={tradeId}
  1. Подтверждение оплаты на payment page:
POST /payment/public/{id}/confirm

Шаг 1. Создание matching-заявки

Section titled “Шаг 1. Создание matching-заявки”

Для создания matching используется стандартный endpoint:

POST /payment/pay-out

Чтобы создать не обычную pay-out сделку, а matching-заявку, нужно передать:

  • isMatching: true
  • merchantTransactionId
  • при необходимости отдельный matchingTransactionId
  • payout-реквизиты в requisite

Если matchingTransactionId не передан, система использует merchantTransactionId как внешний идентификатор matching-заявки.

Как определяется метод matching

Section titled “Как определяется метод matching”

Поле method явно не передаётся.
Метод вычисляется автоматически по реквизитам:

  • requisite.sbpNumber -> sbp_invoice
  • requisite.cardNumber -> c2c_invoice
POST /payment/pay-out
Host: backend.ohlapay.io
Content-Type: application/json
x-signature: <signature>
{
"amount": 15000,
"merchantTransactionId": "txn_matching_001",
"matchingTransactionId": "matching_001",
"isMatching": true,
"callbackUrl": "https://merchant.example/callback",
"requisite": {
"sbpNumber": "79991234567",
"bank": "SBER",
"ownerName": "Ivan Ivanov"
}
}

Что происходит после создания

Section titled “Что происходит после создания”
  • обычная pay-out сделка не создаётся;
  • создаётся сущность matching;
  • в ответ возвращается объект, совместимый с payout response;
  • matching ждёт входящие invoice pay-in сделки;
  • если matching не наполнится вовремя, система может создать fallback pay-out.

Шаг 2. Наполнение matching-заявки

Section titled “Шаг 2. Наполнение matching-заявки”

Для наполнения matching используется стандартный endpoint:

POST /payment/pay-in

Чтобы запрос участвовал в matching flow, нужно передать один из invoice-методов:

  • c2c_invoice
  • sbp_invoice

Backend автоматически:

  1. ищет подходящую открытую matching-заявку у мерчанта;
  2. проверяет совместимость метода;
  3. если matching найден, создаёт matching-backed pay-in;
  4. если matching не найден, переводит запрос в обычный pay-in flow.

Матрица совместимости методов

Section titled “Матрица совместимости методов”
  • sbp_invoice ищет matching по sbp / sbp_invoice
  • c2c_invoice ищет matching по c2c / c2c_invoice

Пример запроса на наполнение matching

Section titled “Пример запроса на наполнение matching”
POST /payment/pay-in
Host: backend.ohlapay.io
Content-Type: application/json
x-signature: <signature>
{
"amount": 5000,
"method": "sbp_invoice",
"merchantTransactionId": "txn_payin_001",
"payerInfo": {
"ip": "127.0.0.1",
"userId": "1",
"userAgent": "Chrome/5.0",
"fingerprint": "fbb77b9f4265b18538e66cac5a37c6410dc2cdd7f0cddfde6eda25aa10df669b",
"registeredAt": "1728388185326"
}
}

Шаг 3. Подтверждение invoice после выдачи реквизитов

Section titled “Шаг 3. Подтверждение invoice после выдачи реквизитов”

После создания invoice pay-in клиент должен подтвердить оплату через payment page flow.

POST /file/trading/pay-in/invoice/upload/public?tradeId={tradeId}

Этот endpoint возвращает uploadMetaKey.

3.2 Подтверждение оплаты

Section titled “3.2 Подтверждение оплаты”
POST /payment/public/{id}/confirm

В body подтверждения передаётся uploadMetaKey, полученный после загрузки файла.

Именно этот шаг завершает пользовательскую часть invoice flow и переводит сделку в дальнейшую обработку.


В matching flow используются два разных fallback-механизма.

Если POST /payment/pay-in пришёл с методом c2c_invoice или sbp_invoice, но подходящая matching-заявка не найдена, система не обязана возвращать ошибку.
Она может автоматически переключить запрос в обычный pay-in:

  • sbp_invoice -> sbp
  • c2c_invoice -> c2c

Если matching был создан, но не был полностью наполнен за допустимое время, система может автоматически создать fallback pay-out на остаток суммы.

Это выполняется фоновым процессом и не требует отдельного API-вызова со стороны мерчанта.


Что важно учесть при интеграции

Section titled “Что важно учесть при интеграции”
  • Matching не является отдельным REST-ресурсом с собственным create endpoint.
  • Создание matching выполняется через POST /payment/pay-out.
  • Наполнение matching выполняется через POST /payment/pay-in.
  • Для invoice flow нужно учитывать не только создание pay-in, но и дальнейшие шаги upload + confirm.
  • Для matching рекомендуется всегда передавать отдельный matchingTransactionId.
  • matchingTransactionId должен быть уникален в рамках мерчанта.

Для быстрого прогона matching flow доступна готовая Postman-коллекция:

Коллекция покрывает следующие шаги:

  1. Создание matching через POST /payment/pay-out с isMatching=true
  2. Создание invoice pay-in через POST /payment/pay-in
  3. Отмена pay-in
  4. Продление таймера pay-in
  5. Загрузка чека через merchant-auth endpoint
  6. Подтверждение чека через public payment page endpoint

Что нужно заполнить перед запуском

Section titled “Что нужно заполнить перед запуском”
  • baseUrl — базовый URL API
  • secureKey — merchant API key
  • receiptFile — абсолютный путь к файлу чека на вашей машине
  • callbackUrl — URL для webhook-уведомлений, если вы хотите проверить callback flow

Остальные переменные коллекция заполняет автоматически из ответов предыдущих запросов.

Коллекцию нужно выполнять последовательно сверху вниз, потому что следующие шаги используют значения, полученные на предыдущих запросах:

  • matchingId
  • payInTradeId
  • publicTradeId
  • uploadMetaKey