1.3. Прямой перевод средств

Введение

Трансфер - это тип комплексной оплаты, которая позволяет перечислять средства между банковскими картами (PAN), карточными токенами (RPI) и банковским аккантом Присоединяющейся Стороны (Депозит).

См. определения терминов (Присоединяющаяся Сторона, 3DS метод и т.д.) в Глоссарии.

Возможные сценарии трансфера:

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 происходит при перечеслении средств с аккаунта Присоединящейся Стороны на банковскую карту с указанием ссылочныго идентификатора карты.

Сценарий Трансфера

skinparam roundcorner 20
skinparam sequenceArrowThickness 2
skinparam ParticipantPadding 30
autonumber
actor Отправитель as Payer
participant "Присоединяющаяся Сторона" as A
participant "Платёжный Шлюз" as B

Payer -> A: Инициализация
activate A
== Запрос на перевод средств ==
A -> B: api/v4/transfer
activate B
B --> A: ИД транзакции
B -> B: Обработка платежа
hnote over Payer,B : См. Схема прохождения 3DS
group Получение финального статуса
== Получение обратного вызова \nПрисоединяющейся Стороны ==
A <- B: Обратного вызов с конечным статусом
B <-- A: HTTP 200
deactivate B
== Запрос статуса ==
A -> B: Получение статуса по ИД транзакции
activate B
B --> A: Конечный статус
deactivate B
end
A --> Payer: Показ результата
deactivate A

(1) Трансфер между картами инициируется Отправителем. Трансфер от Присоедияющейся Стороной (депозиты) инициируется Получателем с тем же Сценарием.
(2) Для имплементации запроса на трансфер см. /api/v4/transfer/. См. Процесс прохождения 3DS для получения большей информации про процесс 3DS. См. Схема прохождения 3DS и Реализация Сценариев 3DS, чтобы корректно реализовать проведение 3DS для трансфера. Для сценариев deposit to PAN и deposit to RPI процесс 3DS не инициируется (Сценарий оплаты без 3DS).
(5) Для имплементации обратного вызова с обработкой финального статуса см. Обратный вызов Присоединяющейся Стороны.
(7) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.

Схема прохождения 3DS

<style>
activityDiagram {
BackgroundColor #Turquoise
  diamond {
    BackgroundColor #Turquoise
  }
}
document {
   BackgroundColor #fcfcfc
}
</style>
title Схема прохождения 3DS
start
: (1) Отправка запроса **/api/v2/status**\nс orderid=**paynet-order-id**\nОбработка ответа **/api/v2/status**;
while ((2) Проверка равенства поля ответа **status** \nодному из конечных статусов\n**status** == approved\nИЛИ **status** == declined\nИЛИ **status** == error\nИЛИ **status** == unknown\nИЛИ **status** == filtered) is (NO);
if ((3) параметр **tds_status** присутствует) then (YES)
if ((4) **tds_status** == MethodUrlFrame?) then (YES)
#Plum :(5) Создание iframe\nдля прохождения метода 3DS\nОсуществляется прохождение\n3DS 2.x Frictionless flow\n\nСм. 3DS 2.x Frictionless Flow;
(NO      ) elseif ((6) **tds_status** == CReqForm?) then (YES)
#Plum :(7) Создание CReq HTML страницы\nперенаправляющая на ACS\nОсуществляется прохождение\n3DS 2.x Challenge Flow\n\nСм. 3DS 2.X Challenge Flow;
(NO      ) elseif ((8) **tds_status** == PaReqForm?) then (YES)
#Plum :(9) Создание PaReq HTML страницы\nперенаправляющая на ACS\nОсуществляется прохождение\n3DS 1.0.2 Authentication Flow\n\nСм. 3DS 1.0.2 Authentication Flow;
endif
(NO      )elseif ((10) присутствуют параметры **html** и **redirect-to**) then (YES)
#Plum :(11) Создание HTML страницы ожидания\nперенаправляющая на страницу результата\n(Осуществляется 3DS 2.x или 1.0.2)\n\nСм. Simplified authentication flow;
else (NO)
endif
backward:(12) Отправка нового \n**/api/v2/status** запроса\nОбработка\n**/api/v2/status** ответа;
endwhile (YES)
:(13) Показ конечной страницы Отправителю;
stop
legend left
=Legend
| Цвет | Ответственность за обработку |
|<#Turquoise>| Присоединяющаяся Сторона |
|<#Plum>| Присодиняющаяся и другие Стороны |
endlegend

