1.1. Прямая оплата

Введение

Оплата — тип транзакции, при которой Плательщик получает товар или услугу от Присоединяющейся Стороны в обмен на деньги или другие активы. При осуществлении сценария интеграции оплаты с прямой передачей карточных данных в запросе данные карты передаются непосредственно при передаче запроса.

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

Общий сценарий оплаты

skinparam roundcorner 20
skinparam sequenceArrowThickness 1
skinparam maxmessagesize 1200
skinparam sequenceParticipant underline
actor Плательщик
participant "Присоединяющаяся Сторона" as A
participant "Payneteasy" as B
autonumber
Плательщик -> A: Инициализация
activate A
A -> B: /api/v2/sale/
activate B
B --> A: ИД Транзакции
B -> B: Обработка\nПлатежа
hnote over Плательщик,B : Схема прохождения 3DS
group Получение конечного статуса
== Получение обратного вызова \nПрисоединяющейся Стороны ==
A <- B: Обратного вызов с конечным статусом
A --> B: HTTP 200
deactivate B
== Запрос статуса ==
A -> B: Получение статуса по ИД транзакции
activate B
B --> A: Конечный статус
deactivate B
end
A --> Плательщик: Показ результата
deactivate Плательщик
deactivate A

(2) Для имплементации запроса на проведение оплаты см. /api/v2/sale/. См. Проведение 3DS, чтобы получить больше информации о 3DS процессе. См. Схема прохождения 3DS и Реализация Сценариев 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Осуществляется прохождение\nСценарий аутентификации 3DS 1.0.2\n\nСм. Сценарий аутентификации 3DS 1.0.2;
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.
(7) Для tds_status со значением CReqForm см. Сценарий 3DS 2.X Challenge.
(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

<style>
activityDiagram {
  diamond {
    BackgroundColor #Turquoise
  }
}
document {
   BackgroundColor #fcfcfc
}
</style>
title Сценарий 3DS 2.x.0 Frictionless
start
#Turquoise:(1) Отправка API запроса **/api/v2/status/**;
#Turquoise:(2) Обработка ответа **/api/v2/status/**.
Сборка:
**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-адрес (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

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

{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://merchant.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

<style>
document {
   BackgroundColor #fcfcfc
}
</style>
title Сценарий 3DS 2.x.0 Challenge
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/.
(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

<style>
document {
   BackgroundColor #fcfcfc
}
</style>
title Сценарий аутентификации 3DS 1.0.2
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/.
(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/.
(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).