`).
**Пример формирования threeDSMethodData**
1. **Сформируйте JSON** threeDSMethodData.
.. code-block:: none
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://connectingparty.com/3ds-method-complete/"}
2. Примените кодирование base64 url к результирующему JSON.
.. code-block:: none
eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiIsInRocmVlRFNNZXRob2ROb3RpZmljYXRpb25VUkwiOiJodHRwczovL21lcmNoYW50LmNvbS8zZHMtbWV0aG9kLWNvbXBsZXRlLyJ9
**Генерация Fingerprint**
3DS Method может опционально использоваться эмитентами для сбора отпечатков браузера (fingerprints) с помощью JavaScript. Это делается путем загрузки URL в скрытом iframe перед аутентификацией. Этот iframe выполнит JavaScript-код для снятия отпечатка, после чего отправит POST-запрос на заранее определенный URL запрашивающей стороны. Результат снятия отпечатка 3DS Method привязывается к аутентификации через :code:`threeDSServerTransID`.
.. code-block:: js
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**:
.. code-block:: html
ACS v2 3DS Method ...
.. _frictionless_3ds_method_process_3ds_overview:
Обработка уведомления 3DS Method
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Когда 3DS Method завершен, Подключенная сторона получает :code:`HTTP POST` запрос на :ex:`threeDSMethodNotificationURL` с данными :code:`threeDSMethodData`, которые содержат :code:`threeDSServerTransID` (в JSON с кодировкой base64).
1. Получите :code:`threeDSMethodData`.
.. code-block:: js
threeDSMethodData=eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiJ9Cg
2. Примените декодирование base64 url для получения JSON, содержащего :code:`threeDSServerTransID`.
.. code-block:: json
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2"}
.. _frictionless_3ds_method_done_html_page_overview:
Пример HTML-страницы 3DS Method Done
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: html
ACS v2 3DS Method Notification Handler...
This should not be displayed
.. _3ds_2x_challenge_flow_overview:
Процесс 3DS 2.x.0 Challenge
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
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) Для реализации запроса статуса заказа см. :ref:`/api/v2/status/`. Статус следует запрашивать несколько раз с интервалом 3-5 секунд до получения финального статуса в ответе.
| (2) То же, что и в пункте (1).
| (3) О создании HTML-страницы CReq см. :ref:`пример`.
| (5) О реализации редиректа CRes см. :ref:`CRes redirect`.
| (7) Для загрузки результата CRes см. :ref:`/api/3ds/v1/upload-cres-result/`.
| (8) То же, что и в пункте (1).
.. _creqform_example_overview:
Пример HTML-страницы CReq
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HTML-страница CReq перенаправляет браузер плательщика на URL ACS-сервера, указанный в параметре :code:`tds-creq-form-acs-url`. Результирующее значение CRes будет возвращено от ACS на :code:`notificationURL`, предоставленный Подключенной стороной в запросе :ref:`/api/3ds/v1/upload-method-url-result/` во время процесса 3DS 2.x.0 Frictionless.
.. list-table::
:widths: 20 60 20
:header-rows: 1
:class: longtable
* - Поле
- Описание
- Необходимость
* - :code:`creq`
- Данные ACS 3DS CReq, полученные Подключенной стороной в ответе :ref:`/api/v2/status/`. То же, что и tds-creq-form-creq.
- Обязательно
* - :code:`threeDSSessionData`
- значение, которое будет отправлено обратно в CRes на :ex:`notificationURL` в конце процесса. Максимальная длина: 1024 байта, формат: буквенно-цифровой, кодировка Base64url без дополнения (padding).
- Опционально
.. code-block:: html
Redirecting ...
.. _3ds_102_authentication_flow_overview:
Процесс аутентификации 3DS 1.0.2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
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) Для реализации запроса статуса заказа см. :ref:`/api/v2/status/`. Статус следует запрашивать несколько раз с интервалом 3-5 секунд до получения финального статуса в ответе.
| (2) То же, что и в пункте (1).
| (3) О создании HTML-страницы PaReq см. :ref:`пример`.
| (5) О реализации редиректа PaRes см. :ref:`PaRes redirect`.
| (10) Для загрузки результата PaRes см. :ref:`/api/3ds/v1/upload-pares-result/`.
| (11) То же, что и в пункте (10).
.. _pareqform_example_overview:
Пример HTML-страницы PaReq
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HTML-страница PaReq перенаправляет браузер плательщика на URL ACS-сервера, указанный в параметре :code:`tds-pareq-form-acs-url`.
HTML-страница PaReq состоит из следующих параметров:
.. list-table::
:widths: 20 60 20
:header-rows: 1
:class: longtable
* - Поле
- Описание
- Необходимость
* - :code:`tds-pareq-form-acs-url`
- URL ACS 3DS PaReq, полученный Подключенной стороной в ответе :ref:`/api/v2/status/`.
- Обязательно
* - :code:`MD`
- Данные Подключенной стороны, которые возвращаются на вашу страницу завершения.
- Опционально
* - :code:`PaReq`
- Данные ACS 3DS PaReq, полученные Подключенной стороной в ответе :ref:`/api/v2/status/`. То же, что и tds-pareq-form-pareq.
- Обязательно
* - :code:`TermURL`
- URL страницы завершения, на которую плательщик перенаправляется обратно с переданными данными PaRes.
- Обязательно
.. code-block:: html
Loading acs..
.. _simplified_authentication_flow_overview:
Упрощённый процесс аутентификации
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
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 "Payneteasy") is (no)
-> (yes);
#Turquoise:(18) Save transaction status;
end fork
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend
| (1) Для реализации запроса статуса заказа см. :ref:`/api/v2/status/`. Статус следует запрашивать несколько раз с интервалом 3-5 секунд до получения финального статуса в ответе.
| (2) То же, что и в пункте (1).
| (6) О реализации финального редиректа см. :ref:`Final redirect`.
| (7) HTML-страница ожидания на стороне Подключенной стороны может иметь индивидуальный дизайн и должна взаимодействовать с сервером Подключенной стороны, как показано на диаграмме.
| (12) и (13) То же, что и в пункте (1).
.. _alternative_cardholder_authentication:
Альтернативная аутентификация держателя карты
-----------------------------------------------------------------------------------------
Платежный шлюз поддерживает альтернативные методы аутентификации держателя карты, если карта не участвует в 3DS (отрицательный ответ 3DS enrollment). Одним из таких методов является проверка случайной суммы. В этом методе Платежный шлюз инициирует дополнительную транзакцию преавторизации для удержания случайной небольшой суммы на счету держателя карты и отправляет специальную форму для ввода плательщиком удержанной суммы. Если сумма указана верно, Платежный шлюз продолжает обработку первоначальной транзакции. Удержание небольшой суммы отменяется автоматически.
Общая диаграмма для транзакций через форму
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
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) Для имплементации обратного вызова с обработкой финального статуса см.:ref:`Обратный вызов Присоединяющейся Стороны`.
| (15) Пожалуйста, см. :ref:`Status List` для получения дополнительной информации о финальных статусах.
Общая диаграмма для прямых интеграций
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
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) Для обработки обратного вызова с окончательным статусом заказа см.:ref:`Обратный вызов Присоединяющейся Стороны`.
| (13) Пожалуйста, см. :ref:`Status List` для получения дополнительной информации о финальных статусах.
.. ifconfig:: "doc.payneteasy.com" in site_link
----
.. admonition:: See also
:class: related-cross-link
`3DS Adapter — unobtrusive Strong Customer Authentication → `_
.. ifconfig:: "doc.payneteasy.ru" in site_link
----
.. admonition:: См. также
:class: related-cross-link
`Платформа Payneteasy: 3DS, токенизация, безопасность → `_