Присоединяющаяся Cторона имлементирует шаги, указанные зелёным и фиолетовым цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с номером шага:

(1) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(5) Для tds_status со значением MethodUrlFrame см. 3DS 2.x Frictionless Flow.
(7) Для tds_status со значением CReqForm см. 3DS 2.X Challenge Flow.
(9) Для tds_status со значением PaReqForm см. 3DS 1.0.2 Аутентификация
(11) Если значение tds_status отсутствует, но присутствуют значения html и redirect-to, см. Упрощённый сценарий аутентификации с html страницей
(12) То же, что и пункт (1)

Сценарий оплаты без 3DS

Трансфер считается проведённым без прохождения 3DS (без 3DS аутентификации) при нижеприведённых условиях:

1. Соблюдены шаги 1-2-(12)-13 Схемы Прохождения 3DS.
2. Отсутствие параметров tds_status, html и redirect-to.
3. Транзакция получила финальный статус (approved, declined, error, filtered).

Note

Транзакции со статусом “unknown” могут показываться как транзакции прошедшие 3DS, так и как транзакции без прохождения 3DS. Детальнее о статусах транзакций см. Статусы.

3DS 2.x.0 Frictionless Flow

<style>
activityDiagram {
  diamond {
    BackgroundColor #Turquoise
  }
}
document {
   BackgroundColor #fcfcfc
}
</style>
title 3DS 2.x.0 Frictionless Flow
start
#Turquoise:(1) Отправка API запроса **/api/v2/status/**;
#Turquoise:(2) Обработка ответа **/api/v2/status/**.
Gather:
**tds-method-url-frame-3ds-server-trans-id**
**tds-method-url-frame-3ds-method-url**;
if ((3) присутствует параметр **tds-method-url-frame-3ds-method-url**) then (yes)
    #Turquoise:(4) Присоединяющая Сторона передаёт **HTML страницу 3DS метода**,\nсодержащую скрытый iframe и публикацию **HTML-форму результата 3DS метода**,\nиспользуя параметры, полученные на предыдущих шагах\nи предоставляя **threeDSMethodNotificationURL**;
    #Turquoise:(5) HTML страница, открытая однажды, автоматически подтверждается
    в iframe (используя HTML страницу целевого свойства);
    fork
        note left
        Жизненный цикл **iframe**
        end note
        :(6) iframe Отправителя перенаправляется на
        **tds-method-url-frame-3ds-method-url**
        URL (ACS Банка-эмитента);
        :(7) ACS Банка-эмитента собирает данные идентификации Отправителя из браузера;
        :(8) ACS Банка-эмитента уведомляет (используя HTTP POST)
        **threeDSMethodNotificationURL** о завершении;
        #Turquoise:(9) При получении уведомления о сборе данных **threeDSMethodData**.
        Base64Decode-декодирование и проверка **threeDSServerTransID**;
        #Turquoise:(10) Сохранение **threeDSCompInd=Y** для повторных платежей;
        #Turquoise:(11) Возврат **HTML страницы завершённого 3DS метода**;
    fork again
        note left
        Жизненный цикл **HTML страница 3DS метода**
        end note
        repeat
            #Turquoise:(12) Проверка получения уведомления ACS
            Банка-эмитента от iframe внутреннего JavaScript;
        repeat while ((13) уведомление получено ИЛИ произошел тайм-аут?) is (no)
        -> (yes);
        if ((14) произошел тайм-аут?) then (yes)
            #Turquoise:(15) Сохранение **threeDSCompInd=N**
            для данной транзакции;
        else (no)
        endif
        :(16) После осуществления 3DS метода\nотправка данных на сервер Присоединяющейся Стороны;
   end fork
    else (no)
        #Turquoise:(17) Сохранение **threeDSCompInd=U**
        для данной транзакции;
