# Выплаты

# Выплаты на карту

ОБРАТИТЕ ВНИМАНИЕ!

Значение orderId должно быть уникальным в пределах успешных операций выплаты на карту.
В случае, если при отправке запроса на выплату вы не получили синхронный ответ с HTTP-кодом 200 и id операции, или же получили ответ с HTTP-кодом, отличным от 200 (например, 502 или 504) и хотите повторно запросить ту же самую выплату, необходимо использовать тот же самый номер orderId.
Таким образом в случае, если первоначальный запрос все-таки был завершен успешно, или находится в процессе, вы получите ответ с HTTP-кодом 400 и ошибкой "Duplicate order id", и повторная выплата произведена не будет. В случае, если первоначальный запрос завершен неуспешно - операция пройдет в стандартном режиме.

Следование данной инструкции позволит вам избежать задвоения операций по выплате на карту при возникновении любых сетевых проблем между сервером вашего приложения и сервером Mandarin.
Также рекомендуем вам выставить таймаут в 600 секунд при отправке запросов по API.

Например, первоначальный запрос на выплату содержал orderId, равный "5f2fdcf6-0b78-4dd7-be9f-212c7c058001".

Если она завершена успешно, то при повторном запросе на выплату с тем же значением orderId, в синхронном ответе будет возвращена ошибка. Выплата повторно создана не будет.

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Выплата с использованием токена карты

В рамках данного API вызова к стандартному вызову добавляется блок target, где в качестве значения card передается id ранее совершенной успешной токенизации полных карточных данных или номера карты.

Транзакция осуществляется в асинхронном режиме. В результате запроса вам синхронно придет id выплаты, а затем асинхронно придет callback-уведомление.

Параметр Обязателен Параметр Обязателен
payment Да target Да
payment.action Да target.card Да
payment.orderId Да customValues[] Нет
payment.price Да customValues[].name Нет

Синхронный ответ и асинхронное callback-уведомление могут содержать более широкий набор параметров по сравнению с примером.

Запрос

POST https://secure.mandarinpay.com/api/transactions
{
	"payment": {
		"action": "payout",
		"orderId": "your_unique_order_id",
		"price": "1000.00"
	},
	"customerInfo": {
		"email": "user@example.com",
		"phone": "+79001234567"
	},
	"target": {
		"card": "0eb51e74-e704-4c36-b5cb-8f0227621518"
	},
	"customValues": [
		{"name": "first parameter to save and show", "value": "p1"},
		{"name": "second parameter to save and show", "value": "p2"}
	],
	"metadata": {
		"first_parameter_to_callback_and_not_to_show": "p1",
		"second_parameter_to_callback_and_not_to_show": "p2"
	},
	"urls": {
		"callback": "http://...",
		"return": "http://..."
	}
}

Ответ в случае успешного создания транзакции (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725"
}

Ответ в случае, если транзакция не создана (400 Bad request)

{
	"error": "Invalid request"  
}

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Выплата с использованием номера карты

В рамках данного запроса к стандартному вызову добавляется блок target, где в качестве значения knownCardNumber передается номер карты, на которую осуществляется перевод.

Значение orderId должно быть уникальным в пределах успешных операций вывода средств. Если Вы не получили успешный callback и хотите повторно запросить ту же самую выплату, рекомендуем использовать тот же самый номер orderId. Это предотвратит дублирование выплаты, если первоначальная выплата была произведена, но успешный callback не дошел.

Транзакция осуществляется в асинхронном режиме. В результате запроса вам синхронно придет id выплаты, а затем асинхронно придет callback-уведомление.

Параметр Обязателен Параметр Обязателен
payment Да target Да
payment.action Да target.knownCardNumber Да
payment.orderId Да customValues[] Нет
payment.price Да customValues[].name Нет
customerInfo Да customValues[].value Нет
customerInfo.email Да metadata Нет
customerInfo.phone Да urls Нет

Синхронный ответ и асинхронное callback-уведомление могут содержать более широкий набор параметров по сравнению с примером.

Запрос

POST https://secure.mandarinpay.com/api/transactions
{
	"payment": {
		"action": "payout",
		"orderId": "your_unique_order_id",
		"price": "1000.00"
	},
	"customerInfo": {
		"email": "user@example.com",
		"phone": "+79001234567"
	},
	"target": {
		"knownCardNumber": "4012888888881881"
	},
	"customValues": [
		{"name": "first parameter to save and show", "value": "p1"},
		{"name": "second parameter to save and show", "value": "p2"}
	],
	"metadata": {
		"first_parameter_to_callback_and_not_to_show": "p1",
		"second_parameter_to_callback_and_not_to_show": "p2"
	},
	"urls": {
		"callback": "http://...",
		"return": "http://..."
	}
}

Ответ в случае успешного создания транзакции (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725"
}

Ответ в случае, если транзакция не создана (400 Bad request)

{
	"error": "Invalid request"  
}

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Выплата со вводом карты на платежной странице

Транзакция осуществляется в асинхронном режиме. В результате запроса вам синхронно придет id выплаты, а затем асинхронно придет callback-уведомление.

