Приватный
MPI
Проверка карты плательщика на участие в 3D-Secure

Схема работи API MPI
Формирование запроса к API при самостоятельной интеграции:
Пример использования SDK:
#!/bin/bash
PUBLIC_KEY='your_public_key'
PRIVATE_KEY='your_private_key'
API_URL='https://www.liqpay.ua/api/request'
JSON="{ 
	\"action\" : \"mpi\",
	\"version\" : 3,
	\"public_key\" : \"${PUBLIC_KEY}\", 
	\"phone\" : \"380950000001\", 
	\"amount\" : \"1\", 
	\"currency\" : \"USD\", 
	\"description\" : \"description text\", 
	\"order_id\" : \"order_id_1\", 
	\"card\" : \"4731195301524634\", 
	\"card_exp_month\" : \"03\", 
	\"card_exp_year\" : \"22\", 
	\"card_cvv\" : \"111\"
}"
# DATA is base64_encode result from JSON string
DATA=$(echo -n ${JSON} | base64)
# SIGNATURE is base64 encode result from sha1 binary hash from concatenate string ${PRIVATE_KEY}${DATA}${PRIVATE_KEY}
SIGNATURE=$(echo -n "${PRIVATE_KEY}${DATA}${PRIVATE_KEY}" | openssl dgst -binary -sha1 | base64)
# REQ is json response from liqpay
REQ=$(curl --silent -XPOST ${API_URL} --data-urlencode data="${DATA}" --data-urlencode signature="${SIGNATURE}")
echo "Result: ${REQ}"
$liqpay = new LiqPay($public_key, $private_key);
$res = $liqpay->api("request", array(
	'action'         => 'mpi',
	'version'        => '3',
	'phone'          => '380950000001',
	'amount'         => '1',
	'currency'       => 'USD',
	'description'    => 'description text',
	'order_id'       => 'order_id_1',
	'card'           => '4731195301524634',
	'card_exp_month' => '03',
	'card_exp_year'  => '22',
	'card_cvv'       => '111'
));
HashMap<String, String> params = new HashMap<String, String>();
params.put("action", "mpi");
params.put("version", "3");
params.put("phone", "380950000001");
params.put("amount", "1");
params.put("currency", "USD");
params.put("description", "description text");
params.put("order_id", "order_id_1"); 
params.put("card", "4731195301524634");
params.put("card_exp_month", "03");
params.put("card_exp_year", "22");
params.put("card_cvv", "111");
LiqPay liqpay = new LiqPay(PUBLIC_KEY, PRIVATE_KEY);
HashMap<String, Object> res = liqpay.api("request", params);    
System.out.println(res.get("status"));
  
