К содержимому
Инвойсбокс
post/v3/billing/api/payment/confirm

Рекуррентные платежи

При оплате заказа физическим лицом есть возможность применить рекуррентные платежи. Это позволит сохранить токен банковской карты пользователя, для последующего списания с неё средств без участия клиента, например, для списания средств по подписке.

Почему для организаций регулярность устроена иначе

Списание по сохранённой карте работает, и дело не в поддержке. Владелец карты — всегда физическое лицо: даже корпоративная карта оформлена на сотрудника. Значит расход ложится на человека, и потом ему отчитываться перед бухгалтерией — сохранить чек, обосновать трату, приложить её к отчёту. Для регулярных корпоративных расходов это неудобно, и чем больше сотрудников, тем неудобнее.

Поэтому организациям и ИП адресована подписка — шаблон платежа: правила, по которым покупателю уходит счёт. Правило задаёт период, конкретный день или условие — например, снижение баланса до порога. Дальше есть два пути:

  • заказы создаёт ваша система — по своему расписанию вызывает создание заказа, и счёт уходит покупателю как обычно;
  • заказ-подписка — создаётся один раз с параметрами периода и условий, клиент подписывается на неё, и счета приходят ему в нужное время без новых вызовов с вашей стороны.

Счёт по подписке доходит покупателю привычным каналом: письмом, ссылкой или Запросом о платеже в приложение банка.

Примечание

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

Привязка карты

Схема получения токена карты

sequenceDiagram autonumber participant Покупатель participant Магазин participant Инвойсбокс rect rgba(43, 170, 93, 0.13) Магазин->>Инвойсбокс: Вызов метода создания заказа Инвойсбокс->>Магазин: Идентификатор заказа и ссылка на оплату Магазин->>Покупатель: Перенаправление на платёжную страницу Покупатель->>Инвойсбокс: Подтверждение оплаты счёта Инвойсбокс->>Покупатель: Перенаправление покупателя на сайт магазина Инвойсбокс->>Магазин: Уведомление об успешной оплате и токен карты Магазин-->>Инвойсбокс: Вызов метода отгрузки для разблокировки средств end
  1. Магазин создает в системе Инвойсбокс заказ через метод API с указанием параметров savePaymentData и clientId.
  2. Система возвращает ссылку на платёжную страницу для оплаты заказа.
  3. Магазин перенаправляет покупателя по полученной ссылке.
  4. Покупатель заполняет необходимые для оплаты сведения подтверждает оплату.
  5. Система Инвойсбокс перенаправляет покупателя обратно на сайт Магазина.
  6. Система Инвойсбокс оповещает Магазин об успешной оплате заказа с указанием токена.
  7. Магазин сохраняет и привязывает полученный токен к пользователю.
  8. Магазин передаёт в систему Инвойсбокс информацию об отгрузке через метод API для разблокировки средств.

Создание заказа

Карта привязывается к покупателю в момент оплаты: создайте заказ с такими параметрами —

  • savePaymentData, clientId, paymentMethodCode paymentMethodAutosubmit в invoiceSetting

Если заказ нужен только для привязки карты, включите режим холдирования средств — подтип заказа subtype = hold, — чтобы затем разблокировать их.

Для оплаты товаров и услуг, эту опцию так же можно использовать, если этого требуют бизнес-процессы.

Пример:

{
  ....
  "subtype": "hold",
  "invoiceSetting": {
    "savePaymentData": true,
    "clientId": "client-12345",
    "paymentMethodCode":"acquiring",
    "paymentMethodAutosubmit": true
  }
}

Далее, клиента следует перенаправить на страницу оплаты по ссылке, полученной в параметре paymentUrl в ответе на запрос создания заказа.

После успешного холдирования (блокировки) средств, магазину будет направлено уведомление об оплате, в котром будет находится информация о платеже в объекте PaymentInfo, в том числе параметр paymentToken, который необходимо сохранить и привязать к плательщику (пользователю) для последующего проведения платежей.