endif
#Turquoise:(18) Отправка запроса **api/3ds/v1/upload-method-url-result/**
с собранными данными Отправителя **threeDSCompInd**,
информацией браузера Отправителя **notificationURL**,
которая будет использована далее в Challenge Flow
(См. Схема прохождения 3DS и 3DS 2.X Challenge Flow).;
#Turquoise:(19) Отправка API запроса **/api/v2/status/**
Обработка ответа **/api/v2/status/** и последующая **Схема прохождения 3DS**.;
stop
legend left
=Legend
| Цвет | Ответственность за обработку |
|<#Turquoise>| Присоединяющаяся Сторона |
| | Другие стороны |
endlegend

“Присоединяющаяся сторона имлементирует шаги, указанные зелёным цветом. Ниже указано описание шагов со ссылками на исполняемые АПИ команды в соответствии с ИД шага:

(1) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(2) То же, что и (1).
(4) Для построения HTML страницы метода 3DS см. примеры ниже.
(9) Для обработки уведомлений метода 3DS см. Обработка уведомлений метода.
(11) Для построения HTML страницы метода 3DS Done страницы см. примеры.
(18) Для загрузки результата метода URL см. /api/3ds/v1/upload-method-url-result/
(19) То же, что и (1).

Пример 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

  1. Построение threeDSMethodData JSON.

{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://connectingparty.com/3ds-method-complete/"}
  1. Необходимо закодировать 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).

  1. Получение threeDSMethodData.

threeDSMethodData=eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiJ9Cg
  1. Необходимо раскодировать 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

<style>
document {
   BackgroundColor #fcfcfc
}
</style>
title 3DS 2.x.0 Challenge Flow
start
#Turquoise:(1) Отправка API запроса **/api/v2/status/**;
#Turquoise:(2) Обработка ответа **/api/v2/status/**
Gather:
**tds-creq-form-creq**
**tds-creq-form-acs-url**;
#Turquoise:(3) Построение HTML страницы CReq на основе собранных параметров.
Добавление **threeDSSessionData** с пользовательскими данными
в формате: Макс. длина: 1024 bytes, формат: Alphanumeric,
закодировано base64url без заполнения.;
#Turquoise:(4) Возврат HTML страницы CReq браузеру Отправителя;
:(5) Страница CReq gперенаправляется на ACS URL **tds-creq-form-acs-url**.
Отправитель проходит Верификацию 3DS Challenge.
ACS возвращает CRes страницу.
Страница CRes отправляется на подтверждение на **notificationURL**;
#Turquoise:(6) Обработка параметров страницы CRes Page.
Сбор параметров:
**cres**
**threeDSSessionData**;
#Turquoise:(7) Отправка HTTP POST API запроса **/api/3ds/v1/upload-cres-result/**
providing **cres**, **orderid=paynet-order-id**;
#Turquoise:(8) Отправка API запроса **/api/v2/status/**
Обработка ответа **/api/v2/status/** и последующая **Схема прохождения 3DS**.;
stop
legend left
=Legend
| Цвет | Ответственность за обработку |
|<#Turquoise>| Присоединяющаяся Сторона |
| | Другие Стороны |
endlegend

(1) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(2) То же, что и (1).
(3) Для создания CReq HTML страницы см. примеры.
(5) Для имплементации CRes перенаправления см. CRes перенаправление
(7) Для загрузки результатов CRes см. /api/3ds/v1/upload-cres-result/
(8) То же, что и пункт (1).

Пример 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

<style>
document {
   BackgroundColor #fcfcfc
}
</style>
title 3DS 1.0.2 Authentication Flow
start
#Turquoise:(1) Отправка API запроса **/api/v2/status/**;
#Turquoise:(2) Обработка ответа **/api/v2/status/**.
Gather:
**tds-pareq-form-pareq**
**tds-pareq-form-acs-url**;
#Turquoise:(3) Построение HTML страницы PAReq на основе собранных параметров.
Добавление **TermUrl** куда Отправитель будет перенаправлен с подтверждёнными данными PARes.
Добавление **MD** с пользовательсими данными, которые будут отправлены назад.;
#Turquoise:(4) Возврат HTML страницы PAReq браузеру Отправителя.;
:(5) PaReq страница перенаправляется на URL ACS **tds-pareq-form-acs-url**;
:(6) Отправитель проходит Верификацию 3DS Challenge;
:(7) ACS возвращает страницу PARes;
:(8) PaRes страница отправляется на подтверждение **TermUrl**;
#Turquoise:(9) Обработка параметров страницы PARes.
Сбор параметров:
**PaRes**
**MD**;
#Turquoise:(10) Отправка HTTP POST API запроса **/api/3ds/v1/upload-pares-result/**
предоставление **paRes**, **orderid=paynet-order-id**;
#Turquoise:(11) Отправка API запроса **/api/v2/status/**
Обработка ответа **/api/v2/status/** и последующая **3Схема прохождения 3DS**.;
stop
legend left
=Legend
| Цвет | Ответственность за обработку |
|<#Turquoise>| Присоединяющаяся Сторона |
| | Другие стороны |
endlegend

(1) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(2) То же, что и (1).
(3) Для создания PaReq HTML страницы см. примеры.
(5) Для имплементации PaRes перенаправления см. PaRes перенаправление.
(10) Для загрузки результатов PaRes см. /api/3ds/v1/upload-pares-result/.
(11) То же, что и пункт (10).

Пример 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>

Упрощённый процесс аутентификации

<style>
document {
   BackgroundColor #fcfcfc
}
activitydiagram {
diamond {
  BackgroundColor #Turquoise
  }
}
</style>
title Упрощённый процесс аутентификации
start
#Turquoise:(1) Отправка API запроса **/api/v2/status/**;
#Turquoise:(2) Обработка ответа **/api/v2/status/**.
Сбор параметра:
**html**;
fork
#Turquoise:(3) Сбор параметра **html**;
#Turquoise:(4) Возврат данных с параметра **html** браузеру Отправителя;
forkagain
#Turquoise:(5) Сбор параметра **redirect-to**;
#Turquoise:(6) Пренаправление Плательщика на redirect URL;
endfork
:(7) Браузер Отправителя перенаправляется на ACS и Отправитель проходит или 3DS 1.0.2 или 3DS 2.X flow.;
:(8) Браузер Отправителя перенаправляется назад на **redirect_url**, предоставленный в начальном запросе **api/v2/sale/**.;
#Turquoise:(9) Обработка финального перенаправления браузера Отправителя **redirect_url**.;
#Turquoise:(10) Возврат HTML страницы ожидания браузеру Отправителя;
fork
note left
        Жизненный цикл **HTML страницы ожидания**
end note
repeat
#Turquoise: (11) Запрос серверу Присоединяющейся Стороны о статусе транзакции;
#Turquoise: (12) Обработка статуса транзакции;
repeat while ((13) Получение финального статуса\n(approved, declined, error or uknown)?) is (no)
-> (yes);
#Turquoise:(14) Перенаправление браузера Отправителя на страницу результата;
fork again
note left
        Жизненный цикл **сервера Присоединяющейся Стороны**
end note
#Turquoise:(15) Отправка API запроса **/api/v2/status/**;
#Turquoise:(16) Обработка ответа **/api/v2/status/** \nи последующая **Схема прохождения 3DS** для анализа статуса ответа;
end fork
stop
legend left
=Legend
| Цвет | Ответственность за обработку |
|<#Turquoise>| Присоединяющаяся Сторона |
| | Другие стороны |
endlegend

(1) и (2). Для имплементации запроса статуса заказа, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(9) Для инициации финального перенаправления см. Финальное перенаправление.
(10) The HTML wait page on Connecting Party side can have custom design and should communicate with Connecting Party server as described on the diagram.
(15) и (16) то же, что и (1) и (2).