liqpay = LiqPay(public_key, private_key)
res = liqpay.api("request", {
	"action"         : "mpi",
	"version"        : "3",
	"phone"          : "380950000001",
	"amount"         : "1",
	"currency"       : "USD",
	"description"    : "description text",
	"order_id"       : "order_id_1",
	"card"           : "4731195301524634",
	"card_exp_month" : "03",
	"card_exp_year"  : "22",
	"card_cvv"       : "111"
})
liqpay = Liqpay::Liqpay.new(
:public_key  => 'public_key',
:private_key => 'private_key'
)
res = liqpay.api("request", {
	:action         => "mpi",
	:version        => "3",
	:phone          => "380950000001",
	:amount         => "1",
	:currency       => "USD",
	:description    => "description text",
	:order_id       => "order_id_1",
	:card           => "4731195301524634",
	:card_exp_month => "03",
	:card_exp_year  => "22",
	:card_cvv       => "111"
})
LiqPay = liqpay:init(PublicKey, PrivateKey),
Res = liqpay:api("request", [
	{<<"action">>,         <<"mpi">>}, 
	{<<"version">>,        <<"3">>}, 
	{<<"phone">>,          <<"380950000001">>}, 
	{<<"amount">>,         <<"1">>}, 
	{<<"currency">>,       <<"USD">>}, 
	{<<"description">>,    <<"description text">>}, 
	{<<"order_id">>,       <<"order_id_1">>}, 
	{<<"card">>,           <<"4731195301524634">>}, 
	{<<"card_exp_month">>, <<"03">>}, 
	{<<"card_exp_year">>,  <<"22">>}, 
	{<<"card_cvv">>,       <<"111">>}
], LiqPay)
var LiqPay = require('liqpay');
var liqpay = new LiqPay(public_key, private_key);
liqpay.api("request", {
	"action"         : "mpi",
	"version"        : "3",
	"phone"          : "380950000001",
	"amount"         : "1",
	"currency"       : "USD",
	"description"    : "description text",
	"order_id"       : "order_id_1",
	"card"           : "4731195301524634",
	"card_exp_month" : "03",
	"card_exp_year"  : "22",
	"card_cvv"       : "111"
}, function( json ){
	console.log( json.status );
});
my $liqpay = Liqpay->new($public_key,$private_key);
my $res = $liqpay->api("request",
	{
	'action'         => 'mpi',
	'version'        => '3',
	'phone'          => '380950000001',
	'amount'         => '1',
	'currency'       => 'USD',
	'description'    => 'description text',
	'order_id'       => 'order_id_1',
	'card'           => '4731195301524634',
	'card_exp_month' => '03',
	'card_exp_year'  => '22',
	'card_cvv'       => '111'
	}
);
Init("my_public_key", "my_private_key")
Api("request", map[string]interface{}{
    "action": "mpi",
    "version": 3,
    "public_key": PublicKey,
    "phone": "380950000001",
    "amount": 1,
    "currency": "UAH",
    "description": "Test payment",
    "order_id": "order_id_1",
    "card": "4731195301524634",
    "card_exp_month": "03", 
    "card_exp_year": "22", 
    "card_cvv": "111",
})
Параметры для формирования data:
Основные
Parameter Required Type Description
version Required Number Версия API. Текущее значение - 3
public_key Required String Публичный ключ - идентификатор магазина. Получить ключ можно в настройках магазина
action Required String mpi
amount Required Number Сумма платежа.Например: 5, 7.34
card Required String Номер карты плательщика
card_cvv Required String CVV/CVV2
card_exp_month Required String Месяц срока действия карты плательщика. Например: 08
card_exp_year Required String Год срока действия карты плательщика. Например: 19
currency Required String Валюта платежа. Возможные значения: USD, EUR, RUB, UAH
description Required String Назначение платежа.
ip Required String IP клиента
order_id Required String Уникальный ID покупки в Вашем магазине. Максимальная длина 255 символов.
action_payment Optional String Параметр, определяющий тип платежа. Передать значение параметра action платежа, который будет проводиться после прохождение 3DS. Возможные значения: pay - платеж, hold - блокировка средств на счету отправителя, subscribe - регулярный платеж, paydonate - пожертвование, auth - предавторизация карты, p2p - перевод с карты на карту, p2pdebit - оплата с помощью p2p debit. Значение по умолчанию - pay
language Optional String Язык клиента ru, uk, en
sender_first_name Optional String Имя плательщика
sender_last_name Optional String Фамилия плательщика
threeDSInfo Required Object Дополнительные данные для проверки операции
Параметры 3DS 2.0 (Объект threeDSInfo)
notificationURL Required String Адрес, на который будет отправлен результат прохождения проверки.
URL для отправки CRes или сообщения об ошибке. Сообщение CRes отправляется от ACS эмитента через браузер держателя карты после прохождения проверки.
Максимальная длина 256 символов.
browserLanguage Required String Язык браузера плательщика.
Значение, представляющее язык браузера, в формате, определенном стандартом IETF BCP47. Возвращается свойством navigator.language браузера пользователя. Например, en-US.
Максимальная длина 8 символов.
threeDSRequestorURL Required String URL сайта, на котором выполняется оплата. Этот элемент предоставляет дополнительные данные 3-D Secure системе в случае возникновения проблемы и должен предоставить контактную информацию.
Максимальная длина 2048 символов.
browserScreenHeight Required String Общая высота экрана плательщика в пикселях. Возвращается свойством screen.height браузера пользователя.
Максимальная длина 6 символов.
browserColorDepth Required String Значение, представляющее битовую глубину цветовой палитры для отображения изображений в битах на пиксель. Возвращается свойством screen.colorDepth браузера пользователя.
Максимальная длина 2 символа.
Допустимые значения: 1 = 1 бит, 4 = 4 бита, 8 = 8 бит, 15 = 15 бит, 16 = 16 бит, 24 = 24 бит, 32 = 32 бит, 48 = 48 бит.
browserJavascriptEnabled Optional Boolean Параметр, сообщающий, может ли браузер плательщика исполнять JavaScript, по умолчанию true
browserJavaEnabled Optional Boolean Параметр, сообщающий, может ли браузер плательщика исполнять Java, по умолчанию false
browserScreenWidth Required String Общая ширина экрана плательщика в пикселях. Возвращается свойством screen.width браузера пользователя.
Максимальная длина 6 символов.
browserAcceptHeader Required String Точное значение HTTP accept заголовков, отправленных из браузера плательщика на ресурс, где выполняется оплата.
Максимальная длина 2048 символов.
Если значение заголовков будет длиннее 2048 символов, 3DS сервер обрежет лишнюю часть.
browserTZ Required String Смещение часового пояса между Гринвичем и местным временем плательщика, в минутах. Пример значений смещения часового пояса в минутах:
- если UTC –5 часов, то значение 300,
- если UTC +5 часов, то значение –300.
browserUserAgent Required String Точное содержание HTTP заголовка user-agent.
Максимальная длина 2048 символов.
Если значение заголовков будет длиннее 2048 символов, 3DS сервер обрежет лишнюю часть.
Пример ответа:
3DS 1.0
  {
    "status": "success",
    "mpi_req_pareq": "eJxVUe1OwjAUfRWyB1jbMWAjlybIjJI4J1454B/TlKuUsA+6zTCf3lvYRPvrnJN72tNz4XlrEZMn\n1I1FCSlWlfrgdnMvNX8fTyKAx7xwJOwmj/iQcIX2soUuRQ+9wNgPSWj1VV1xKUPlwt10Uowng8\nBNZRyNAuEyl4d2IRjfgI2FmGXGUovQ/jATtB0EWT17aVEQ+B9QQ7ld5fbui6rKWOoi4zcGv29OZSq\n9Rt10VhWGorn5oFdsq0ahyq6/2g2Mr15ad+S9ret0l34/LDhPk2Vw93o9A+YmYKNqlAEXEx4J\nMRBiOpMQ4p90kFlLpjkPhf00T0r0xPxOS/1Kgki3mupVxxOlbPQM8lkWNEGZfzGwS9zFrStW\n19RVvxNX7UlwbkPtiLGL0ETFgzsK6rbFur4T+7fsHPamnMg==",
    "mpi_req_md": "MGUyZDYxMjYDfhKOC00MDI2LWFhMWUOpDFJjNzIyMmDffShZjli",
    "mpi_req_url": "https://acs.bankname.com/mpi",
    "mpi_status": "Y"
  }
  
