Rozszerzenia API
W celu spełnienia wymagań zawartych w standardzie 3DS 2, REST API zostało rozszerzone o nowe pola. Aby nie zakłócać istniejących integracji, dodatkowe pola nie są wymagane. Jednakże, zgodnie ze standaradem 3DS 2, niektóre pola są obowiązkowe, dlatego w przypadku gdy ich nie wyślesz, zostaną domyślnie załączone przez PayU.
Pola wymagane w standardzie 3DS 2
Jedynie interfejs REST API został wzbogacony o nowe parametry związane z 3DS 2.
Rekomendujemy aby wysyłać poniższe pola dla wszystkich transakcji, które mogą buć uwierzytelniane w standardzie 3DS 2:
- transakcje z polem
payMethods.payMethod.value
ustawionym na jedną z płatności kartowych: c, ap, jp, ma, vc, - transakcje z polem
payMethods.payMethod.type
ustawionym na CARD_TOKEN, - transakcje z obiektem
payMethods.card
, - transakcje bez obiektu
payMethods
(w przypadku gdy na POS masz skonfigurowaną jakąkolwiek płatność kartową).
Poniższa tabela zawiera parametry wymagane przez standard 3DS 2. Jest to minimum informacji, które są oczekiwane przy próbie uwierzytelnienia tym protokołem. Jeżeli pola nie zostaną przez Ciebie wypełnione, PayU prześle je z domyślnymi wartościami.
Parametr | Komentarz |
---|---|
buyer.phone | Powinno się korzystać z formatu +[kod kraju] [numer], np. +48 225108001 |
buyer.delivery | Wysyłane jako "adres do wysyłki" podczas uwierzytelnienia 3DS 2. Zwróć uwagę, że pole <state>state</state> w obiekcie buyer.delivery jest wymagane i jego wartość powinna być poprawnym kodem ISO 3166-2 (np. "UT" dla Utah w USA lub "30" dla "Wielkopolskie" w Polsce). |
threeDsAuthentication.cardholder.name | Imię i nazwisko nadrukowane na karcie. Jeżeli nie zostanie wypełnione wartość zostanie wygenerowana z buyer.firstName i buyer.lastName . W przypadku braku tych wartości, przesłana zostanie wartość domyślna. |
threeDsAuthentication.cardholder.billingAddress | Zwróć uwagę, że pole state w obiekcie billingAddress jest wymagane i jego wartość powinna być poprawnym kodem ISO 3166-2 (np. "UT" dla Utah w USA lub "30" dla "Wielkopolskie" w Polsce). |
threeDsAuthentication.browser | Jeżeli ten parametr nie zostanie wysłany i obiekt sdk nie istnieje, zostanie stworzony domyślny obiekt (browser.requestIp zostanie zmapowane na podstawie customerIp ). |
threeDsAuthentication.recurring | W przypadku płatności cyklicznych (tj. transakcji oznaczonych za pomocą pola recurring o wartości FIRST lub STANDARD) sugerowane jest wysłanie tych danych w celu odpowiedniego oznaczenia typu uwierzytelnienia. |
threeDsAuthentication.sdk | Musi zostać wysłany, aby uwierzytelnienie zostało przeprowadzone w trybie "sdk". Ta wartość nie jest wysyłana domyśnie. Jeżeli parametr nie jest obecny, zakładany jest tryb "przeglądarkowy". |
Szczegółowe informacje na temat parametrów znajdziesz w sekcji Create an Order w naszej referencji API.
Przykład zamówienia
W tej sekcji znajduje się przykładowe zamówienie z minimalnymi danymi, które są wymagane przez PayU. Zamówienie zawiera również dane wymagane przez standard 3DS 2, które nie zostały uznane za obowiązkowe przez PayU.
- Produkcja
- Sandbox
curl -X POST https://secure.payu.com/api/v2_1/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" \
-d '{
"continueUrl": "http://www.payu.pl",
"customerIp": "216.72.35.5",
"merchantPosId": "145227",
"description": "Order with 3DS 2 required fields",
"currencyCode": "PLN",
"totalAmount": 300,
"products": [
{
"name": "a product",
"unitPrice": 300,
"quantity": 1
}
],
"buyer": {
"firstName": "John",
"lastName": "Doe",
"phone": "+48 555555555",
"email": "john@doe.pl",
"delivery": {
"street": "Delivery St. 1",
"postalCode": "55-033",
"city": "Delivery Town",
"state": "30",
"countryCode": "PL"
}
},
"threeDsAuthentication": {
"cardholder": {
"name": "Joe Doe",
"billingAddress": {
"street": "Billing St. 1",
"postalCode": "33-055",
"city": "Billington",
"state": "30",
"countryCode": "PL"
}
},
"browser": {
"acceptHeaders": "*/*",
"screenWidth": "1536",
"javaEnabled": false,
"timezoneOffset": "-120",
"screenHeight": "864",
"requestIP": "216.72.35.5",
"language": "en",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0",
"colorDepth": "24"
}
}
}'
curl -X POST https://secure.snd.payu.com/api/v2_1/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer d9a4536e-62ba-4f60-8017-6053211d3f47" \
-d '{
"continueUrl": "http://www.payu.pl",
"customerIp": "216.72.35.5",
"merchantPosId": "300746",
"description": "Order with 3DS 2 required fields",
"currencyCode": "PLN",
"totalAmount": 300,
"products": [
{
"name": "a product",
"unitPrice": 300,
"quantity": 1
}
],
"buyer": {
"firstName": "John",
"lastName": "Doe",
"phone": "+48 555555555",
"email": "john@doe.pl",
"delivery": {
"street": "Delivery St. 1",
"postalCode": "55033",
"city": "Delivery Town",
"state": "30",
"countryCode": "PL"
}
},
"threeDsAuthentication": {
"cardholder": {
"name": "Joe Doe",
"billingAddress": {
"street": "Billing St. 1",
"postalCode": "33055",
"city": "Billington",
"state": "30",
"countryCode": "PL"
}
},
"browser": {
"acceptHeaders": "*/*",
"screenWidth": "1536",
"javaEnabled": false,
"timezoneOffset": "-120",
"screenHeight": "864",
"requestIP": "216.72.35.5",
"language": "en",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0",
"colorDepth": "24"
}
}
}'
Odpowiedź do zamówienia z 3DS 2
Zmiany w odpowiedziach zawarte w tym podrozdziale dotyczą żądań z danymi karty (tokenizowanymi przez PayU , tokenizowanymi przez Google Pay lub w postaci tekstowej ), zawartymi w obiekcie payMethod
.
Tryb przeglądarkowy
Istniejąca odpowiedź ze statusem WARNING_CONTINUE_3DS została rozszerzona o pola threeDsProtocolVersion
(obecnie zawsze 3DS2) i iframeAllowed
. Wartości te wskazują na to, że parametr redirectUri
może zostać wyświetlony w ramce iframe. Jeśli interesuje cię wykorzystanie ramki iframe zamiast pełnego przekierowania, zobacz sekcję Strona uwierzytelniania.
{
"status": {
"statusCode": "WARNING_CONTINUE_3DS",
"severity": "WARNING"
},
"redirectUri": "{redirectUri}",
"iframeAllowed": true,
"threeDsProtocolVersion": "3DS2",
"orderId": "QK52JR2VCR201023GUEST000P01"
}
Tryb sdk
Parametr redirectUri
nie będzie miał zastosowania w aplikacjach mobilnych natywnie obsługujących uwierzytelnienie 3DS 2.
Zamiast tego, w odpowiedzi zostanie zwrócony obiekt challengeParameters
, który powinien być przekazany do aplikacji mobilnej.
{
"status": {
"statusCode": "SUCCESS",
"statusDesc": "Request successful"
},
"threeDsProtocolVersion": "3DS2",
"challengeParameters": {
"threeDsServerTransactionId": "0016f22b-f988-4358-b2c6-8917bba22037",
"acsTransID": "d7c1ee99-9478-44a6-b1f2-391e29c6b340",
"acsReferenceNumber": "3DS_LOA_ACS_201_13579",
"acsSignedContent": "someBase64encodedString"
},
"orderId": "JQC8TR8L4J201023GUEST000P01"
}
Szczegóły 3DS w danych transakcji
Możesz pobrać dane transakcji jeżeli zamówienie zostało odrzucone lub zakończone pomyślnie. Szczegóły parametrów zwracanych dzięki temu serwisowi znajdziesz w sekcji Retrieve a Transaction w naszej referencji API. Ta sekcja skupia się na wyjaśnieniu szczegółów odpowiedzi 3DS, na którą składają się poniższe pola:
cardEciCode
card3DsStatus
card3DsFrictionlessIndicator
card3DsStatusDescription
ECI
ECI (Electronic Commerce Indicator) wskazuje poziom uwierzytelnienia transakcji. W praktyce, informuje o stronie odpowiedzialnej w sytuacji wystąpienia oszustwa związanego z obciążeniem zwrotnym (chargeback).
W przypadku próby uwierzytelnienia (attempted authentication) i pełnego uwierzytelnia (full authentication) odpowiedzialność leży po stronie wystawcy karty, w innych przypadkach odpowiedzialność ponosi merchant, przy czym:
-
full authentication nie wskazuje czy transakcja była uwierzytelnionia wraz z wyzwaniem (czy właściciel karty musiał wykonać dodatkową akcję, zgodną z wymogiem Strong Customer Authentication) lub bez udziału właściciela karty (frictionless).
-
attempted authentication oznacza, że PayU próbowało uwierzytelnić transakcję, ale wystawca karty nie był w stanie przeprowadzić uwierzytelnienia (w większości przypadków spowodowane to jest brakiem przypisania karty do usługi 3DS).
W przypadku kart Mastercard, może zaistnieć sytuacja, w której nieuwierzytelniona transakcja podlega przetwarzaniu 3DS określonego jako data-only (oficjalnie: Digital Transaction Insights). Przesłanie data-only wzbogaca podpowiedzi, które Mastercard przekazuje wystawcy karty. Nie powoduje to jednak, że transakcja będzie traktowana jako uwierzytelniona.
Poziom uwierzytelnienia | Visa | Mastercard |
---|---|---|
Pełne uwierzytelnienie. Odpowiedzialność po stronie wystawcy karty. | 5 | 2 |
Próba Uwierzytelnienia częściowo udana. Wystawca karty nie uczestniczy w weryfikacji lub karta nie kwalifikuje się do uwierzytelnienia, lub serwer kontrolny wystawcy (ACS) nie jest aktualnie dostępny. Odpowiedzialność po stronie wystawcy karty. | 6 | 1 |
Brak uwierzytelnienia. Odpowiedzialność po stronie Merchanta. | 7 | 0 |
Brak uwierzytelnienia, dane z 3DS zostały wysłane do systemu karty płatniczej. | 4 | |
Pełne uwierzytelnienie, transakcja cykliczna | 7 |
Nie jest to pełna lista dostępnych kodów ECI, obejmuje ona jedynie wartości, które można otrzymać w danych transakcyjnych.
Status 3DS
Status | Opis |
---|---|
Y | Uwierzytelnienie zakończone pomyślnie. |
N | Brak uwierzytelnienia (zwykle z powodu nieudanego "wyzwania"). |
U | Nie można było uwierzytelnić (problem techniczny, karta nie przypisana do 3DS lub uwierzytelnienie data-only). |
A | Próba przetworzona (brak uwierzytelnienia, ale został przedstawiony dowód na próbę uwierzytelnienia). |
R | Odrzucone ( silniejsza wersja statusu N, wystawca karty odrzuca ją bez zainicjowania "wyzwania"). |
I | Status informacyjny (wydawca karty zaakceptował wyjątek od silnego uwierzytelnienia). |
Nie jest to pełna lista statusów 3DS 2, obejmuje ona jedynie wartości, które można otrzymać w danych transakcyjnych.
Wskaźnik frictionless
Kod ECI nie wskazuje czy transakcja została uwierzytelniona poprzez wyzwanie.
Aby pomóc rozróżnić czy właściciel karty został "wyzwany" przez wystawcę karty, PayU przesyła dodatkowe pole, które nie jest częścią standardu 3DS 2. Wyzwanie może przyjąć formę, np.
- potwierdzenia transakcji w aplikacji mobilnej (out of bound authentication),
- konieczności wprowadzenia jednorazowego hasła (OTP, zwykle wysłane jako wiadomość SMS - dynamic authentication) lub konieczności wprowadzenia statycznego hasła (static authentication).
Wyzwanie nie musi oznaczać silnego uwierzytelnienia kupującego (SCA) wymaganego w krajach Europejskiego Obszaru Gospodarczego. Wynika to z faktu, że SCA wymaga uwierzytelnienia dwuskładnikowego (2FA - Two-Factor Athentication), a wystawca karty może zastosować tylko jedną metodę uwierzytelnienia. W przypadku wystawców kart z EOG, można założyć, że wyzwanie oznacza SCA, jednakże ta zasada nie musi dotyczyć wystawców z innych regionów.
Possible values of frictionless indicator:
- YES
- NO
- UNKNOWN
Opisy statusów 3DS
Opis statusu 3DS przedstawia szczegóły odpowiedzi 3DS i jest tablicą oddzielonych przecinkami pól danych 3DS 2. Wartości elementów są opisowymi reprezentacjami kodów 3DS 2 specyficznych dla danego pola.
Elementy tablicy opisane są w poniższej tabeli. Należy pamiętać, że ze względu na dużą ilość możliwych wartości nie są one wyliczone (jednak najczęstsze kombinacje zostały omówione w sekcji poniżej).
Same wartości są w większości przypadków opisami kodów określonych w standardzie 3DS 2 i zaczerpnięte zostały ze specyfikacji. Sam standard wyjaśnia znaczenie danego pola, ale nie wyjaśnia szczegółowo jakie wartości może ono przyjmować. Dlatego użycie poszczególnych wartości zależy od konkretnej implementacji. Przykładowo, potwierdzenie transakcji w aplikacji mobilnej może być przez jednego wystawcę oznaczone jako dynamic authentication, a przez innego jako out of bound.
Pozycja | Źródło | Komentarz |
---|---|---|
0 | wersja 3DS 2 | Określa numer wersji wiadomości (obecnie 2.1.0 lub 2.2.0). |
1 | Kanał urządzenia | Określa czy uwierzytelnienie miało miejsce w przeglądarce czy w natywne w aplikacji mobilnej. Obecnie jest to zawsze tryb "przeglądarkowy" (browser). |
2 | Indykator realizacji metody 3DS | Określa czy wystawca karty powiadomił o zakończeniu pobierania unikalnych cech urządzenia (fingerprinting) poprzez ukrytą ramkę iframe wyswietlaną w przeglądarce. |
3 | Typ uwierzytelnienia | Dotyczy uwierzytelnienia z "wyzwaniem". Najczęściej spotykane wartości to dynamic authentication i out of bound. Więcej informacji na temat "wyzwania" znajdziesz w sekcji Wskaźnik frictionless. |
4 | Odrzucenie "wyzwania" | Dotyczy uwierzytelnienia z "wyzwaniem". Określa czy "wyzawanie" zostało anulowane i dlaczego. |
5 | Przyczyna zaistniałego statusu transakcji | Informuje dlaczego pole status ma określoną wartość. |
Przykłady
Poniżej znajdziesz najczęściej występujące opisy statusów 3DS:
//Metoda 3DS nie została zastosowana, "wyzwanie" zostało zainicjowane.
"cardEciCode": "2",
"card3DsStatus": "Y",
"card3DsFrictionlessIndicator": "NO",
"card3DsStatusDescription": "MessageVersion=2.1.0,browser flow,3DS method not available,dynamic authentication,no cancel indicator,no status reason"
//Metoda 3DS została zastosowana, "challenge" nie został zainicjowany.
"cardEciCode": "5",
"card3DsStatus": "Y",
"card3DsFrictionlessIndicator": "YES",
"card3DsStatusDescription": "MessageVersion=2.2.0,browser flow,3DS method completed,frictionless authentication,no challenge,no status reason"
"cardEciCode": "4",
"card3DsStatus": "U",
"card3DsFrictionlessIndicator": "YES",
"card3DsStatusDescription": "MessageVersion=2.1.0,browser flow,3DS method not available,frictionless authentication,no challenge,data-only"
//Właściciel karty nie wykonał "wyzwania" i transakcja została zakończona przez wystawcę karty.
"cardEciCode": "0",
"card3DsStatus": "N",
"card3DsFrictionlessIndicator": "NO",
"card3DsStatusDescription": "MessageVersion=2.1.0,browser flow,3DS method not available,out of band authentication,challenge displayed - ACS timeout,timed out at ACS"
//Właściciel karty odrzucił "wyzwanie".
"cardEciCode": "7",
"card3DsStatus": "N",
"card3DsFrictionlessIndicator": "NO",
"card3DsStatusDescription": "MessageVersion=2.1.0,browser flow,3DS method not available,dynamic authentication,challenge canceled by cardholder,authentication failed"
//"Wyzwanie" nie zostało wyświetlone i transakcja została zakończona przez wystawcę karty.
//Najczęściej, "challenge" nie zostaje wyświetlony ponieważ nie wykonano przekierowania na adres URL strony uwierzytelniającej zwrócony przez PayU.
"cardEciCode": "7",
"card3DsStatus": "N",
"card3DsFrictionlessIndicator": "NO",
"card3DsStatusDescription": "MessageVersion=2.1.0,browser flow,3DS method not available,dynamic authentication,challenge not displayed,timed out at ACS"