1.12. Повторная предавторизация, списание и отмена

Введение

Оплата — тип транзакции, при которой банк блокирует определённую сумму на карте Плательщика и не позволяет использовать эту сумму. Важно учесть, что блокирование средств действует в течение определённого периода (обычно это до 7 дней для дебетовых карт и до 28 дней для кредитных карт).

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

Повторная предавторизация (рекуррентная предавторизация) - это тип транзакции, при которой средства Плательщика блокируются на определённый период с повторным использованием ранее сохранённого средства оплаты. Повторная предавторизация может быть инициирована вручную по инициативе Плательщика (таким образом можно упростить оплату для Плательщика), либо автоматически с заданным интервалом по инициативе Присоединяющейся Стороны (например, в модели подписки). Плательщику не требуется повторно заполнять платёжные данные, Присоединяющая Сторона использует Ссылочный идентификатор (Card Reference ID) для инициации оплаты. Необходимость проведения 3DS и ввода защитного кода (CVC, CVV и т.п.) в случае оплаты картой определяется настройками счёта в Эквайере и зависит от модели бизнеса Присоединяющейся стороны.

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

Повторная оплата совершается в 3 стадии:
1. Первый платёж – необходимо совершить первую оплату для проверки платёжного средства (например, карты) Плательщика. Для первого платежа подходит любой тип транзакции с платёжной информацией Плательщика - sale, preauth, transfer, и др.
2. Регистрация карты (или иного платёжного метода) – необходимо получить Ссылочный идентификатор (Card reference ID) и привязать его к профилю Плательщика. Регистрация платёжного метода возможна только для транзакций в финальном статусе.
3. Повторный платёж – необходимо вызвать новую транзакцию оплаты с использованием ссылочного идентификатора, полученного на предыдущем шаге.

Сценарий повторной предавторизации

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

Note

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

(1) Для регистрации карты и получения ссылочного идентификатора см. /api/v2/create-card-ref/.
(4) Для выполнения запроса на получение информации по ссылочному идентификатору см. /api/v2/get-card-info/. Содержимое ответа на этот запрос может быть использовано для показа Плательщику деталей предыдущего использованного метода оплаты или обновления базы данных Присоединяющейся Стороны. Запрос может быть выполнен в любой момент, если у Присоединяющейся стороны уже есть ссылочный идентификатор (Card reference ID).
(6) Повторная предавторизация может быть инициирована Плательщиком или Присоединяющейся Стороной в соответствии с бизнес-моделью.
(8, 9) Присоединяющаяся Сторона отправляет запрос Плательщику для ввода CVV/CVC (если применимо для сценария повторной предавторизации).
(10) Для инициации повторной предавторизации см. /api/v2/make-rebill-preauth/. См. Схему прохождения 3DS и Реализация Сценариев 3DS чтобы корректно реализовать проведение 3DS для повторной предавторизации.
(12) Для имплементации обратного вызова с обработкой финального статуса см. Обратный вызов Присоединяющейся Стороны.
(14) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(16) Результаты транзакции могут отправляться Присоединяющейся Стороной в соответствии с бизнес-моделью или по запросу Плательщика.

Схема прохождения 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торона имлементирует шаги, указанные зелёным и фиолетовым цветом. Ниже указано описание шагов со ссылками на исполняемые API команды в соответствии с номером шага:

(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

<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/**.
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

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

(1) Для имплементации запроса статуса, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалами в 3-5 секунд до получения финального статуса в ответе.
(2) То же, что и (1).
(4) Для построения HTML страницы метода 3DS см. примеры ниже.
(9) Для обработки уведомлений метода 3DS см. Обработка уведомлений метода.
(11) Для построения HTML страницы завершения метода 3DS см. примеры.
(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://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/. Статус должен запрашиваться несколько раз с интервалами в 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

<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/. Статус должен запрашиваться несколько раз с интервалами в 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/.

Обязательно

PaReq

Данные 3DS PaReq от ACS, полученные Присоединяющейся Стороной в ответе /api/v2/status/. То же, что и tds-pareq-form-pareq.

Обязательно

TermURL

URL финальной страницы, на которой Плательщик перенаправляется обратно с данными PaRes.

Обязательно

MD

Данные Торговца, возвращаемые на конечную страницу.

Необязательно

<!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) HTML страница ожидания в контуре Присоединяющейся Стороны может иметь произвольный дизайн и должна взаимодействовать с сервером Присоединяющейся Стороны в соответствии с диаграммой.
(15) и (16) то же, что и (1) и (2).

Сценарий списания

skinparam roundcorner 20
skinparam sequenceArrowThickness 1
skinparam maxmessagesize 100
skinparam sequenceParticipant underline
actor Плательщик
participant "Присоединяющаяся Сторона" as A
participant "Платёжный Шлюз" as B
hnote over Плательщик,B : Успешная транзакция преавторизации
autonumber
== Списание ==
group Опционально
Плательщик -> A: Инициация списания
activate Плательщик
activate A
end
A -> B: api/v2/capture
activate B
B --> A: ИД транзакции
B -> B: Обработка списания
group Получение финального статуса
== Получение обратного вызова ==
A <- B: Обратный вызов с финальным статусом
A --> B: HTTP 200
deactivate B
== Запрос статуса ==
A -> B: Получение статуса по ИД транзакции api/v2/status
activate B
B --> A: Ответ со статусом, Order-stage
deactivate B
end
group Опционально
A --> Плательщик: Конечный статус
deactivate Плательщик
deactivate A
end

(1) Списание может быть инициировано Присоединяющейся Стороной в соответствии с бизнес-моделью или по запросу Плательщика.
(2) Для имплементации запроса на списание см. /api/v2/capture/.
(5) Обратный вызов по списанию будет отправлен только в случае, если notify_url был предоставлен в инициирующем запросе предавторизации или дополнительный обратный вызов установлен на предоставленный URL для списаний на уровне терминала. Если в запросе предавторизации был предоставлен server_callback_url, обратный вызов по списанию не будет отправлен. Для обработки обратных вызовов см. Обратный вызов Присоединяющейся Стороны.
(7) Для имплементации запроса статуса заказа, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалом в 3-5 секунд до получения финального статуса.
(9) Конечный статус может быть предоставлен Присоединяющейся Стороной в соответствии с бизнес-моделью или по запросу Плательщика.

Сценарий отмены

skinparam roundcorner 20
skinparam sequenceArrowThickness 1
skinparam maxmessagesize 100
skinparam sequenceParticipant underline
actor Плательщик
participant "Присоединяющаяся Сторона" as A
participant "Платёжный Шлюз" as B
hnote over Плательщик,B : Успешная транзакция преавторизации
autonumber
== Отмена ==
group Опционально
Плательщик -> A: Инициация отмены
activate Плательщик
activate A
end
A -> B: api/v2/return
activate B
B --> A: ИД транзакции
B -> B: Обработка отмены
group Получение финального статуса
== Получение обратного вызова ==
A <- B: Обратный вызов с финальным статусом
A --> B: HTTP 200
deactivate B
== Запрос статуса ==
A -> B: Получение статуса по ИД транзакции api/v2/status
activate B
B --> A: Ответ со статусом, Order-stage
deactivate B
end
group Опционально
A --> Плательщик: Конечный статус
deactivate Плательщик
deactivate A
end

(1) Отмена предавторизации может быть вызвана Присоединяющейся Стороной в соответствии с бизнес-моделью или по запросу Плательщика.
(2) Для имплементации запроса на отмену см. /api/v2/return/.
(5) Обратный вызов по отмене будет отправлен только в случае, если notify_url был предоставлен в инициирующем запросе предавторизации или дополнительный обратный вызов установлен на предоставленный URL для отмен на уровне терминала. Если в запросе предавторизации был предоставлен server_callback_url, обратный вызов по отмене не будет отправлен. Для обработки обратных вызовов см. Обратный вызов Присоединяющейся Стороны.
(7) Для имплементации запроса статуса заказа, см. /api/v2/status/. Статус должен запрашиваться несколько раз с интервалом в 3-5 секунд до получения финального статуса.
(9) Конечный статус может быть предоставлен Присоединяющейся Стороной в соответствии с бизнес-моделью или по запросу Плательщика.