3DS 2.0 (статус C)
  {
    "result": "ok", 
    "mpi_status": "C", 
    "mpi_version": "2.0", 
    "mpi_form": "< form action = 'https://acs4.privatbank.ua/acs/creq' method = 'post' > < input type = 'hidden' name = 'creq' value = 'eyJhY3NUcmFuc0lEIjoiNDJlYmRkOWMtNzU0Zi00YzMwLTg5NDMtNDJhODQzMDY4ZTMwIiwibWVzc2FnZVR5cGUiOiJDUmVxIiwibWVzc2FnZVZlcnNpb24iOiIyLjEuMCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiZTc1YmEyOGItNjE0YS00NDE5LWFjMzQtNzkxZDlmMjkwZjE3IiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0=' / > < /form>", 
    "status": "success",
    "mpi_cres": null,
    "cres": null
  }
  
3DS 2.0 (статус A)
  {
    "result": "ok", 
    "mpi_status": "A", 
    "mpi_version": "2.0", 
    "mpi_form": "null", 
    "status": "success",
    "mpi_cres": "eyJhY3NUcmFuc0lEIjoiYTc1ZGYxZGYtZmRhZi00YzcyLTlkOTItYTM1NDUzMzEzODU1IiwibWVzc2FnZVR5cGUiOiJDUmVzIiwibWVzc2FnZVZlcnNpb24iOiIyLjEuMCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiYTQyNzQwNmUtZDlmOS00MmI2LTk5MDItOGQ2OTZjMGVkNjJjIiwidHJhbnNTdGF0dXMiOiJBIn0",
    "cres": "eyJhY3NUcmFuc0lEIjoiYTc1ZGYxZGYtZmRhZi00YzcyLTlkOTItYTM1NDUzMzEzODU1IiwibWVzc2FnZVR5cGUiOiJDUmVzIiwibWVzc2FnZVZlcnNpb24iOiIyLjEuMCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiYTQyNzQwNmUtZDlmOS00MmI2LTk5MDItOGQ2OTZjMGVkNjJjIiwidHJhbnNTdGF0dXMiOiJBIn0"
  }
  
