` below).
**threeDSMethodData construction example**
1. **Construct threeDSMethodData** JSON.
.. code-block:: none
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2","threeDSMethodNotificationURL":"https://connectingparty.com/3ds-method-complete/"}
2. Apply base64 url encoding to resultant JSON.
.. code-block:: none
eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiIsInRocmVlRFNNZXRob2ROb3RpZmljYXRpb25VUkwiOiJodHRwczovL21lcmNoYW50LmNvbS8zZHMtbWV0aG9kLWNvbXBsZXRlLyJ9
**Generate Fingerprint**
The 3DS Method can be optionally used by issuers to gather browser fingerprints using JavaScript. This is done by loading a URL in a hidden iframe, before the authentication. This iframe will then execute some fingerprinting JavaScript, before POST’ing to the prespecified URL belonging to the requestor. The 3DS Method fingerprint result is tied to the authentication by the :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
}
**Construct 3DS Method HTML page example**:
.. code-block:: html
ACS v2 3DS Method ...
.. _frictionless_3ds_method_process_3ds_overview:
Process 3DS Method Notification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When 3DS Method is completed, the Connecting Party receives :code:`HTTP POST` request at :ex:`threeDSMethodNotificationURL` with :code:`threeDSMethodData`, which contains :code:`threeDSServerTransID` (in base64 encoded JSON).
1. Get :code:`threeDSMethodData`.
.. code-block:: js
threeDSMethodData=eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjNkNjcxNjI5LWE0MTAtNGE1ZC05Mjg4LWIzOGNlYWRkNDFmMiJ9Cg
2. Apply base64 url decoding to get JSON, which contains :code:`threeDSServerTransID`.
.. code-block:: json
{"threeDSServerTransID":"3d671629-a410-4a5d-9288-b38ceadd41f2"}
.. _frictionless_3ds_method_done_html_page_overview:
3DS Method Done HTML Page Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: html
ACS v2 3DS Method Notification Handler...
This should not be displayed
.. _3ds_2x_challenge_flow_overview:
3DS 2.x.0 Challenge Flow
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
title 3DS 2.x.0 Challenge Flow
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 Decision Making Schema**.;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend
| (1) To implement order status request see :ref:`/api/v2/status/`. Status should be requested multiple times with 3-5 seconds interval until final status will be received in response.
| (2) The same as point (1).
| (3) To create CReq HTML Page see :ref:`example`.
| (5) To implement CRes redirect see :ref:`CRes redirect`.
| (7) To upload CRes result see :ref:`/api/3ds/v1/upload-cres-result/`.
| (8) The same as point (1).
.. _creqform_example_overview:
CReq HTML Page Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CReq HTML Page redirects the Payer's browser to ACS Server URL, provided in :code:`tds-creq-form-acs-url` parameter. The result CRes value will be returned from ACS to :code:`notificationURL` provided by Connecting Party in :ref:`/api/3ds/v1/upload-method-url-result/` request during 3DS 2.x.0 Frictionless Flow.
.. list-table::
:widths: 20 60 20
:header-rows: 1
:class: longtable
* - Field
- Description
- Necessity
* - :code:`creq`
- ACS 3DS CReq data, which received by the Connecting Party in the :ref:`/api/v2/status/` response. The same as tds-creq-form-creq.
- Required
* - :code:`threeDSSessionData`
- value which will be posted back within CRes to :ex:`notificationURL` at the end of the process. Max length: 1024 bytes, format: Alphanumeric, Base64url encoded without padding.
- Optional
.. code-block:: html
Redirecting ...
.. _3ds_102_authentication_flow_overview:
3DS 1.0.2 Authentication Flow
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
title 3DS 1.0.2 Authentication Flow
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 Decision Making Schema**.;
stop
legend left
=Legend
| Color | Implementation responsibility |
|<#Turquoise>| Connecting party |
| | Other Party |
endlegend
| (1) To implement order status request see :ref:`/api/v2/status/`. Status should be requested multiple times with 3-5 seconds interval until final status will be received in response.
| (2) The same as point (1).
| (3) To construct PaReq HTML Page see :ref:`example`.
| (5) To implement PaRes redirect see :ref:`PaRes redirect`.
| (10) To upload PaRes result see :ref:`/api/3ds/v1/upload-pares-result/`.
| (11) The same as point (10).
.. _pareqform_example_overview:
PaReq HTML Page Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PaReq HTML Page redirects the Payer's browser to ACS Server URL, provided in :code:`tds-pareq-form-acs-url` parameter.
PaReq HTML Page consists of the following parameters:
.. list-table::
:widths: 20 60 20
:header-rows: 1
:class: longtable
* - Field
- Description
- Necessity
* - :code:`tds-pareq-form-acs-url`
- ACS 3DS PaReq URL is received by the Connecting Party in the :ref:`/api/v2/status/` response.
- Required
* - :code:`MD`
- Connecting Party Data, which comes back to your termination page.
- Optional
* - :code:`PaReq`
- ACS 3DS PaReq data, which received by the Connecting Party in the :ref:`/api/v2/status/` response. The same as tds-pareq-form-pareq.
- Required
* - :code:`TermURL`
- URL of termination page, where the Payer gets redirected back with PaRes data submitted.
- Required
.. code-block:: html
Loading acs..
.. _simplified_authentication_flow_overview:
Simplified Authentication Flow
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. uml::
:align: center
title Simplified Authentication Flow
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) To implement order status request see :ref:`/api/v2/status/`. Status should be requested multiple times with 3-5 seconds interval until final status will be received in response.
| (2) The same as point (1).
| (6) To implement final redirect see :ref:`Final redirect`.
| (7) The HTML wait page on Connecting Party side can have custom design and should communicate with Connecting Party server as described on the diagram.
| (12) and (13) The same as point (1).
.. _alternative_cardholder_authentication:
Alternative cardholder authentication
-----------------------------------------------------------------------------------------
Payment Gateway supports alternative methods for cardholder authentication if card is not enrolled to 3DS (negative 3DS enrollment response). One of such methods is random sum check. In this method, Payment Gateway initiates an additional preauthorization transaction to hold a random small amount on cardholder’s account and sends a special form for the Payer to enter the amount being held. If the amount is correct, Payment Gateway continues to process the initial transaction. The small amount hold is cancelled automatically.
General diagram for form transactions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. 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: Payment Form
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) See relevant Use-Case to get details about the exact API command to initiate transaction.
| (13) To implement callback with final status handling see :ref:`Connecting Party Callbacks`.
| (15) Please see :ref:`Status List` to get more information about Final Statuses.
General diagram for direct integrations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. 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) See relevant Use-Case to get details about the exact API command to initiate transaction.
| (9) Status Request continues in parallel all the time starting from step 5.
| (11) To implement callback with final status handling see :ref:`Connecting Party Callbacks`.
| (13) Please see :ref:`Status List` to get more information about Final Statuses.