1.3. Прямой перевод средств
Введение
PAN to PAN |
Трансфер PAN to PAN происходит при перечеслении средств с одной банковской карты на другую с указанием карточных номеров (не ссылочных идентификаторов). |
PAN to RPI |
Трансфер PAN to RPI происходит при перечеслении средств с банковской карты с указанным номером карты на другую банковску карту с указанным ссылочным идентификатором. |
RPI to PAN |
Трансфер RPI to PAN происходит при перечеслении средств с банковской карты с указанным ссылочным идентификатором на другую банковску карту с указанным номером карты. |
RPI to RPI |
Трансфер RPI to RPI происходит при перечеслении средств с одной банковской карты на другую с указанием ссылочных идентификаторов карт (не номеров). |
deposit to PAN |
Трансфер deposit to PAN происходит при перечеслении средств с аккаунта Присоединящейся Стороны на банковскую карту с указанием номера карты. |
deposit to PRI |
Трансфер deposit to PRI происходит при перечеслении средств с аккаунта Присоединящейся Стороны на банковскую карту с указанием ссылочныго идентификатора карты. |
Сценарий Трансфера
Схема прохождения 3DS
Присоединяющаяся Cторона имлементирует шаги, указанные зелёным и фиолетовым цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с номером шага:
Сценарий оплаты без 3DS
Трансфер считается проведённым без прохождения 3DS (без 3DS аутентификации) при нижеприведённых условиях:
Note
Транзакции со статусом “unknown” могут показываться как транзакции прошедшие 3DS, так и как транзакции без прохождения 3DS. Детальнее о статусах транзакций см. Статусы.
3DS 2.x.0 Frictionless Flow
“Присоединяющаяся сторона имлементирует шаги, указанные зелёным цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с ИД шага:
Пример HTML страницы метода 3DS
Пример HTML страницы метода 3DS выполняет инициацию метода 3DS через технологию iframe и держит браузер Отправителя до тех пор, пока не будет закончен процесс 3DS на сервере Присоединяющейся стороны. После завершения процесса 3DS (также в следствие таймаута) Присоединяющаяся сторона следует шагам схемы прохождения процесса 3DS и перенаправляет браузер Отправителя на соответствующий URL-адрес (Challenge Flow или результат платежа). Обычно, значение таймаута равно 30 сек.
HTML страница метода 3DS состоит из следующих параметров:
Параметр |
Описание |
---|---|
tds-method-url-frame-3ds-method-url |
Присоединяющейся Стороной получен ACS URL метода 3DS в ответе на запрос статуса /api/v2/status/. |
tdsMethodUploadUrl |
URL Присоединяющейся Стороны, в котором результат транзакции идет после процесса. |
threeDSMethodData |
Значение JSON содержит threeDSServerTransID и threeDSMethodNotificationURL. Как построить threeDSMethodData см. ниже. |
Построение threeDSMethodData
Для построения threeDSMethodData Присоединяющаяся Сторона использует следующие параметры.
Параметр |
Описание |
---|---|
threeDSServerTransID |
Уникальный идентификационный номер, присвоенный транзакции сервером 3DS для идентификации одной транзакции.
Он приходит в ответе /api/v2/status/ в значении параметра tds-method-url-frame-3ds-server-trans-id.
|
threeDSMethodNotificationURL |
URL, на который будет приходить уведомление от ACS о завершении 3DS метода. threeDSMethodNotificationURL предоставляет Присоединяющаяся Сторона. При получении любого запроса на данный URL, Присоединяющаяся Сторона возвращает HTML страницу окончания 3DS (см. примеры ниже). |
Пример построения threeDSMethodData
Построение threeDSMethodData JSON.
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://connectingparty.com/3ds-method-complete/"}
Необходимо закодировать JSON в кодировку base64 url.
eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiIsInRocmVlRFNNZXRob2ROb3RpZmljYXRpb25VUkwiOiJodHRwczovL21lcmNoYW50LmNvbS8zZHMtbWV0aG9kLWNvbXBsZXRlLyJ9
Генерация цифрового отпечатка
Процесс 3DS может быть использован банком-эмитентом для сбора цифрового отпечатка браузера (fingerprint), используя JavaScript. Это осуществляется загрузкой URL на скрытый iframe до процесса аутентификации. Данный iframe использует JavaScript код, имплементирующий процесс сбора цифрового отпечатка браузера, перед отправкой POST-запроса на заранее указанный URL-адрес, принадлежащий запрашивающей стороне. Результат сбора цифрового отпечатка в процессе 3DS строго привязан к аутентификации threeDSServerTransID.
function gatherBrowserData() {
var colorDepth = screen.colorDepth; // 24
var javaEnabled = navigator.javaEnabled(); // true
var browserLanguage = navigator.language; // en_US
var screenHeight = screen.height; // 1080
var screenWidth = screen.width; // 1920
var userAgent = navigator.userAgent; // Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
var browserTimezoneZoneOffset = new Date().getTimezoneOffset(); // 0
}
Пример построения HTML страницы метода 3DS:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ACS v2 3DS Method ...</title>
<style>
.progress{
position: absolute;
height: 10px;
width: 100%;
}
.progress .color{
position: absolute;
background-color: #444;
width: 100%;
height: 10px;
animation: progres 11s linear;
}
@keyframes progres{
0%{
width: 0%;
background-color: #ddd;
}
25%{
width: 50%;
background-color: #ccc;
}
50%{
width: 75%;
background-color: #bbb;
}
75%{
width: 85%;
background-color: #aaa;
}
100%{
width: 100%;
background-color: #777;
}
};
</style>
<script>
var fallbackTimeout = null;
function processForm() {
document.title = "ACS v2 AReq ...";
document.getElementById( "browserJavaEnabled" ).value = navigator.javaEnabled();
document.getElementById( "browserJavascriptEnabled" ).value = true;
document.getElementById( "browserLanguage" ).value = navigator.language;
document.getElementById( "browserColorDepth" ).value = screen.colorDepth;
document.getElementById( "browserScreenHeight" ).value = screen.height;
document.getElementById( "browserScreenWidth" ).value = screen.width;
document.getElementById( "browserTZ" ).value = new Date().getTimezoneOffset();
document.autoForm.submit();
}
function onPostMessage(event) {
if(!event.data.hasOwnProperty('methodNotification')) {
return;
}
if(fallbackTimeout != null) {
clearTimeout(fallbackTimeout);
fallbackTimeout = null;
}
document.getElementById( "threeDSCompInd" ).value = 'Y';
processForm();
}
function onPageLoaded() {
fallbackTimeout = setTimeout(processForm, 10 * 1000);
document.methodForm.submit();
window.addEventListener('message', onPostMessage);
}
</script>
</head>
<body onload="onPageLoaded()">
<div class="progress">
<div class="color"></div>
</div>
<iframe style="width:0; height:0; border:0;" name="methodFrame"></iframe>
<form name="methodForm" target="methodFrame" action="[=tds-method-url-frame-3ds-method-url]" method="POST">
<input type="hidden" name="threeDSMethodData" value="[=threeDSMethodData]">
</form>
<form name="autoForm" action="[=tdsMethodUploadUrl]" method="post">
<input type="hidden" name="threeDSServerTransID" value="[=threeDSServerTransID]"/>
<input type="hidden" name="threeDSCompInd" id="threeDSCompInd" value="N"/>
<input type="hidden" name="browserJavaEnabled" id="browserJavaEnabled" value="" />
<input type="hidden" name="browserJavascriptEnabled" id="browserJavascriptEnabled" value="" />
<input type="hidden" name="browserLanguage" id="browserLanguage" value="" />
<input type="hidden" name="browserColorDepth" id="browserColorDepth" value="" />
<input type="hidden" name="browserScreenHeight" id="browserScreenHeight" value="" />
<input type="hidden" name="browserScreenWidth" id="browserScreenWidth" value="" />
<input type="hidden" name="browserTZ" id="browserTZ" value="" />
<noscript>
<input type="submit" name="submit" value="Upload 3DS Method Result"/>
</noscript>
</form>
</body>
</html>
Обработка уведомления метода 3DS
При завершении стадии метода 3DS, Присоединяющаяся сторона получает HTTP POST запрос на threeDSMethodNotificationURL со значением в threeDSMethodData, который содержит threeDSServerTransID (JSON, зашифрованный в base64).
Получение threeDSMethodData.
threeDSMethodData=eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiJ9Cg
Необходимо раскодировать base64 для получения JSON, содержащий threeDSServerTransID.
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2"}
Пример HTML конечной страницы метода 3DS
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ACS v2 3DS Method Notification Handler...</title>
<script>
window.parent.postMessage({ methodNotification: "COMPLETE" }, "*");
</script>
</head>
<body>
<p>This should not be displayed</p>
</body>
</html>
3DS 2.x.0 Challenge Flow
Пример HTML страницы CReq
HTML страница CReq перенаправляет браузер Отправителя на URL сервера ACS, который передается в параметре tds-creq-form-acs-url. Результат значения CRes возвращается от ACS в параметре notificationURL, который предоставился Присоединящейся Стороной на прошлом шаге.
Поле |
Описание |
Необходимость |
---|---|---|
creq |
Данные 3DS CReq от ACS, полученные Присоединяющейся Стороной в ответе /api/v2/status/. То же, что и tds-creq-form-creq. |
Обязательно |
threeDSSessionData |
Значение, которое будет передано вместе с CRes в notificationURL в конце процесса. Макс. длина: 1024 bytes, формат: Alphanumeric, закодированный в Base64url без отступов. |
Необязательно |
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Redirecting ...</title>
<script type="text/javascript" language="javascript">
function makeSubmit() {
document.returnform.submit();
}
</script>
</head>
<body onLoad="makeSubmit()">
<form name="returnform" action="https://acs.bank-domain.com/mdpayacs/creq" method="POST">
<input type="hidden" name="creq" value="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImM1NDA5N2VhLTc0ZTctNDE2My05MTQ4LTNjMTY1NTg3NGIwMCIsImFjc1RyYW5zSUQiOiIxMjU1NTkyMi1lZmYzLTRjOTQtOTk4Mi0yMDM3NjJhMzdmMjkiLCJjaGFsbGVuZ2VXaW5kb3dTaXplIjoiMDIiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIn0=">
<input type="hidden" name="threeDSSessionData" value="NjY4MDU3NQ">
<noscript>
<input type="submit" name="submit" value="Press this button to continue"/>
</noscript>
</form>
</body>
</html>
3DS 1.0.2 Authentication Flow
Пример HTML страницы PaReq
HTML страница PaReq перенаправляет браузер Отправителя на URL сервера ACS, который передается в параметре tds-pareq-form-acs-url.
HTML страница PaReq состоит из нижеприведённых параметров:
Поле |
Описание |
Необходимость |
---|---|---|
tds-pareq-form-acs-url |
URL 3DS PaReq от ACS, полученный Присоединящейся Стороной в ответе /api/v2/status/. |
Обязательно |
MD |
Данные Торговца, возвращаемые на конечную страницу. |
Необязательно |
PaReq |
Данные 3DS PaReq от ACS, полученные Присоединяющейся Стороной в ответе /api/v2/status/. То же, что и tds-pareq-form-pareq. |
Обязательно |
TermURL |
URL финальной страницы, на которой Отправитель перенаправляется обратно с данными PaRes. |
Обязательно |
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Loading acs..</title>
<script type="text/javascript" language="javascript">
function makeSubmit() {
document.returnform.submit();
}
</script>
</head>
<body onLoad="makeSubmit()">
<form name="returnform" action="$tds-pareq-form-acs-url" method="POST">
<input type="hidden" name="MD" value="some_merchant_data"/>
<input type="hidden" name="PaReq" value="$tds-pareq-form-pareq"/>
<input type="hidden" name="TermUrl" value="https://termination.page"/>
<noscript>
<input type="submit" name="submit" value="Submit"/>
</noscript>
</form>
</body>
</html>