Оплата банковской картой
NUMUS создаёт платёж и возвращает ссылку на защищённую платёжную форму.
Покупатель вводит реквизиты карты только на этой форме. После проверки
результата NUMUS отправляет вашему backend событие
payment.completed либо payment.failed.
Как проходит платёж
- Ваш сервер создаёт платёжОтправьте подписанный запрос с уникальным
Idempotency-Key. - NUMUS возвращает ссылкуОтвет содержит идентификатор платежа и
paymentUrl. - Вы перенаправляете покупателяИспользуйте paymentUrl из ответа. Не встраивайте собственную форму ввода карты.
- NUMUS проверяет результатВозврат браузера на returnUrl не считается подтверждением оплаты.
- Вы получаете результатNUMUS отправляет
payment.completedпри успехе илиpayment.failedпри окончательном отказе.
Создать карточный платёж
https://api.numus.online/api/card
Запрос подписывается Ed25519. Добавьте уникальный
Idempotency-Key длиной 16–128 символов. При сетевом повторе
отправляйте то же тело и тот же ключ.
POST /api/card HTTP/1.1
Host: api.numus.online
Authorization: {"partnerID":"partner-001","key":"ssh-ed25519 ...","sign":"...","timestamp":"1784912400","nonce":"..."}
Idempotency-Key: card-order-2026-00042
Content-Type: application/json
{
"orderID": "order-2026-00042",
"amount": 1250.50,
"currency": "RUB",
"description": "Заказ №42",
"customerID": "customer-381",
"returnUrl": "https://merchant.example/orders/42/payment-result",
"savePaymentMethod": false
}
Поля запроса
| Поле | Правило |
|---|---|
paymentPointID | Необязателен при одной активной точке. При нескольких выберите точку из подписанного GET /api/integration/payment-points. |
orderID | Ваш уникальный номер заказа: латинские буквы, цифры, точка, подчёркивание, двоеточие или дефис; до 64 символов. |
amount | Сумма в рублях, больше нуля, не более двух знаков после точки и в пределах лимитов маршрута. |
currency | Сейчас только RUB. |
description | Назначение платежа, до 140 символов. |
customerID | Стабильный идентификатор покупателя в вашей системе; до 128 символов. |
returnUrl | Необязательный адрес для этого заказа. Можно изменить path и query только на сохранённом HTTPS-домене. |
savePaymentMethod | true, если нужно сохранить карту. Согласие покупатель подтверждает на странице NUMUS. |
Успешный ответ — 201 Created:
{
"id": "0190c5ad-2f51-7b1d-9f2e-e0a01d8f9a21",
"orderID": "order-2026-00042",
"amount": 1250.5,
"currency": "RUB",
"status": "SUBMITTED",
"paymentUrl": "https://secure-payment.example/...",
"expiresAt": "2026-07-24T18:25:00Z",
"statusUrl": "/api/card/0190c5ad-2f51-7b1d-9f2e-e0a01d8f9a21"
}
paymentUrl, который
вернул NUMUS. Не собирайте PAN, срок действия или CVV на своей стороне.
Сохранить карту для подписки
Привязка создаётся только через первичный платёж на защищённой форме.
NUMUS не принимает реквизиты карты в API. Передайте
savePaymentMethod: true и период будущих списаний:
{
"orderID": "initial-subscription-381",
"amount": 100.00,
"currency": "RUB",
"description": "Подтверждение способа оплаты",
"customerID": "customer-381",
"savePaymentMethod": true,
"recurringConsent": {
"period": "P1M"
}
}
Период списаний
| Значение | Не чаще чем |
|---|---|
PT1M | Один раз в 60 секунд |
PT1H | Один раз в 60 минут |
P1D | Один раз в 24 часа |
P1W | Один раз в семь дней |
P1M | Один раз в календарный месяц |
P1Y | Один раз в календарный год |
Для PT1M отсчитываются 60 секунд, для PT1H —
60 минут от последнего успешного списания. Не путайте
PT1M (минута) и P1M (календарный месяц).
Календарные периоды рассчитываются в UTC с сохранением времени суток.
Если в следующем месяце нет исходного числа, используется последний
день этого месяца.
paymentUrl. NUMUS покажет
получателя, сумму первого платежа и период, зафиксирует подтверждение,
а затем откроет защищённый ввод карты. Вашему интерфейсу не требуется
отдельный экран согласия. Сохранённый период возвращается в
GET /v1/bindings/{bindingId} и событии
binding.created.
Согласие на вашей странице
После отдельного включения NUMUS вы можете показать согласие в своём
интерфейсе и сразу отправить покупателя на защищённый ввод карты — без
промежуточной страницы NUMUS. Добавьте capture: MERCHANT
и передайте доказательство согласия:
"recurringConsent": {
"capture": "MERCHANT",
"reference": "consent-381-2026-08-01",
"version": "numus-recurring-consent-ru-v1",
"acceptedAt": "2026-08-01T12:00:00Z",
"period": "P1M",
"evidenceHash": "SHA-256 точного текста согласия"
}
evidenceHash — SHA-256 в lowercase hex от точного UTF-8
текста и условий, показанных покупателю. Сохраните этот текст, время и
собственное доказательство действия покупателя. Галочка не должна быть
отмечена заранее. Если capture не передан, продолжает
работать стандартная страница NUMUS.
Не ждите состояния SUBMITTED перед перенаправлением. Для
новой привязки первый ответ обычно содержит status: CREATED
вместе с paymentUrl. Если ответ потерян, повторите тот же
запрос с прежним Idempotency-Key или запросите
statusUrl: пока согласие не подтверждено, оба способа
возвращают ту же подписанную ссылку NUMUS.
Покупатель завершает первичный платёж по paymentUrl.
После подтверждения в ответе статуса появляется NUMUS
bindingId. Этот идентификатор можно хранить; внутренний
токен карты клиенту не передаётся.
В согласии указывается только период, без суммы будущих списаний.
Первичная успешная оплата считается первым списанием. Период действует
на bindingId целиком. Привязка — сохранённый способ оплаты
конкретного покупателя и его согласие. Одну привязку можно использовать
для нескольких подписок, но
все они делят один общий интервал. Разные проекты, номера заказов и
ключи идемпотентности не позволяют списать несколько раз за период.
Чтобы изменить период, отзовите привязку и создайте новую с новым
согласием покупателя.
customerID должен быть стабильным и уникальным внутри
вашей системы. Привязку другого партнёра API всегда возвращает как
несуществующую.
Выполнить повторное списание
https://api.numus.online/v1/recurring-payments
POST /v1/recurring-payments HTTP/1.1
Host: api.numus.online
Authorization: {подписанный JSON}
Idempotency-Key: subscription-381-2026-08
Content-Type: application/json
{
"merchantOrderId": "subscription-381-2026-08",
"amount": "399.00",
"currency": "RUB",
"bindingId": "0190c5d1-0f08-7fc1-b3e8-a8c4ce278977",
"description": "Подписка за август 2026"
}
Сумма передаётся строкой с двумя знаками после точки. Новый платёж
получает новый merchantOrderId и
Idempotency-Key. Сетевой повтор использует прежние
значения и неизменное тело.
NUMUS принимает команду только после nextChargeAt. Пока
предыдущее списание имеет статус CREATED,
SUBMITTED или PENDING, новая команда по той
же привязке также блокируется.
Если срок действия сохранённой карты закончился, NUMUS не отправляет
команду списания в платёжный канал и переводит привязку в
EXPIRED. Покупателю потребуется выполнить новый первичный
платёж и сохранить действующую карту. Старый bindingId
повторно не используется.
HTTP/1.1 409 Conflict
Content-Type: application/json
{
"error": "recurring period has not elapsed",
"nextChargeAt": "2026-08-25T15:00:00Z"
}
{
"paymentId": "0190c5d4-25a4-770d-8464-d1a4fb437139",
"merchantOrderId": "subscription-381-2026-08",
"status": "SUBMITTED",
"amount": "399.00",
"currency": "RUB",
"paymentMethod": "CARD_BINDING",
"experience": "OFF_SESSION",
"bindingId": "0190c5d1-0f08-7fc1-b3e8-a8c4ce278977",
"createdAt": "2026-08-01T09:00:00Z",
"statusUrl": "/api/card/0190c5d4-25a4-770d-8464-d1a4fb437139"
}
Получить или отозвать привязку
https://api.numus.online/v1/bindings?customerId=customer-381
Список содержит NUMUS bindingId, период,
lastChargedAt, nextChargeAt, статус и маску
карты. Маска и срок могут отсутствовать, если
платёжный канал их не подтвердил. Данные другого партнёра не
возвращаются.
Статус EXPIRED означает, что срок действия сохранённой
карты завершился. Для дальнейших повторных списаний создайте новую
привязку через первичный платёж; менять формат API-запросов не нужно.
{
"bindingId": "0190c5d1-0f08-7fc1-b3e8-a8c4ce278977",
"customerId": "customer-381",
"status": "ACTIVE",
"consentId": "0190c5d0-6444-7e51-9419-c1ce2f5e1760",
"period": "P1M",
"lastChargedAt": "2026-07-25T15:00:00Z",
"nextChargeAt": "2026-08-25T15:00:00Z",
"createdAt": "2026-07-25T15:00:00Z"
}
За один запрос возвращается до 100 записей. Если
nextPageToken не равен null, передайте его
неизменным в параметре pageToken следующего запроса.
Токен подписан NUMUS и действует только для того же клиента,
покупателя и фильтра статуса.
https://api.numus.online/v1/bindings/{bindingId}/revoke
Добавьте новый Idempotency-Key. После ответа
202 статус становится REVOKED, и NUMUS больше
не принимает списания по этой привязке.
Проверить статус
https://api.numus.online/api/card/{id}
Метод также подписывается Ed25519. Для GET тело пустое, поэтому в канонической строке используется SHA-256 пустого тела. Основной сигнал об успешной оплате — callback; GET нужен для восстановления состояния.
| Статус | Что означает | Действие |
|---|---|---|
CREATED | Команда сохранена, регистрация ещё не закончена | Повторить исходный POST с тем же Idempotency-Key |
SUBMITTED, PENDING | Заказ зарегистрирован, ожидается действие покупателя или результат | Ждать callback; при необходимости читать statusUrl |
COMPLETED | Сумма и валюта подтверждены, платёж записан в финансовый журнал | Отгрузить заказ один раз |
REJECTED | Платёж отклонён или отменён | Создать новый платёж с новым orderID и Idempotency-Key |
EXPIRED | Срок платёжной сессии закончился | Создать новый платёж |
Что не должно попадать в NUMUS
- полный номер карты или PAN;
- CVV/CVC и срок действия;
- данные 3-D Secure;
- логины, пароли и другие платёжные секреты.
Покупатель вводит карточные данные только на странице из
paymentUrl. Ваш backend и NUMUS API их не принимают.
Ошибки карточного метода
| Код | Причина | Что делать |
|---|---|---|
400 | Неверное поле, сумма или валюта | Исправить запрос; не менять Idempotency-Key до выяснения причины |
401 | Неверная подпись, время или повтор nonce | Проверить каноническую строку и часы backend |
404 | Точка или платёж не принадлежит партнёру | Проверить paymentPointID, id и окружение |
409 | Период ещё не истёк, прошлое списание не завершено или Idempotency-Key связан с другим запросом | Использовать nextChargeAt; сетевой повтор отправлять только с исходным ключом и телом |
503 | Карточный маршрут временно недоступен | Обратиться в поддержку NUMUS; менять запрос не нужно |