Параметр Обязателен Параметр Обязателен
payment Да customValues[] Нет
payment.action Да customValues[].name Нет
payment.orderId Да customValues[].value Нет
payment.price Да metadata Нет
customerInfo Да urls Нет
customerInfo.email Да urls.callback Нет
customerInfo.phone Да urls.return Нет

Синхронный ответ и асинхронное callback-уведомление могут содержать более широкий набор параметров по сравнению с примером.

Запрос

POST https://secure.mandarinpay.com/api/transactions
{
	"payment": {
		"action": "payout",
		"orderId": "your_unique_order_id",
		"price": "1000.00"
	},
	"customerInfo": {
		"email": "user@example.com",
		"phone": "+79001234567"
	},
	"customValues": [
		{"name": "first parameter to save and show", "value": "p1"},
		{"name": "second parameter to save and show", "value": "p2"}
	],
	"metadata": {
		"first_parameter_to_callback_and_not_to_show": "p1",
		"second_parameter_to_callback_and_not_to_show": "p2"
	},
	"urls": {
		"callback": "http://...",
		"return": "http://..."
	}
}

Ответ в случае успешного создания транзакции (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725",
	"userWebLink": "https://secure.mandarinpay.com/Pay?transaction=0eb51e74-e704-4c36-b5cb-8f0227621518"
}

Ответ в случае, если транзакция не создана (400 Bad request)

{
	"error": "Invalid request"  
}

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Выплаты через СБП

Система быстрых платежей (СБП) - сервис, который позволяет мгновенно переводить средства со счёта по номеру телефона получателя.

Особенности сервиса выплат СБП:

  • Для подключения сервиса выплат СБП необходимо направить запрос в Службу поддержки (opens new window) или клиентскому менеджеру;

  • Выплаты производятся с указанием номера телефона и ФИО получателя, либо без, а также выбора банка из списка банков;

  • Привязка данных, для последующих рекуррентных платежей и автосписаний по СБП в настоящий момент не предусмотрено.

# Получение списка банков

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

Авторизация - XAuth (opens new window).

Параметр Тип Обязателен Описание
bankName string Нет Наименование банка по которому необходимо проводить фильтрацию, можно указать неполное название, метод вернет все подходящие варианты. При фильтрации регистр игнорируется

Запрос на получение списка банков:

GET https://secure.mandarinpay.com/api/sbp/banks/

Ответ в случае успешного создания запроса:

{
    "banks": [
        {
            "bankId": "100000000111",
            "bankName": "Сбербанк",
            "bankBic": "044525225"
        },
        {
            "bankId": "100000000008",
            "bankName": "Альфа-Банк",
            "bankBic": "044525593"
        },
        {
            "bankId": "100000000010",
            "bankName": "Промсвязьбанк",
            "bankBic": "044525555"
        }
    ]
}

Запрос на получение определённого банка:

GET https://secure.stage.psp.io/api/sbp/banks?bankName=Сбербанк

Ответ в случае успешного создания запроса:

{
    "banks": [
        {
            "bankId": "100000000111",
            "bankName": "Сбербанк",
            "bankBic": "044525225"
        }
    ]
}

Если банки не найдены, то вернётся ответ:

{
    "banks": []
}

# Создание выплаты с ФИО

В рамках данного API вызова к стандартному вызову добавляется блок target, где в качестве значения sbp передаются параметры банка bankId и bankBic.

Транзакция осуществляется в асинхронном режиме. В результате запроса вам синхронно придет id выплаты, а затем асинхронно придет callback-уведомление.

Параметр Обязателен
customerInfo Да
customerInfo.phone Да
customerInfo.email Да
customerInfo.firstName Да
customerInfo.lastName Да
customerInfo.middleName Да, если в паспорте у получателя указано отчество
payment Да
payment.action Да
payment.orderId Да
payment.price Да
target Да
target.sbp Да
target.sbp.bankId Да
target.sbp.bankBic Да

Синхронный ответ и асинхронное callback-уведомление могут содержать более широкий набор параметров по сравнению с примером.

Запрос

POST https://secure.mandarinpay.com/api/transactions
{
    "customerInfo": {
        "phone": "+79111111111",
        "email": "test@test.com",
        "firstName": "Петр",
        "lastName": "Иванов",
        "middleName": "Сергеевич"
    },
    "payment": {
        "orderId": "your_unique_order_id",
        "price": "10.00",
        "action": "payout"
    },
    "target": {
        "sbp": {
            "bankId": "100000000111",
            "bankBic": "044525225"
        }
    }
}

Ответ в случае успешного создания транзакции (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725"
}

Ответ в случае, если транзакция не создана (400 Bad request)

{
	"error": "Invalid request"  
}

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Создание выплаты без ФИО

В рамках данного API вызова к стандартному вызову добавляется блок target, где в качестве значения sbp передаются параметры банка bankId и bankBic.

Транзакция осуществляется в асинхронном режиме. В результате запроса вам синхронно придет id выплаты, а затем асинхронно придет callback-уведомление.

