Uma cobrança 3DS2 Malga é uma cobrança que pode ser processada por diferentes provedores de pagamento, sem a necessidade de uma nova autenticação. Ela sempre vai precisar de um token que será gerado na etapa de setup /3ds/setup. Quando uma cobrança é enviada com dados de 3DS, o provedor irá solicitar uma analise ao banco emissor. O banco emissor pode exigir que o cliente faça uma autenticação. Esse processo é conhecido como desafio. Uma cobrança pode ser autorizada pelo banco emissor sem exigir desafio.
A cobrança com desafio exigirá uma ação por parte do usuário para autenticar a cobrança. Nesse caso o usuário será redirecionado ao banco para autenticar a cobrança.

Principais informações

  • setupId: O id do setup que foi criado na etapa de setup
  • requiresLiabilityShift: Indica a ocorrência de mudança de responsabilidade
  • redirectURL: A URL que o provedor irá utilizar para retornar ao site de origem após o redirecionamento
  • requestorURL: A URL do site do portador do cartão
  • browser: Dados do navegador do portador do cartão
  • paymentSource: Dados do cartão
  • cardHolder: Dados do portador do cartão
  • billingAddress: Endereço de cobrança
  • shippingAddress: Endereço para envio

Exemplo de requisição

curl --location --request POST 'https://api.malga.io/v1/charges' \
--header 'X-Client-Id: <YOUR_CLIENT_ID>' \
--header 'X-Api-Key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
   "providerReferenceKey":"2021102501",
   "amount":100,
   "capture":true,
   "paymentSource":{
      "sourceType":"token",
      "tokenId":"ca24d20b-e200-483a-89c0-5bbf52985fb5"
   },
   "paymentMethod":{
      "paymentType":"credit",
      "installments":1
   },
   "statementDescriptor":"Teste 3DS2 malga 1727714326483",
   "paymentFlow":{
      "metadata":{
         "value":"1",
         "brand":"test",
         "outro":"2"
      }
   },
   "threeDSecure2":{
      "requiresLiabilityShift":false,
      "setupId":"62c6d66b-82a1-49d1-8c29-b8bc033eda0a",
      "redirectURL":"http://localhost:3000/checkout.html",
      "requestorURL":"http://localhost:3000",
      "billingAddress":{
         "city":"Aracaju",
         "country":"BR",
         "streetNumber":"177",
         "zipCode":"49089185",
         "state":"Sergipe",
         "street":"Rua J"
      },
      "browser":{
         "ip":"200.53.196.214",
         "userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
         "acceptHeader":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
         "language":"pt-BR",
         "colorDepth":24,
         "screenHeight":1080,
         "screenWidth":1920,
         "timeZoneOffset":"180",
         "javaEnabled":false,
         "javaScriptEnabled":true
      },
      "cardHolder":{
         "email":"email@gmail.com",
         "mobilePhone":"11999998888"
      }
   }
}'

Exemplo de resposta