Пример:

{
  ....
  "paymentInfo": {
    "paymentToken": "token-abc123",
    "cardholderName": "CARDHOLDER NAME",
    "expiration": "13/26",
    "maskedPan": "220071**6742",
    "paymentSystem": "MIR"
  }
}

Если заказ был инициирован только для привязки карты, то необходимо разблокировать средства, путём создания отгрузки с пустым набором basketItems и флагом final = true.

Важно

Для заказов, используемых только для привязки карты, рекомендуется использовать небольшие суммы заказа, например, до 1 рубля.

Подтверждение оплаты заказов с использованием токена

Теперь можно использовать сохранённый токен для подтверждения оплаты в последующих заказах. Для этого создаем заказ и получаем его идентификатор, а затем вызываем метод подтверждения платежа с указанием платёжного токена:

  • метод: POST
  • ресурс: /v3/billing/api/payment/confirm
  • тело запроса - объект ConfirmRequest
  • тело ответа - объект OrderResponse

ConfirmRequest

СвойствоТипОписаниеПример
orderId *stringИдентификатор заказа0193690f-a122-d2cd-ac46-9da9e848723c
type *string, enumТип подтверждения оплатыpaymentToken
paymentToken *stringПлатёжный токен карты клиентаcc11a4881764e0e02573f83c99811ed9

В случае успешной оплаты status заказа станет completed, а для подтипа holdhold. Статуса paid в контракте нет: оплаченным считается только completed (полный перечень — на странице работы с заказом).

Ошибки

При использовании метода могут возникнуть следующие ошибки:

Пример ошибки при попытке списания средств ошибочным токеном
{
  "error": {
    "message": "Ошибка списания средств",
    "code": "invalid_argument",
    "fields": []
  }
}
Пример ошибки при попытке списания средств по уже оплаченному заказу
{
  "error": {
    "message": "Заказ уже оплачен",
    "code": "already_paid",
    "fields": []
  }
}

Удаление привязанной карты

  • метод: POST
  • ресурс: /v3/processing/api/payment-token/delete
  • тело запроса - объект DeletePaymentTokenRequest

DeletePaymentTokenRequest

СвойствоТипОписаниеПример
clientId *stringИдентификатор клиентаclient-12345
paymentToken *stringПлатёжный токен карты клиентаcc11a4881764e0e02573f83c99811ed9

Пример ответа в случае успешного удаления

{
  "data": {},
  "extendedData": []
}
Пример ошибки удаления токена
{
  "error": {
    "message": "Неверное состояние связки",
    "code": "invalid_argument",
    "fields": []
  }
}
Пример ошибки, когда токен не найден
{
  "error": {
    "message": "Error",
    "code": "not_found",
    "fields": []
  }
}

Параметры запроса — POST

3 обязательных из 3
ПолеТипОписание
orderId *#string
type *#string
paymentToken *#string

Параметры запроса — POST

2 обязательных из 2
ПолеТипОписание
clientId *#string
paymentToken *#string
Страница помогла?
postОплата заказа без прохождения 3-D Secure аутентификацииДемо
curl -X POST 'https://api.invoicebox.ru/v3/billing/api/payment/confirm' \
  -H 'Authorization: Bearer <ВАШ_ТОКЕН>' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: MyApp 1.0' \
  -d '{
  "orderId": "string",
  "type": "service",
  "paymentToken": "string"
}'
Подтверждение платежа списывает деньги — на демо-контуре этот шаг делает платёжная страница.
postУдаляет сохранённый платёжный токен (paymentToken) для указанного клиента (clientId)Демо
curl -X POST 'https://api.invoicebox.ru/v3/processing/api/payment-token/delete' \
  -H 'Authorization: Bearer <ВАШ_ТОКЕН>' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: MyApp 1.0' \
  -d '{
  "clientId": "string",
  "paymentToken": "string"
}'
Удаление платёжного токена необратимо, а токены демо-магазина общие.