1.1. Прямая оплата
Введение
Общий сценарий оплаты
Схема прохождения 3DS
Присоединяющаяся Cторона имлементирует шаги, указанные зелёным и фиолетовым цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с номером шага:
Сценарий оплаты без 3DS
Оплата считается проведённой без прохождения 3DS (без 3DS аутентификации) при нижеприведённых условиях:
Note
Транзакции со статусом “unknown” могут показываться как транзакции прошедшие 3DS, так и как транзакции без прохождения 3DS. Детальнее о статусах транзакций см. Статусы.
Сценарий 3DS 2.x.0 Frictionless
Присоединяющаяся сторона имлементирует шаги, указанные зелёным цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с ИД шага:
Пример HTML страницы метода 3DS
Пример HTML страницы метода 3DS выполняет инициацию метода 3DS через технологию iframe и держит браузер Плательщика до тех пор, пока не будет закончен процесс 3DS на сервере Присоединяющейся стороны. После завершения процесса 3DS (также в следствие таймаута) Присоединяющаяся сторона следует шагам схемы прохождения процесса 3DS и перенаправляет браузер Плательщика на соответствующий URL-адрес (3DS Challenge или результат платежа). Обычно, значение таймаута равно 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://merchant.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
Пример 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
Пример 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>