Параметры ответа
Parameter Type Description
mpi_req_md String Параметр, необходимый для аутентификации отправителя на странице ACS
mpi_req_pareq String Параметр, необходимый для аутентификации отправителя на странице ACS
mpi_req_url String Адрес страницы банка-эмитента карты (ACS страница), на которую нужно перенаправить клиента для прохождения 3D-Secure
mpi_status String
Значения для 3DS версии 2.0:
Y, A - дополнительная проверка клиента не требуется,
C - требуется дополнительная проверка клиента,
N - не удалось верифицировать клиента. Не рекомендуется проведение платежа. Можно проверить клиента с помощью 3DS 1.0,
U – не удалось проверить карту на участие, перенаправление клиента для прохождения 3D-Secure не требуется.
Значения для 3DS версии 1.0:
N - карта не участвует, перенаправление клиента для прохождения 3D-Secure не требуется,
U - не удалось проверить карту на участие, перенаправление клиента для прохождения 3D-Secure не требуется,
Y - карта поддерживает сервис 3D-Secure и в параметре mpi_req_url будет присутствовать адрес страницы банка-эмитента, куда нужно будет передать параметры mpi_req_pareq и mpi_req_md методом POST в следующей форме:
<form name="MPIform" action='${mpi_req_url}' method="POST">
   <input type="hidden" name="PaReq" value='${mpi_req_pareq}'>
   <input type="hidden" name="MD" value='${mpi_req_md}'>
   <input type="hidden" name="TermUrl" value='${TermUrl}'>
</form>
  
где TermUrl – адрес страницы, на которую эмитент вернет ответ с параметрами PaRes и MD. Для проведения платежа с уже пройденным 3DS при создании платежа необходимо передать параметры mpi_pares и mpi_md, со значениями PaRes и MD, которые были получены от ACS банка-эмитента.
mpi_version String Возвращается в том случае, когда карта поддерживает 3DS версии 2.0. Значение "2.0".
mpi_form String Возвращается в том случае, когда карта поддерживает 3DS версии 2.0. Форма, на которую нужно отправить клиента для аутентификации. Зашифрованный результат проверки будет возвращен эмитентом на notificationURL в параметре cres. Для проведения платежа с уже пройденным 3DS при создании платежа необходимо передать параметр cres, со значением cres, которое было получено от банка-эмитента.
mpi_cres String Параметр, необходимый для аутентификации отправителя. Возвращается при получении статуса Y или N.
status String Статус платежа.
Возможные значения:
Конечные статусы платежа
failure Неуспешный платеж
success Успешный платеж