Сплит-платеж
Обзор
При проведении платежей может возникнуть необходимость сделать сплит платежа — распределить его сумму на несколько балансов. Например, такая возможность нужна при работе агрегатора или онлайн-платформы, которые сотрудничают со множеством партнеров — для выделения в платеже доли дохода самого агрегатора, доли его партнера и выплаты оставшейся суммы исполнителю (курьеру, репетитору, водителю такси и т. п.). Использование сплит-платежа гибко автоматизирует процесс распределения денежных средств между всеми участниками и облегчает взаиморасчеты: после оплаты сервиса или услуги клиентом агрегатора платеж сразу же распределяется между балансами всех сторон. Чтобы проводить платежи с такими особенностями, платежная платформа предоставляет возможность распределить сумму платежа между несколькими балансами. Далее рассказывается, как создавать запросы на сплит-платежи.
Возможность распределения суммы платежа поддерживается для разовых оплат в одну или две стадии с прямым использованием платежных карт. Информацию о методах, для которых поддерживается распределение суммы платежа, запрашивайте у своего курирующего менеджера JetPay.
Запрос
В зависимости от требуемой операции, запросы следует передавать на одну из указанных ниже конечных точек.
Конечная точка | Описание |
---|---|
/v2/payment/card/sale |
Запрос на списание средств со счета пользователя при оплате в одну стадию |
/v2/payment/card/auth |
Запрос на предварительную блокировку средств на счете пользователя при оплате в две стадии |
/v2/payment/card/cancel |
Запрос на отмену блокировки средств на счете пользователя при оплате в две стадии |
/v2/payment/card/capture |
Запрос на списание заблокированных средств со счета пользователя при оплате в две стадии |
Чтобы распределить сумму платежа между несколькими балансами, в запросе, помимо обязательных параметров, нужно добавить описанные в следующей таблице параметры в объектах rewards
и account
.
|
||||
---|---|---|---|---|
Объект | Параметр | Описание | ||
rewards |
reward_amount |
Доход партнера — сумма, которая заносится на баланс партнера. Значение должно быть больше или равно нулю. Пример: |
||
income_amount |
Доход агрегатора — сумма, которая заносится на баланс агрегатора. Значение должно быть больше или равно нулю. Пример: |
|||
account |
number |
Номер телефона исполнителя, к которому привязан его аккаунт. На этот аккаунт будет перечислена сумма платежа за вычетом доходов агрегатора и партнера. Пример: |
Далее указаны примеры запросов при оплате в одну и две стадии с выделенным объектом, содержащим информацию для сплит-платежа.
Рис.: Пример запроса для оплаты в одну стадию с использованием сплит-платежа
{ "general": { "project_id": 123, "payment_id": "payment_47", "signature": "ktILmxlh6Yxm+U1jR52DnxnF\/bXbgecVXlulASc7Il738fWQ2q9qL9uR==" }, "customer": { "id": "customer_123", "ip_address": "198.51.100.47", "first_name": "John", "last_name": "Doe", "email": "johndoe@example.com", "phone": "+79876543210" }, "rewards": { // объект с информацией о сплит-платеже "reward_amount": 20000, "income_amount": 10000 }, "payment": { "amount": 100000, "currency": "KZT" }, "account": { "number": "+71234567890" }, "card": { "pan": "1234567890123456", "year": 2026, "month": 2, "card_holder": "John Doe", "cvv": "123" }, "return_url": { "success": "http://example.com/success", "decline": "http://example.com/decline", "return": "http://example.com/return" } }
Рис.: Пример запроса для списания средств при оплате в две стадии с использованием сплит-платежа
{ "general": { "project_id": 123, "payment_id": "payment_47", "signature": "YlA+RIbwvmvjowWJ1tphqBstszAPpq0OIWvrg65nk1EoH6lkt3MWVMA7I/HyDx==" }, "customer": { "id": "customer_123", "ip_address": "198.51.100.47", "first_name": "John", "last_name": "Doe", "email": "johndoe@example.com", "phone": "+79876543210" }, "rewards": { // объект с информацией о сплит-платеже "reward_amount": 20000, "income_amount": 10000 }, "payment": { "amount": 100000, "currency": "KZT" }, "account": { "number": "+71234567890" } }
Сплит-платеж с распределением суммы на разные балансы выполняется следующим образом. При запросе в рамках одностадийной оплаты или на втором этапе двухстадийной оплаты вместе с конечной суммой передаются данные о доходе агрегатора и сумме выплат партнеру, оставшаяся сумма — выплата исполнителю. Это можно описать следующей формулой:
Выплата исполнителю = Сумма платежа − Доход партнера − Доход агрегатора
1 000,00 KZT
. Тогда: - Доход партнера составит
200,00 KZT
, - Доход агрегатора равен
100,00 KZT
, - Выплата исполнителю равна
700,00 KZT
(1000 − 100 − 200).
Информация об этих операциях передается агрератору в оповещениях, структура которых описана далее.
Возврат
Для сплит-платежей доступна процедура возврата. Возврат средств пользователю может производиться по разным сценариям в зависимости от баланса (или балансов), с которого будут списываться средства, и того, какую часть платежа требуется вернуть. При возврате всей суммы сплит-платежа могут задействоваться оба сценария. Далее подробнее описаны доступные сценарии.
Возврат по Сценарию 1
Сценарий 1 подразумевает возврат средств пользователю за счет списания средств с балансов агрегатора и партнера. В этом случае используется стандартная процедура возврата, подробнее о которой см. Возврат средств после оплаты. Этот сценарий позволяет вернуть комиссию агрегатора или партнера, а также сумму, выплаченную исполнителю — если списать ее с баланса исполнителя невозможно.
Далее представлена информация, необходимая для создания и отправки запроса на возврат средств пользователю путем списания средств с баланса агрегатора (сценарий 1).
HTTP-метод запроса | POST |
Формат тела запроса | JSON |
Конечная точка | /v2/payment/card/refund |
Полная спецификация конечной точки | /v2/payment/card/refund |
|
|||
---|---|---|---|
Объект | Параметр | Описание | |
general |
project_id |
Идентификатор проекта, полученный от JetPay при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, по которому необходимо выполнить возврат. Пример: |
||
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Использование подписи к данным. | ||
customer |
id |
Идентификатор пользователя, уникальный в рамках проекта. Пример: |
|
ip_address |
IP-адрес устройства пользователя. Пример: |
||
first_name |
Имя пользователя. Пример: |
||
last_name |
Фамилия пользователя. Пример: |
||
email |
Адрес электронной почты пользователя. Пример: |
||
payment |
amount |
Сумма выплаты в дробных единицах валюты без десятичной точки и пробелов за исключением случаев, когда у валюты нет дробной части. Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц равно нулю), то в этом параметре нужно указывать сумму в основных единицах валюты. Подробнее о разрядах дробных единиц у валют см. Коды валют. Пример: |
|
currency |
Код валюты выплаты в формате ISO-4217 alpha-3. Пример: |
||
description |
Комментарий или описание возврата. Пример: |
||
При необходимости добавьте в запрос необязательные параметры, указанные в спецификации Gate: API Reference. |
Вот пример тела запроса на возврат за счет средств агрегатора (сценарий 1):
Рис.: Пример запроса на возврат за счет средств агрегатора (сценарий 1)
{ "general": { "payment_id": "payment_47", "project_id": 123, "signature": "8N9ZT4oDSHKbjhmNDYuompnSft7kcdQPL5Emfr4jrrWi2jqZ1aFIhLQ==" }, "customer": { "id": "customer_123", "ip_address": "198.51.100.47", "first_name": "John", "last_name": "Doe", "email": "johndoe@example.com" }, "payment": { "amount": 7000, "currency": "KZT", "description": "refund" } }
Возврат по Сценарию 2
Сценарий 2 подразумевает возврат средств пользователю за счет списания средств с баланса исполнителя. В этом случае с баланса списывается вся сумма, выплаченная исполнителю. Возврат может быть недоступен из-за недостатка средств на балансе исполнителя или из-за того, что истекло время блокировки средств в кошельке исполнителя. В таком случае агрегатор может инициировать повторный возврат по сценарию 1, а сумма, равная выплате исполнителю, спишется с баланса агрегатора. Время блокировки средств в кошельке исполнителя ограничено, но его можно изменять. Подробности уточняйте у вашего курирующего менеджера JetPay.
Далее представлена информация, необходимая для создания и отправки запроса на возврат средств пользователю за счет списания средств с баланса исполнителя (Сценарий 2).
HTTP-метод запроса | POST |
Формат тела запроса | JSON |
Конечная точка | /v2/payment/card/payout_refund |
|
|||
---|---|---|---|
Объект | Параметр | Описание | |
general |
project_id |
Идентификатор проекта, полученный от JetPay при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, по которому необходимо выполнить возврат. Пример: |
||
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Использование подписи к данным. | ||
customer |
id |
Идентификатор пользователя, уникальный в рамках проекта. Пример: |
|
ip_address |
IP-адрес устройства пользователя. Пример: |
||
first_name |
Имя пользователя. Пример: |
||
last_name |
Фамилия пользователя. Пример: |
||
email |
Адрес электронной почты пользователя. Пример: |
||
payment |
description |
Комментарий или описание возврата. Пример: |
|
При необходимости добавьте в запрос необязательные параметры, указанные в спецификации Gate: API Reference. |
Вот пример тела запроса на возврат за счет средств исполнителя (Сценарий 2):
Рис.: Пример запроса на возврат за счет средств исполнителя (Сценарий 2)
{ "general": { "project_id": 123, "payment_id": "payment_47", "signature": "VG8l/v4Up+hK0Tqy0GbY3E6gt6IaZHn7T3gR2g5ersnSK0GPuiAuqRf7==" }, "customer": { "id": "customer_123", "ip_address": "198.51.100.47", "first_name": "John", "last_name": "Doe", "email": "johndoe@example.com" }, "payment": { "description": "Refund operation" } }
Оповещение (callback)
Для оповещений о результатах выплат при выполнении сплит-платежа используется стандартный формат, описание которого представлено в разделе Оповещения (callbacks) в Gate.
Рис.: Пример оповещения об успешном проведении оплаты в одну стадию
{ "customer": { "id": "customer_123" }, "account": { "number": "123456******3456", "token": "3e08a2e6c16938ad3ae...ab32e6648f4ca8e9d549", "type": "visa", "id": 123456, "card_holder": "John Doe", "expiry_month": "02", "expiry_year": "2026" }, "project_id": 123, "payment": { "id": "payment_47", "type": "purchase", "status": "success", "date": "2025-01-17T10:54:07+0000", "method": "card", "sum": { "amount": 100000, "currency": "KZT" }, "description": "" }, "operation": { "sum_initial": { "amount": 100000, "currency": "KZT" }, "sum_converted": { "amount": 100000, "currency": "KZT" }, "code": "0", "message": "Success", "provider": { "id": 11451, "payment_id": "payment_47", "auth_code": "556764", "endpoint_id": 11451 }, "id": 28, "type": "sale", "status": "success", "date": "2025-01-17T10:54:07+0000", "created_date": "2025-01-17T10:54:04+0000", "request_id": "518dd5de58de0f660bd1d1cb0dc4a947f7a400...9ec26827" }, "signature": "4dL6PkYjtoGA09LByGbZaxdeFCl4MqtSnGNvLJVBiPvJXSUWjj0RV" }
Рис.: Пример оповещения о неуспешной оплате в одну стадию из-за недостатка средств на карте
{ "customer": { "id": "customer_123" }, "account": { "number": "123456******3456", "token": "2f192a181507193439...0ac902380d33db5087376", "type": "mastercard", "card_holder": "John Doe", "expiry_month": "05", "expiry_year": "2026" }, "project_id": 123, "payment": { "id": "payment_47", "type": "purchase", "status": "decline", "date": "2025-01-17T10:54:05+0000", "method": "card", "sum": { "amount": 100000, "currency": "KZT" }, "description": "" }, "operation": { "sum_initial": { "amount": 100000, "currency": "KZT" }, "sum_converted": { "amount": 100000, "currency": "KZT" }, "code": "10105", "message": "Insufficient funds on card", "provider": { "id": 15681, "payment_id": "payment_47", "auth_code": "", "endpoint_id": 15681 }, "id": 31, "type": "sale", "status": "decline", "date": "2025-01-17T10:54:05+0000", "created_date": "2025-01-17T10:54:01+0000", "request_id": "5b1ff18755b383e4d705f5f9f8c475a536856901...4b7cec9" }, "signature": "OSmZfuikSNs3q3MEnENf5l8gE08rXevGZdcRoUsQvghr2QJstoO0uV" }
Рис.: Пример оповещения об успешном проведении оплаты в две стадии
{ "payment": { "date": "2025-01-14T03:00:52+0000", "method": "card", "sum": { "amount": 100000, "currency": "KZT" }, "id": "payment_47", "type": "purchase", "status": "success", "description": "" }, "customer": { "id": "customer_123" }, "account": { "number": "12345678901234567", "token": "4770f7cbda8d43da43b9a...26813a75dbd76906527fb95", "type": "visa", "id": 1234567890, "card_holder": "John Doe", "expiry_month": "12", "expiry_year": "2029" }, "project_id": 123, "card_country": "KZ", "operation": { "provider": { "id": 10771, "payment_id": "payment_47", "auth_code": "", "endpoint_id": 10771 }, "id": 28, "type": "capture", "status": "success", "date": "2025-01-14T03:00:52+0000", "sum_initial": { "amount": 100000, "currency": "KZT" }, "created_date": "2025-01-14T03:00:47+0000", "request_id": "17b2b4c9aa1f41374c2ee6db4a8803e7c141b114...28a044ad96bd", "sum_converted": { "amount": 100000, "currency": "KZT" }, "code": "0", "message": "Success" }, "signature": "N4lFW+DKlTL4/FxwCntMfZBHwr2EMP7GwOkwKS5SazFOqgb6BSgGGp+AX" }
Рис.: Пример оповещения о неуспешной оплате из-за недостатка средств на карте
{ "payment": { "date": "2025-01-02T10:06:39+0000", "method": "card", "sum": { "amount": 100000, "currency": "KZT" }, "id": "payment_47", "type": "purchase", "status": "decline", "description": "" }, "customer": { "id": "customer_123" }, "account": { "number": "123456******3456", "token": "d9ff53c30a1575dc166a95...5611afb172df53493c6", "type": "visa", "card_holder": "John Doe", "expiry_month": "09", "expiry_year": "2030" }, "project_id": 123, "card_country": "KZ", "operation": { "provider": { "id": 15681, "payment_id": "payment_47", "auth_code": "", "endpoint_id": 15681 }, "id": 31, "type": "auth", "status": "decline", "date": "2025-01-02T10:06:39+0000", "sum_initial": { "amount": 100000, "currency": "KZT" }, "created_date": "2025-01-02T10:06:36+0000", "request_id": "58ee05b37d847cda1c98f67bc824510962ddeea579b...88c92a833e4f0c75ec92", "sum_converted": { "amount": 100000, "currency": "KZT" }, "code": "10105", "message": "Insufficient funds on card" }, "signature": "0pcxo1NMe7aW4Aq15pw4ke0HerCi+lLo2OUuPm41SgnYP+wgUqO/a8qS4vkOI/8QTV" } }
Рис.: Пример оповещения об успешном возврате за счет средств с баланса агрегатора (сценарий 1)
{ "payment": { "date": "2025-01-25T12:43:35+0000", "method": "qckwallet", "sum": { "amount": 0, "currency": "KZT" }, "id": "payment_48", "type": "payout", "status": "refunded", "associated_payment_id": "payment_47", "description": "" }, "customer": { "id": "customer_123" }, "account": { "number": "+7123456789" }, "project_id": 123, "operation": { "provider": { "id": 22652, "payment_id": "", "auth_code": "" }, "id": 58988010158936, "type": "payout refund", "status": "success", "date": "2025-01-25T12:43:35+0000", "sum_initial": { "amount": 1000, "currency": "KZT" }, "created_date": "2025-01-25T12:43:32+0000", "request_id": "d45942fe5d913aa94ddd42226118d08bc98e6882-b...36609b7574a5-00058989", "sum_converted": { "amount": 1000, "currency": "KZT" }, "code": "0", "message": "Success" }, "signature": "pE/Gsxb8PH9Y6fS6IiL3YqOsoz7FEUjg/4Ho54pg16ZtoRi...LZ4LoK8UqMtNCc/MrJvQ==" }
Рис.: Пример оповещения об успешном возврате за счет средств с баланса исполнителя (сценарий 2)
{ "payment": { "date": "2025-01-27T08:54:20+0000", "method": "card", "sum": { "amount": 0, "currency": "KZT" }, "id": "payment_47", "type": "purchase", "status": "refunded", "description": "" }, "customer": { "id": "customer_123" }, "account": { "number": "123456******3456", "token": "87e2dd36d9460b8c83bbf9b28bba496de0eafa28b8993271c9e2174eb587ecc5", "type": "visa", "id": 1234567890, "card_holder": "John Doe", "expiry_month": "09", "expiry_year": "2027" }, "project_id": 123, "card_country": "KZ", "operation": { "provider": { "id": 15681, "payment_id": "payment_47", "auth_code": "211296", "endpoint_id": 15681 }, "id": 39249010129186, "type": "refund", "status": "success", "date": "2025-01-27T08:54:21+0000", "sum_initial": { "amount": 7000, "currency": "KZT" }, "created_date": "2025-01-27T08:54:07+0000", "request_id": "18f13a6f126c77b05af0c7a54586d793a2cbe041-435c0...c053bc752a0b-00039250", "sum_converted": { "amount": 7000, "currency": "KZT" }, "code": "0", "message": "Success" }, "signature": "NBWjBbzZQFqvcHOC3sTF9AcN6kN03ehMV4qK69iP7PEEjMoXUMJL...OO5RoNycEGQk5hespQ==" }