{
    "id": "c82f13a6-39c7-480d-b8d2-23466efe5638",
    "clientId": "e234eeb3-483d-4df2-87eb-1e2be5cdaccd",
    "merchantId": "1cce7844-d804-451f-ab40-63bff9bf8fcb",
    "description": null,
    "orderId": null,
    "providerReferenceKey": "2021102501",
    "createdAt": "2024-09-30T16:38:46.828Z",
    "amount": 100,
    "originalAmount": 100,
    "currency": "BRL",
    "statementDescriptor": "Teste 3DS2 malga 1727714326483",
    "capture": true,
    "isDispute": false,
    "status": "authorized",
    "responsibleProviderType": "SANDBOX",
    "paymentFlow": {
        "id": "12345fc0-238e-4fd6-af96-8cab57fd6edc",
        "metadata": {
            "outro": "2",
            "value": "1"
        }
    },
    "paymentMethod": {
        "installments": 1,
        "paymentType": "credit"
    },
    "paymentSource": {
        "sourceType": "token",
        "cardId": "c03ad3be-cb9f-498e-863d-6c5d956498ce",
        "tokenId": "ca24d20b-e200-483a-89c0-5bbf52985fb5"
    },
    "transactionRequests": [
        {
            "id": "853f07ed-fe92-4d50-af12-1b2768ac3cbd",
            "createdAt": "2024-09-30T16:38:47.449Z",
            "updatedAt": "2024-09-30T16:38:47.449Z",
            "idempotencyKey": "2021102501",
            "providerId": "56746c7b-c5ac-4ab6-8513-94fa00fa5064",
            "providerType": "SANDBOX",
            "transactionId": "1cf15e8d-6577-4903-9ace-f17d45631ccd",
            "amount": 100,
            "authorizationCode": "5478911",
            "authorizationNsu": "4810708",
            "requestStatus": "success",
            "requestType": "authorization",
            "requestStatusReason": null,
            "responseTs": "20ms",
            "providerAuthorization": {
                "networkAuthorizationCode": "2225272",
                "networkResponseCode": "7784178"
            },
            "threeds": {
                "authenticated": true
            }
        },
        {
            "id": "7682e5a2-e900-4463-bfef-ce954eeb2d96",
            "createdAt": "2024-09-30T16:38:47.278Z",
            "updatedAt": "2024-09-30T16:38:47.278Z",
            "idempotencyKey": "fe0eaa19-4e10-43ef-8aa6-fb5c545c69aa",
            "providerId": null,
            "providerType": "CYBERSOURCE",
            "transactionId": "7277143270166141304951",
            "amount": 100,
            "authorizationCode": null,
            "authorizationNsu": null,
            "requestStatus": "success",
            "requestType": "3DS_authentication_enroll",
            "requestStatusReason": null,
            "responseTs": null,
            "threeds": {
                "cardEnrolled": true,
                "liabilityShift": true
            }
        }
    ],
    "threeDSecure2": {
        "requiresLiabilityShift": false,
        "authenticated": false,
        "version": "2.1.0",
        "offered": false,
        "liabilityShift": true,
        "cardEnrolled": true,
        "cardTokenId": null,
        "offeredType": "Frictionless",
        "redirectURL": "http://localhost:3000/checkout.html",
        "requestorURL": "http://localhost:3000",
        "networkTransactionId": null,
        "browser": {
            "acceptHeader": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "colorDepth": 24,
            "javaEnabled": false,
            "javaScriptEnabled": true,
            "language": "pt-BR",
            "screenHeight": 1080,
            "screenWidth": 1920,
            "timeZoneOffset": "180",
            "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
            "ip": "200.53.196.214"
        },
        "billingAddress": {
            "city": "Aracaju",
            "country": "BR",
            "streetNumber": "177",
            "zipCode": "49089185",
            "state": "Sergipe",
            "street": "Rua J"
        },
        "shippingAddress": null,
        "cardHolder": {
            "email": "email@gmail.com",
            "mobilePhone": "11999998888"
        },
        "authData": {
            "action": "REDIRECT",
            "providerType": "CYBERSOURCE",
            "responseType": "AUTHENTICATION",
            "response": null,
            "networkTransactionId": "7277143270166141304951"
        }
    },
    "appInfo": null
}

A resposta da cobrança irá incluir o objeto authData dentro do objeto threeDSecure2, com dados para a ação de autenticação.

Examinando o objeto authData

  • O atributo action representa que tipo de ação foi solicitada para autenticação.
  • O atributo providerType identifica em qual provedor o 3DS2 foi processado.
  • O atributo responseType mostra qual é a etapa do desafio, podendo ser uma etapa de autenticação ou autorização.
  • O atributo response é um objeto dinâmico com a resposta do provedor com dados para autenticação.
  • O atributo networkTransactionId é o id da autenticação do provedor 3DS.