Выплаты без ФИО требуют подтверждения или отмены после создания транзакции и получения от банка успешного статуса.

Параметр Обязателен
customerInfo Да
customerInfo.phone Да
customerInfo.email Да
payment Да
payment.action Да
payment.orderId Да
payment.price Да
target Да
target.sbp Да
target.sbp.bankId Да
target.sbp.bankBic Да

Синхронный ответ и асинхронное callback-уведомление могут содержать более широкий набор параметров по сравнению с примером.

Запрос

POST https://secure.mandarinpay.com/api/transactions
{
    "customerInfo": {
        "phone": "+79111111111",
        "email": "test@test.com"
    },
    "payment": {
        "orderId": "your_unique_order_id",
        "price": "10.00",
        "action": "payout"
    },
    "target": {
        "sbp": {
            "bankId": "100000000111",
            "bankBic": "044525225"
        }
    }
}

Ответ в случае успешного создания транзакции (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725"
}

Ответ в случае, если транзакция не создана (400 Bad request)

{
	"error": "Invalid request"  
}

Ответ в случае попытки создания выплаты с уже существующим значением orderId (400 Bad Request)

{
    "error": "Duplicate order id 5f2fdcf6-0b78-4dd7-be9f-212c7c058001 found for incomplete payout transaction",
    "errorCode": -2
}

# Проверка статуса запроса без ФИО

Запрос на проверку статуса

После создания выплаты без ФИО необходимо проверить статус, подтвердить выплату возможно будет только после того, как статус будет success.

POST https://secure.mandarinpay.com/api/sbp/43913ddc000c4d3990fddbd3980c1725/status

Ответ в случае успешного создания транзакции (200 ОК)

{
    "status": "success",
    "fio": "Петр Иванович С."
}

Ответ в случае ожидания проверки получателя банком

{
    "status": "pending",
    "fio": null
}

# Подтверждение выплаты без ФИО

Запрос на подтверждение выплаты

После получения успешного статуса необходимо подтвердить выплату, чтобы получателю ушли средства.

POST https://secure.mandarinpay.com/api/sbp/43913ddc000c4d3990fddbd3980c1725/confirm

Ответ в случае успешного подтверждения выплаты (200 ОК)

# Отмена выплаты без ФИО

Выплату можно отменить, если еще не был отправлен запрос на подтверждение confirm.

Запрос на отмену выплаты

POST https://secure.mandarinpay.com/api/sbp/43913ddc000c4d3990fddbd3980c1725/reject

Ответ в случае успешной отмены выплаты (200 ОК)

{
	"id": "43913ddc000c4d3990fddbd3980c1725"
}

# Проверка баланса для выплат

Данный запрос позволяет проверить баланс счета, с которого осуществляются массовые выплаты.

Запрос

GET https://secure.mandarinpay.com/api/account/channels/{name}/balance

В качестве значения {name} необходимо передать параметр из таблицы ниже:

Параметр Описание параметра
openbank_direct Для запроса баланса расчетного счета, открытого в ПАО Банк «ФК Открытие» (Открытие)
psb_direct Для запроса баланса расчетного счета, открытого в ПАО Промсвязьбанк (ПСБ)

Пример кода для проверки баланса

<?php
$merchantId=0;

$secret='******';

$reqid = time() ."_". microtime(true) ."_". rand();
$hash = hash("sha256", $merchantId ."-". $reqid ."-". $secret);
$auth= $merchantId ."-".$hash ."-". $reqid;

$url_transaction = "https://secure.mandarinpay.com/api/account/channels/openbank_direct/balance";
$ch = curl_init($url_transaction);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
 "Content-Type: application/json",
 "X-Auth:" . $auth
));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

var_dump($result);
?>

# Получение статуса транзакции

Метод API дает возможность по идентификатору операции получить её статус, а также информацию о карте.

Авторизация - XAuth (opens new window).

Запрос: operationId - id платежа (opens new window).

GET https://secure.mandarinpay.com/api/operations/{operationId}

Пример ответа:

{
    "operationType": "Transaction",
    "state": "Success",
    "card": {
        "cardNumber": "519261XXXXXX3242",
        "cardHolder": "CARD HOLDER",
        "expireDate": "25/01",
        "cardId": "a3a5c49e1385e5096d05075d636f7baf",
        "country": "TUR",
        "productName": "Standard Mastercard Card",
        "productCode": "MCS",
        "brand": "mastercard",
        "bank": "ODEA BANK A.S.",
        "cardType": "Credit"
    }
}

Параметры ответа:

Параметр Описание
operationType тип операции, транзакция/привязка
state Статус операции: success, failed, payout-only, pendingExecution/none/unknown - операция не завершена и находится в обработке (может потребоваться сверка с банком-эквайером). Только статус success однозначно указывает на успешность операции!
cardNumber маскированный номер карты
cardHolder держатель карты
expireDate срок действия карты
cardId уникальный хэш полного номера карты
country страна выпуска карты
productName карточный продукт/категория карты
productCode код карточного продукта/категории карт
brand платежная система карты
bank банк, выпустивший карту
cardType тип карты (дебетовая/кредитная)