5.2. Обзор 3DS

Процесс 3DS в ConnPay

Справочные материалы:

EMV® 3-D Secure Protocol and Core Functions Specification

3-D Secure — это протокол, разработанный в качестве дополнительного уровня безопасности для онлайн-транзакций по кредитным и дебетовым картам.
Протокол 3-D Secure имеет две основные версии.
1.0 — была представлена в 2001 году и до сих пор используется некоторыми эквайерами (сервисы на базе этого протокола были приняты различными платежными системами под разными названиями: Verified by Visa или Visa Secure у Visa, SecureCode у Mastercard, ProtectBy у Discover, J/Secure у JCB International, American Express SafeKey у American Express).
2.X — была представлена в 2016 году для усиления и замены версии 1.0; она направлена на соблюдение новых требований ЕС к аутентификации и устранение некоторых недостатков оригинального протокола.

Несмотря на различия в обмене сообщениями на низком уровне, по существу версия протокола 2.X отличается от 1.0 наличием опции автоматической оценки рисков эмитентом карты на основе дополнительных контекстных данных, отправляемых из браузера или мобильного приложения плательщика, тогда как версия 1.0 всегда требует от плательщика прохождения проверки (challenge). Соответственно (и согласно спецификации EMVCo), протокол версии 2.X включает в себя Frictionless flow (сбор контекстных данных и оценка рисков) и Challenge flow (прохождение проверки аутентификации). Стандартный процесс аутентификации 3DS 2.X в веб-браузере плательщика проиллюстрирован ниже.

  1. Плательщики заполняют платежную форму, предоставленную Подключенной стороной или Платежным шлюзом, и отправляют данные.

Платежная форма

Примечание

Для транзакций перевода платежная форма может выглядеть так, как описано ниже.

Платежная форма

  1. Контекстные данные собираются и отправляются Эмитенту в фоновом режиме внутри браузера (Frictionless flow).

Форма ожидания

  1. Если Эмитент считает транзакцию рискованной, браузер плательщика перенаправляется на веб-страницу Эмитента для прохождения проверки аутентификации (Challenge flow).

3DS

  1. Когда плательщик проходит проверки, выполняется авторизация платежа с сохранением деталей аутентификации 3DS на стороне эквайера.

Форма ожидания

  1. Браузер плательщика перенаправляется на сайт Подключенной стороны на страницу с результатом.

Финальная форма

В связи с тем, что обе версии протокола все еще используются, Подключенная сторона должна поддерживать их обе, а также специфические интеграции, когда эквайер берет на себя взаимодействие по 3D Secure. Для этих целей Платежный шлюз предоставляет универсальный подход на основе API-команд, которые позволяют Подключенной стороне обрабатывать все указанные случаи. Подключенной стороне следует начать со Схемы принятия решений 3DS для соответствующего варианта использования (Use-Case), которая, в свою очередь, ссылается на более детальную диаграмму, описывающую специфику обработки данных и редиректов браузера плательщика.

Сценарии реализации 3DS

Сценарий реализации

Инструкции

3DS не инициируется (non3D).

Аутентификация 3DS не инициируется. Следуйте Схеме принятия решений 3DS соответствующего Use-Case и реализуйте Процесс Non3D.

3DS инициируется и выполняется Подключенной стороной (для PSP и эквайеров).

Аутентификация 3DS инициируется и выполняется Подключенной стороной, результаты передаются в Платежный шлюз в первоначальном запросе. Следуйте Схеме принятия решений 3DS соответствующего Use-Case и реализуйте Процесс Non3D (3DS выполняется до первоначального запроса к Платежному шлюзу).

3DS инициируется Платежным шлюзом и выполняется на стороне Подключенной стороны.

Аутентификация 3DS инициируется Платежным шлюзом. Для 3DS 1.0.2 аутентификация плательщика выполняется на стороне Подключенной стороны, результаты загружаются в Платежный шлюз. Для 3DS 2.x выполнение 3DS Method и Challenge происходит на стороне Подключенной стороны, результаты загружаются в Платежный шлюз. Дополнительные поля для 3DS Method могут быть переданы Подключенной стороной в первоначальном запросе для ускорения процесса в 3DS 2.x (tds_status=MethodUrlFrame будет пропущен, если 3DS Method не поддерживается ACS). Следуйте Схеме принятия решений 3DS соответствующего Use-Case и реализуйте все процессы 3DS (3DS Flows).

3DS инициируется и выполняется Платежным шлюзом.

Аутентификация 3DS инициируется Платежным шлюзом, все сценарии 3DS выполняются на стороне Платежного шлюза. Следуйте Схеме принятия решений 3DS соответствующего Use-Case, реализуйте Упрощенный процесс аутентификации (игнорируйте наличие параметра tds_status, используйте параметры html или redirect-to для перенаправления плательщика на Платежный шлюз) и Процесс Non3D (если карта плательщика не участвует в 3DS или обработка идет как Non3D).

Схема принятия решений 3DS

@startuml
<style>
activityDiagram {
BackgroundColor #Turquoise
  diamond {
    BackgroundColor #Turquoise
  }
}
document {
   BackgroundColor #fcfcfc
}
</style>
title Схема принятия решений 3DS
start
: (1) Send **/api/v2/status** request\nwith orderid=**paynet-order-id**\nProcess **/api/v2/status** response;
while ((2) Check If **status** response field equals\nto finished status values\n**status** == approved\nOR **status** == declined\nOR **status** == error\nOR **status** == unknown\nOR **status** == filtered) is (NO);
if ((3) **tds_status** field is present) then (YES)
if ((4) **tds_status** == MethodUrlFrame?) then (YES)
#Plum :(5) Create iframe\nto pass 3DS Method\n3DS 2.x Frictionless flow\nto be applied.\n\nSee 3DS 2.x Frictionless Flow;
(NO      ) elseif ((6) **tds_status** == CReqForm?) then (YES)
#Plum :(7) Create CReq HTML Page\nwhich redirects to ACS\n3DS 2.x Challenge Flow\nto be applied\n\nSee 3DS 2.X Challenge Flow;
(NO      ) elseif ((8) **tds_status** == PaReqForm?) then (YES)
#Plum :(9) Create PaReq HTML Page\nwhich redirects to ACS\nПроцесс аутентификации 3DS 1.0.2\nto be applied\n\nSee Процесс аутентификации 3DS 1.0.2;
endif
(NO      )elseif ((10) **html** field is present) then (YES)
#Plum :(11) Return content of the\n**html** field to the Payeras is \n(3DS 2.x or 1.0.2 to be applied)\n\nSee Simplified authentication flow;
else (NO)
endif
backward:(12) Send new\n**/api/v2/status** request\nProcess\n**/api/v2/status** response;
endwhile (YES)
:(13) Show result page to the Payer;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
|<#Plum>| Connecting and other party |
| | Other Party |
endlegend
@enduml

Подключенная сторона должна реализовать все шаги, отмеченные зеленым и фиолетовым цветами. Ниже приведены описания шагов со ссылками на конкретные API-команды в соответствии с ID шага:

(1) Для реализации запроса статуса заказа см. /api/v2/status/. Статус следует запрашивать многократно с интервалом 3–5 секунд до получения финального статуса в ответе.
(5) Если tds_status имеет значение MethodUrlFrame, см. Frictionless 3DS 2.x.
(7) Если tds_status имеет значение CReqForm, см. 3DS 2.X Challenge.
(9) Если tds_status имеет значение PaReqForm, см. 3DS 1.0.2 Authentication.
(11) Если параметр tds_status отсутствует, но присутствует поле html, см. Simplified authentication.
(12) То же, что и в пункте (1).

Процесс Non3D

Транзакция должна считаться non3D (без аутентификации 3DS), если соблюдены все условия:

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

Примечание

Обратите внимание, что статус транзакции «unknown» может возникать как для 3DS, так и для non3D транзакций. Подробности см. в разделе Statuses.

Процесс 3DS 2.x.0 Frictionless

<style>
activityDiagram {
  diamond {
    BackgroundColor #Turquoise
  }
}
document {
   BackgroundColor #fcfcfc
}
</style>
title Процесс 3DS 2.x.0 Frictionless
start
#Turquoise:(1) Send **/api/v2/status/** API request;
#Turquoise:(2) Process **/api/v2/status/** response.
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** is present) then (yes)
    #Turquoise:(4) The Connecting Party constructs **3DS Method HTML Page**\ncontaining hidden iframe and upload **3DS Method Result HTML Form**\nusing the parameters received on the previous steps\nand providing **threeDSMethodNotificationURL**;
    #Turquoise:(5) HTML Page, once rendered, is automatically submitted
    into iframe (using HTML Page target attribute);
    fork
        note left
        **iframe** lifecycle
        end note
        :(6) Payer's iframe gets redirected to
        **tds-method-url-frame-3ds-method-url**
        URL (Issuer ACS);
        :(7) Issuer ACS collects Payer Identity Data from browser;
        :(8) Issuer ACS notifies (using HTTP POST)
        **threeDSMethodNotificationURL** on completion;
        #Turquoise:(9) When notification is received gather **threeDSMethodData**.
        Base64Decode it and check **threeDSServerTransID**;
        #Turquoise:(10) Save **threeDSCompInd=Y** for the current Transaction;
        #Turquoise:(11) Return **3DS Method Done HTML Page**;
    fork again
        note left
        **3DS Method HTML Page** lifecycle
        end note
        repeat
            #Turquoise:(12) Check if Issuer ACS notification
            is received from iframe internal JavaScript;
        repeat while ((13) notification is recieved OR timeout exceeded?) is (no)
        -> (yes);
        if ((14) timeout exceeded?) then (yes)
            #Turquoise:(15) Save **threeDSCompInd=N**
            for the current Transaction;
        else (no)
        endif
        :(16) After executing 3ds method\nsend data to connecting party's server;
   end fork
    else (no)
        #Turquoise:(17) Save **threeDSCompInd=U**
        for the current Transaction;
endif
#Turquoise:(18) Send **api/3ds/v1/upload-method-url-result/** request
with the collected Payer's data and **threeDSCompInd**,
Payer's browser info and **notificationURL**
which is to be used further in the Challenge Flow
(see Схема принятия решений 3DS and 3DS 2.X Challenge Flow).;
#Turquoise:(19) Send **/api/v2/status/** API request
Process **/api/v2/status/** response and follow **Схема принятия решений 3DS**.;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend

Подключенная сторона должна реализовать все шаги, отмеченные зеленым цветом. Ниже приведены описания шагов со ссылками на конкретные API-команды в соответствии с ID шага:

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

Пример HTML-страницы 3DS Method

Приведенный ниже пример HTML-страницы 3DS Method выполняет инициацию 3DS Method через iframe и удерживает браузер плательщика до завершения 3DS Method на сервере Подключенной стороны. После завершения или по истечении тайм-аута Подключенная сторона должна выполнить следующие шаги согласно Схеме принятия решений 3DS и перенаправить браузер плательщика на соответствующий URL (либо Challenge Flow, либо страницу результата платежа). Стандартное значение тайм-аута — 30 сек.

HTML-страница 3DS Method состоит из следующих параметров:

Параметр

Описание

tds-method-url-frame-3ds-method-url

URL ACS 3DS Method, полученный Подключенной стороной в ответе /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, на который придет уведомление о завершении 3DS Method от ACS. Подключенная сторона несет ответственность за предоставление корректного threeDSMethodNotificationURL. Обычно, когда Подключенная сторона получает любой запрос на этот URL, она должна вернуть 3DS Method Done HTML Page (см. пример ниже).

Пример формирования threeDSMethodData

  1. Сформируйте JSON threeDSMethodData.

{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://connectingparty.com/3ds-method-complete/"}
  1. Примените кодирование base64 url к результирующему JSON.

eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiIsInRocmVlRFNNZXRob2ROb3RpZmljYXRpb25VUkwiOiJodHRwczovL21lcmNoYW50LmNvbS8zZHMtbWV0aG9kLWNvbXBsZXRlLyJ9

Генерация Fingerprint

3DS Method может опционально использоваться эмитентами для сбора отпечатков браузера (fingerprints) с помощью JavaScript. Это делается путем загрузки URL в скрытом iframe перед аутентификацией. Этот iframe выполнит JavaScript-код для снятия отпечатка, после чего отправит POST-запрос на заранее определенный URL запрашивающей стороны. Результат снятия отпечатка 3DS Method привязывается к аутентификации через 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 Method:

<!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 Method

Когда 3DS Method завершен, Подключенная сторона получает HTTP POST запрос на threeDSMethodNotificationURL с данными threeDSMethodData, которые содержат threeDSServerTransID (в JSON с кодировкой base64).

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

threeDSMethodData=eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiJ9Cg
  1. Примените декодирование base64 url для получения JSON, содержащего threeDSServerTransID.

{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2"}

Пример HTML-страницы 3DS Method Done

<!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) Send **/api/v2/status/** API request;
#Turquoise:(2) Process **/api/v2/status/** response.
Gather:
**tds-creq-form-creq**
**tds-creq-form-acs-url**;
#Turquoise:(3) Construct CReq HTML Page based on the gathered parameters.
Add **threeDSSessionData** with the custom data
in the format: Max length: 1024 bytes, format: Alphanumeric,
base64url encoded without padding.;
#Turquoise:(4) Return CReq HTML Page to Payer's browser;
:(5) CReq Page gets redirected to ACS URL **tds-creq-form-acs-url**.
Payer passes 3DS Challenge Verification.
ACS return CRes Page.
CRes Page gets submitted to **notificationURL**;
#Turquoise:(6) Process CRes Page parameters.
Gather parameters:
**cres**
**threeDSSessionData**;
#Turquoise:(7) Send HTTP POST **/api/3ds/v1/upload-cres-result/** API Request
providing **cres**, **orderid=paynet-order-id**;
#Turquoise:(8) Send **/api/v2/status/** API request
Process **/api/v2/status/** response and follow **Схема принятия решений 3DS**.;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend

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

Пример HTML-страницы CReq

HTML-страница CReq перенаправляет браузер плательщика на URL ACS-сервера, указанный в параметре tds-creq-form-acs-url. Результирующее значение CRes будет возвращено от ACS на notificationURL, предоставленный Подключенной стороной в запросе /api/3ds/v1/upload-method-url-result/ во время процесса 3DS 2.x.0 Frictionless.

Поле

Описание

Обязательность

creq

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

Обязательно

threeDSSessionData

значение, которое будет отправлено обратно в CRes на notificationURL в конце процесса. Максимальная длина: 1024 байта, формат: буквенно-цифровой, кодировка Base64url без дополнения (padding).

Опционально

<!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) Send **/api/v2/status/** API request;
#Turquoise:(2) Process **/api/v2/status/** response.
Gather:
**tds-pareq-form-pareq**
**tds-pareq-form-acs-url**;
#Turquoise:(3) Construct PAReq HTML Page based on the gathered parameters.
Add **TermUrl** where the Payer gets redirected back with PARes data submitted.
Add **MD** with the custom data which is be posted back.;
#Turquoise:(4) Return PAReq HTML Page to Payer's browser;
:(5) PaReq Page gets redirected to ACS URL **tds-pareq-form-acs-url**;
:(6) Payer passes 3DS Challenge Verification;
:(7) ACS returns PARes Page;
:(8) PaRes Page gets submitted to the **TermUrl**;
#Turquoise:(9) Process PARes Page parameters.
Gather parameters:
**PaRes**
**MD**;
#Turquoise:(10) Send HTTP POST **/api/3ds/v1/upload-pares-result/** API Request
providing **paRes**, **orderid=paynet-order-id**;
#Turquoise:(11) Send **/api/v2/status/** API request
Process **/api/v2/status/** response and follow **Схема принятия решений 3DS**.;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend

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

Обязательно

MD

Данные Подключенной стороны, которые возвращаются на вашу страницу завершения.

Опционально

PaReq

Данные ACS 3DS PaReq, полученные Подключенной стороной в ответе /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) Send **/api/v2/status/** API request;
#Turquoise:(2) Process **/api/v2/status/** response;
fork
#Turquoise:(3)Gather **html** parameter;
#Turquoise:(4) Return content from **html** parameter to the Payer's browser as is;
forkagain
#Turquoise:(5)Gather **redirect-to** parameter;
#Turquoise:(6)Redirect Payer to redirect URL (value of redirect-to parameter);
endfork
:(7) Payer's browser gets redirected to ACS and Payer passes either 3DS 1.0.2 or 3DS 2.X flow.;
:(8) Payer's browser gets redirected back to **redirect_url** provided in the initial **api/v2/sale/** request.;
#Turquoise:(9) Process Payer's Browser final redirect to **redirect_url**.;
#Turquoise:(10) Return Wait HTML Page to the Payer's browser;
fork
note left
             **Wait HTML Page** lifecycle
end note
repeat
#Turquoise: (11) Request Connecting Party Server on the status of the transaction;
#Turquoise: (12) Process transaction status;
repeat while ((13) Received finished status\n(approved, declined, error, filtered or unknown)?) is (no)
-> (yes);
#Turquoise:(14) Redirect Payer's browser to the result page;
fork again
note left
             **Connecting Party Server** lifecycle
end note
repeat
#Turquoise:(15) Send **/api/v2/status/** API request;
#Turquoise:(16) Process **/api/v2/status/** response;
repeat while ((17) Received final status from "ConnPay") is (no)
-> (yes);
#Turquoise:(18) Save transaction status;
end fork
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend

(1) Для реализации запроса статуса заказа см. /api/v2/status/. Статус следует запрашивать многократно с интервалом 3–5 секунд до получения финального статуса в ответе.
(2) То же, что и в пункте (1).
(6) О реализации финального редиректа см. Final redirect.
(7) HTML-страница ожидания на стороне Подключенной стороны может иметь индивидуальный дизайн и должна взаимодействовать с сервером Подключенной стороны, как показано на диаграмме.
(12) и (13) То же, что и в пункте (1).

Альтернативная аутентификация держателя карты

Платежный шлюз поддерживает альтернативные методы аутентификации держателя карты, если карта не участвует в 3DS (отрицательный ответ 3DS enrollment). Одним из таких методов является проверка случайной суммы. В этом методе Платежный шлюз инициирует дополнительную транзакцию преавторизации для удержания случайной небольшой суммы на счету держателя карты и отправляет специальную форму для ввода плательщиком удержанной суммы. Если сумма указана верно, Платежный шлюз продолжает обработку первоначальной транзакции. Удержание небольшой суммы отменяется автоматически.

Общая диаграмма для транзакций через форму

skinparam roundcorner 20
skinparam sequenceArrowThickness 2
skinparam ParticipantPadding 30
actor Payer as Customer
participant "Connecting Party" as Merchant
participant "Payment Gateway" as g
autonumber
Customer -> Merchant: Checkout
activate Merchant
== Purchase payment request ==
Merchant -> g: Request Initiating
activate g
g --> Merchant: Redirect-url, Order ID
deactivate g
Merchant -> Customer: Provide redirect-url to Payer's browser
activate Customer
Customer -> g: GET redirect-url
deactivate Customer
activate g
g -> Customer: Платежная форма
deactivate g
activate Customer
Customer -> g: Submit Form
deactivate Customer
activate g
g -> g: Transaction processing
g -> g: 3DS Enrollment
g -> g: Random Sum Processing
g -> Customer: Redirecting to the Random Sum Check html form
deactivate g
activate Customer
Customer -> g: The cardholder provides auth data
deactivate Customer
activate g
g -> g: Auth Data Validating
group alt
== Receive Connecting Party Callback ==
Merchant <- g: Сallback with final status
g <-- Merchant: HTTP 200
deactivate g
== Order Status Request ==
Merchant -> g: api/v2/status
activate g
g --> Merchant: Response \nstatus, order-stage
deactivate g
end
Merchant --> Customer: Show result
deactivate Merchant
deactivate Customer

(2) См. соответствующий Use-Case для получения подробностей о конкретной API-команде для инициации транзакции.
(13) О реализации обработки обратного вызова (callback) с финальным статусом см. Connecting Party Callbacks.
(15) Пожалуйста, см. Status List для получения дополнительной информации о финальных статусах.

Общая диаграмма для прямых интеграций

skinparam roundcorner 20
skinparam sequenceArrowThickness 1
skinparam maxmessagesize 1200
skinparam sequenceParticipant underline
actor Payer
participant "Connecting Party" as A
participant "Payment Gateway" as B
autonumber
Payer -> A: Checkout
activate A
A -> B: Payment Initiating
activate B
B --> A: Order ID
B -> B: Transaction processing
group loop
A -> B: Status Request
B --> A: Non-Final Status
end
B -> B: 3DS Enrollment
B -> B: Random Sum Processing
A -> B: Status Request
B -> A: Response with Random Sum Check html form
A -> Payer: Redirecting to the Random Sum Check html form
deactivate B
activate Payer
Payer -> B: Cardholder provides auth data
deactivate Payer
activate B
B -> B: Auth Data Validating
group alt
group Get Final Status
== Receive Connecting Party Callback ==
A <- B: Callback with Final Status
A --> B: HTTP 200
deactivate B
== Order Status Request ==
A -> B: Get Status by Order ID
activate B
B --> A: Response status, \norder-stage
deactivate B
end
A --> Payer: Show result
deactivate A

(2) См. соответствующий Use-Case для получения подробностей о конкретной API-команде для инициации транзакции.
(9) Запрос статуса продолжается параллельно все время, начиная с шага 5.
(11) О реализации обработки обратного вызова (callback) с финальным статусом см. Connecting Party Callbacks.
(13) Пожалуйста, см. Status List для получения дополнительной информации о финальных статусах.