# Criar um pagamento autenticado com 3DS

This document applies to the following countries:
Brasil | Chile | México | Espanha | Uruguai
---|---|---|---|---|

No Web Checkout da Getnet, o **3D Secure (3DS)** é um protocolo adicional de autenticação, usado em pagamentos online com cartão para verificar a identidade do portador do cartão junto ao banco emissor durante o processo de checkout. Quando uma transação é enviada pelo Web Checkout, o banco emissor pode exigir que o cliente conclua uma etapa de autenticação, como uma senha de uso único (OTP), verificação biométrica ou confirmação no aplicativo do banco.

Dependendo da avaliação de risco, a autenticação pode ocorrer por meio de um **fluxo frictionless** (sem interação do cliente) ou um **fluxo de challenge** (exigindo verificação do usuário). Esse mecanismo ajuda a reduzir fraudes e aumenta a segurança das transações sem cartão presente.

Para entender as regras de cada país, consulte o documento [3DS Authentication](/pt/web-checkout/core-concepts-wbc/3ds-authentication-wbc).

## Requisitos

Antes de seguir as etapas, você precisa:

* Configurar seu Web Checkout via [Portal](/pt/web-checkout/first-steps-wbc/configuration-by-portal) ou via [API](/pt/web-checkout/first-steps-wbc/configration-by-api) (dependendo da sua localização).
* Gerar seu token seguindo o documento de [Authentication](/pt/web-checkout/first-steps-wbc/authentication-token-wbc).

### Payment intent com 3DS

O fluxo consiste na validação do cartão, tokenização de dados sensíveis e armazenamento seguro.

Após a conclusão desse processo, um webhook contendo o `card_id` é enviado. Esse identificador representa a referência tokenizada do cartão armazenado.
Usando esse identificador, o Merchant pode realizar novas transações por meio do endpoint de autorização da Regional API, informando apenas o `card_id` na requisição, sem precisar enviar novamente todos os dados do cartão.

<Callout type="warning">

O 3DS atua como uma importante barreira de segurança e, por esse motivo, não é recomendável desativá-lo para todos os pagamentos.

</Callout>

Para passar pela autenticação 3DS, estes parâmetros devem ser enviados no payment intent.

Endpoint|
---|
`POST /payment-intent`|

**Campos obrigatórios**
| Atributo | Tipo | Descrição | Exemplo |
|---|---|---|---|
|`configurations`| Object | Conjunto de opções de pagamento. | -- |
|`preauthorization`| Boolean | Indica se é um pagamento do tipo pré-autorizado. | `false`|
|`card_verification`| Boolean | Indica se é um pagamento do tipo verificação de cartão. | `false` |
|`3ds`| Boolean | Indica se é um pagamento do tipo 3DS. | `true`|

O bloco de código a seguir mostra os campos que devem ser enviados no [endpoint do payment intent](https://docs.globalgetnet.com/en/products/online-payments/web-checkout/swagger#tag/payment-intent/post/payment-intent).

```json
"configurations": {
        "preauthorization": false,
        "card_verification": false,
        "3ds": true
    }
```

> **Argentina**: `card_verification` e `preauthorization` **não estão disponíveis** para a Argentina.

## Entendendo o processo de autenticação 3DS

O emissor do cartão determina dinamicamente o fluxo de autenticação com base na avaliação de risco, na bandeira do cartão e nas capacidades do emissor. Depois que você inicia o enrollment, a API retorna um campo `status` que determina sua próxima ação.

Trate os três cenários possíveis:

1. **Autenticação direta**: o emissor autentica o portador do cartão imediatamente (status: `Authenticated` ou `Attempt`).
2. **Challenge necessário**: o emissor exige verificação interativa do portador do cartão (status: `Pending Challenge`). Escolha entre renderizar um template HTML ou realizar um POST manual usando os dados do **ACS Direct Form**.
3. **Continuação de enrollment pendente**: o emissor exige processamento adicional antes de atingir um estado final (status: `Pending Enrollment Continue`). Essa etapa pode resultar em autenticação ou em um challenge.

## Referência rápida: fluxo de decisão

Siga esta lógica de decisão com base no `status` retornado pela API:

**Após o Passo 2 (Iniciar o enrollment):**

* **`Authenticated` ou `Attempt`**: prossiga para [Passo 4: Criar o pagamento](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).
* **`Pending Challenge`**: redirecione o cliente usando `redirect_html_template` ou `acs_redirect_form`. Após a conclusão do challenge, prossiga para [Passo 3B: Validar autenticação](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3b-validate-authentication), depois para [Passo 4: Criar o pagamento](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).
* **`Pending Enrollment Continue`**: prossiga para [Passo 3C: Continuar o enrollment](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3c-continue-enrollment).

---

## Etapas de implementação

### Passo 1: Obter o access token e tokenizar o cartão

1. Solicite um access token usando suas credenciais de API.
2. Tokenize as informações do cartão usando o [endpoint de token](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/cards/POST/dpm/cofre-gw-proxy/v1/tokens/card).

### Passo 2: Iniciar o enrollment

Chame o endpoint [3DS - Init Authentication](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/enrolments-initial). Inclua o objeto `extra_fields` com endereço de cobrança, endereço de entrega, detalhes do navegador e informações do cliente para oferecer suporte a uma avaliação de risco precisa.

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/enrolments-initial \
  --header 'authorization: Bearer ' \
  --header 'content-type: application/json' \
  --data '{
  "currency": "CLP",
  "md": "NmQyZTQzODAtZDhhMy00Y2NiLTkxMzgtYzI4OTE4MjgxOGE0",
  "term_url": "123",
  "amount": 1,
  "payment_method": {
    "expiration_month": "05",
    "expiration_year": "25",
    "security_code": "282",
    "number_token": "4292b573ea94b257dcb132afe242b4a15c9866d16e2d4d64d8e571c877af0540c3946b8bddaf37c2c75a1810863fc6b0fe0e841ebbc752c1d23ccfb5fdaac3d1"
  },
  "description": "TEST",
  "operation": "CREDIT",
  "extra_fields": {
    "billing_address": {
      "street": "Av. Brasil",
      "number": "1000",
      "complement": "Sala 1",
      "district": "São Geraldo",
      "city": "Porto Alegre",
      "state": "RS",
      "country": "BR",
      "postal_code": "90230060",
      "reference": "Near the hospital"
    },
    "shipping_address": {
      "street": "Av. Brasil",
      "number": "1000",
      "complement": "Sala 1",
      "district": "São Geraldo",
      "city": "Porto Alegre",
      "state": "RS",
      "country": "BR",
      "postal_code": "90230060",
      "reference": "Near the hospital"
    }
  }
}'
```

**Exemplo de resposta (Pending Challenge):**

```json
{
  "transaction_id": "84c05897-fbf1-4a91-90e8-d292a0fda1c8",
  "status": "Pending Challenge",
  "protocol": "3DS2.3.1",
  "redirect_html_template": "<html>...</html>",
  "acs_redirect_form": {
    "action_url": "https://3ds-acs.test.modirum.com/mdpayacs/creq;token=368800071.1773147207.lksz3Q5MLGPuP5RsNmoU_8831PDCBLY_ABFB5xq0wtc",
    "method": "POST",
    "creq": "ewogICAgImFjc1RyYW5zSUQiOiAiNjVhMWUxN2MtZWVmYS00NGU1LTgyMDEtMDI4MjM5ZTVmOTA3IiwKICAgICJjaGFsbGVuZ2VXaW5kb3dTaXplIjogIjAzIiwKICAgICJtZXNzYWdlVHlwZSI6ICJDUmVxIiwKICAgICJtZXNzYWdlVmVyc2lvbiI6ICIyLjMuMSIsCiAgICAidGhyZWVEU1NlcnZlclRyYW5zSUQiOiAiZjI0ZmZhMWItMWY5MC01ZjMxLTgwMDAtMDAwMDAyYmY4Yjc3Igp9",
    "threeDSSessionData": "NmQyZTQzODAtZDhhMy00Y2NiLTkxMzgtYzI4OTE4MjgxOGE0"
  }
}

```

### Passo 3: Verificar o status e seguir o cenário apropriado

#### Status: `Authenticated` ou `Attempt`

Extraia os dados de autenticação (`xid`, `eci`, `cavv`, `ds_trans_id`) e prossiga para [Passo 4: Criar o pagamento](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).

#### Status: `Pending Challenge`

Redirecione o cliente para o banco para que ele conclua a autenticação. Escolha um dos métodos de redirecionamento a seguir:

**Opção A: template HTML**

Extraia e renderize o `redirect_html_template` diretamente na sua aplicação. O template contém um formulário de envio automático que redireciona o cliente para a página de autenticação do banco.

**Exemplo — renderizando o template HTML no lado do cliente:**

```html
<!-- In your frontend application -->
<div id="challenge-container"></div>
<script>
// Receive the redirect_html_template from your backend
const redirectHtmlTemplate = response.redirect_html_template;
// Inject the HTML into your page
document.getElementById('challenge-container').innerHTML = redirectHtmlTemplate;
// The template contains a form that will automatically submit and redirect
// the customer to their bank's authentication page
</script>
```

**Exemplo — renderizando o template HTML no lado do servidor:**

```javascript
// Node.js/Express example
app.post('/initiate-3ds', async (req, res) => {
  const enrollmentResponse = await fetch('https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/enrolments-initial', {
    // ... request configuration
  });
  const data = await enrollmentResponse.json();
  if (data.status === 'Pending Challenge') {
    // Send the HTML template directly to the browser
    res.send(data.redirect_html_template);
  }
});
```

**Opção B: ACS Direct Form**

Use o objeto `acs_redirect_form` para realizar uma requisição POST manual a partir do navegador do cliente. Esse método é preferível porque evita scripts de terceiros e permite exibir uma UI de carregamento personalizada durante o redirecionamento.

**Detalhes necessários do POST:**

* **URL**: use o valor `action_url` da resposta.
* **Método**: `POST`
* **Content-Type**: `application/x-www-form-urlencoded`
* **Corpo**: inclua `creq` e `threeDSSessionData`.

**Exemplo — redirecionamento manual via POST:**

```html
<div id="loader">Redirecting to secure bank authentication...</div>

<form id="acs-direct-form" method="POST" action="https://3ds-acs.test.modirum.com/mdpayacs/creq;token=368800071.1773147207.lksz3Q5MLGPuP5RsNmoU_8831PDCBLY_ABFB5xq0wtc">
  <input type="hidden" name="creq" value="ewogICAgImFjc1RyYW5zSUQiOiAiNjVhMWUxN2MtZWVmYS00NGU1LTgyMDEtMDI4MjM5ZTVmOTA3IiwKICAgICJjaGFsbGVuZ2VXaW5kb3dTaXplIjogIjAzIiwKICAgICJtZXNzYWdlVHlwZSI6ICJDUmVxIiwKICAgICJtZXNzYWdlVmVyc2lvbiI6ICIyLjMuMSIsCiAgICAidGhyZWVEU1NlcnZlclRyYW5zSUQiOiAiZjI0ZmZhMWItMWY5MC01ZjMxLTgwMDAtMDAwMDAyYmY4Yjc3Igp9" />
  <input type="hidden" name="threeDSSessionData" value="NmQyZTQzODAtZDhhMy00Y2NiLTkxMzgtYzI4OTE4MjgxOGE0" />
</form>

<script>
  // Programmatically submit the form
  document.getElementById('acs-direct-form').submit();
</script>
```

#### Status: `Pending Enrollment Continue`

Prossiga para [Passo 3C: Continuar o enrollment](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3c-continue-enrollment) antes de tratar qualquer status subsequente.

### Passo 3B: Validar autenticação

Depois que o cliente concluir o challenge e o navegador redirecionar de volta para seu site, capture o token CRES do callback e chame o endpoint [3DS - Validate Authentication](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/validations). Envie o token junto com o `transaction_id` e o `xid` da resposta de enrollment.

**Exemplo de requisição:**

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/validations \
  --header 'authorization: Bearer <your-token>' \
  --header 'content-type: application/json' \
  --data '{
  "transaction_id": "502040201060404060506040",
  "xid": "VDdnR0kyU1g4ZXlxMkhWTlp0VnA=",
  "token": "<cres-token-from-challenge-callback>"
}'
```

### Passo 3C: Continuar o enrollment

Se o enrollment inicial retornar `Pending Enrollment Continue`, chame o endpoint [3DS - Continue Enrollment](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/enrolments-continue) com o `transaction_id` do Passo 2. A resposta segue a mesma lógica de status do enrollment inicial e pode retornar `Pending Challenge` ou `Authenticated`.

Se a resposta retornar `Pending Challenge`, redirecione o cliente usando a [Opção A ou a Opção B](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#status-pending-challenge), depois chame [Passo 3B: Validar autenticação](/pt/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3b-validate-authentication).

**Exemplo de resposta (status Pending Challenge):**

```json
{
  "transaction_id": "84c05897-fbf1-4a91-90e8-d292a0fda1c8",
  "status": "Pending Challenge",
  "protocol": "3DS2.3.1",
  "acs_redirect_form": {
    "action_url": "https://3ds-acs.test.modirum.com/mdpayacs/creq;token=368800071.1773147207.lksz3Q5MLGPuP5RsNmoU_8831PDCBLY_ABFB5xq0wtc",
    "method": "POST",
    "creq": "ewogICAgImFjc1RyYW5zSUQiOiAiNjVhMWUxN2MtZWVmYS00NGU1LTgyMDEtMDI4MjM5ZTVmOTA3IiwKICAgICJjaGFsbGVuZ2VXaW5kb3dTaXplIjogIjAzIiwKICAgICJtZXNzYWdlVHlwZSI6ICJDUmVxIiwKICAgICJtZXNzYWdlVmVyc2lvbiI6ICIyLjMuMSIsCiAgICAidGhyZWVEU1NlcnZlclRyYW5zSUQiOiAiZjI0ZmZhMWItMWY5MC01ZjMxLTgwMDAtMDAwMDAyYmY4Yjc3Igp9",
    "threeDSSessionData": "NmQyZTQzODAtZDhhMy00Y2NiLTkxMzgtYzI4OTE4MjgxOGE0"
  }
}
```

### Passo 4: Criar o pagamento

Após a conclusão da autenticação (`Authenticated` ou `Attempt`), chame o endpoint [Create - Authorize](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/payments-gwproxy/v2/payments). Inclua os dados de autenticação (`xid`, `eci`, `cavv`, `ds_trans_id`) no objeto `payment`.

> **Requisitos específicos por país**: alguns mercados podem exigir campos obrigatórios adicionais. No Uruguai, você deve incluir um array `rates` com a chave `iva`. Envie `regional_regulation_code` somente quando a transação for elegível para um benefício fiscal ou regulação regional. Cada entrada recebe um `code` (`17934` ou `19210`) e, opcionalmente, um `invoice` com até 9 caracteres alfanuméricos. Quando você omite o `invoice`, a Getnet o deriva do seu `order_id`. Consulte a referência [Taxes and Regulations](https://predocs.globalgetnet.com/en/articles?article=taxes-and-regulations) para mais informações.

**Exemplo de requisição:**

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/payments-gwproxy/v2/payments \
  --header 'authorization: Bearer '\
  --header 'content-type: application/json' \
  --header 'x-seller-id: 54f88e68-7764-4e87-8830-756b1e2c02f8' \
  --data '{
    "order_id": "123order",
    "data": {
      "amount": 118708,
      "currency": "CLP",
      "payment": {
        "payment_method": "CREDIT_AUTHORIZATION",
        "xid": "VDdnR0kyU1g4ZXlxMkhWTlp0VnA=",
        "eci": "24",
        "ds_trans_id": "f7e5f76e-6388-43e6-b8cd-49b251a1f89c",
        "card": { ... }
      }
    }
  }'
```

## Integração com a Europa

O fluxo 3DS para o tenant `santander` com `country: ES` segue o mesmo ciclo de vida do fluxo genérico, mas com comportamentos específicos em cada etapa. Esta seção documenta o fluxo linear completo.

### Identificadores principais

| Campo | Valor |
| :--- | :--- |
| **Tenant** | `santander` |
| **País** | `ES` |
| **Moeda** | `EUR` |
| **Protocolo 3DS** | `2.1.0` |
| **Provedor ACS** | Redsys (`sis-d.redsys.es`) |

### Cabeçalhos obrigatórios

Todas as requisições do fluxo da Espanha exigem os seguintes cabeçalhos adicionais:

| Cabeçalho | Valor |
| :--- | :--- |
| `x-seller-id` | UUID do seu seller |
| `tenant` | `santander` |
| `country` | `ES` |
| `x-operation-type` | `card` |

### Passo 1: Iniciar o enrollment

Chame `POST /v2/enrolments-initial` com os cabeçalhos específicos da Espanha. Inclua o objeto `extra_fields` com dados do cliente, cobrança, entrega e navegador.

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/enrolments-initial \
  --header 'accept: application/json' \
  --header 'authorization: Bearer <your-token>' \
  --header 'x-seller-id: <your-seller-id>' \
  --header 'tenant: santander' \
  --header 'country: ES' \
  --header 'content-type: application/json' \
  --header 'x-operation-type: card' \
  --data '{
    "currency": "EUR",
    "amount": 400,
    "term_url": "https://your-domain.com/3ds/callback",
    "payment_method": {
      "number": "4548814479727229",
      "security_code": "123",
      "expiration_month": "12",
      "expiration_year": "49",
      "payment_method": "CREDIT",
      "credentials_on_file_type": "ONE_CLICK"
    },
    "description": "3ds unified",
    "extra_fields": {
      "customer": {
        "email": "carmen.lopez@ejemplo.es",
        "document_number": "12345678Z",
        "document_type": "dni",
        "name": "Sra. Carmen López",
        "phone_number": "34612345678"
      },
      "billing_address": {
        "street": "Calle Gran Vía",
        "number": "28",
        "complement": "Piso 3, Puerta A",
        "district": "Centro",
        "city": "Madrid",
        "state": "Madrid",
        "country": "ES",
        "postal_code": "28013",
        "reference": "Near Callao metro station"
      },
      "shipping_address": {
        "street": "Calle Gran Vía",
        "number": "28",
        "complement": "Piso 3, Puerta A",
        "district": "Centro",
        "city": "Madrid",
        "state": "Madrid",
        "country": "ES",
        "postal_code": "28013",
        "reference": "Near Callao metro station"
      },
      "browser_details": {
        "ip": "1.1.1.1",
        "accept_header": "application/json,application/x-www-form-urlencoded",
        "java_enabled": "false",
        "java_script_enabled": "true",
        "language": "es",
        "color_depth": "24",
        "screen_height": "600",
        "screen_width": "800",
        "time_zone": "52",
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
      }
    }
  }'
```

**Exemplo de resposta (Attempt):**

```json
{
  "transaction_id": "526618589740",
  "protocol": "2.1.0",
  "status": "Attempt",
  "eci": 0,
  "acs_redirect_form": {
    "method": "POST",
    "creq": "11cf1933-8798-4280-bd92-e8120fe1944e"
  }
}
```

> **Importante — status `Attempt` na Espanha:** sempre prossiga para o Passo 2 (Continuar o enrollment) ao receber `Attempt`. Não trate esse status como autenticação concluída. A etapa de continuação pode revelar um estado `Pending Challenge` ou `Authenticated`. Armazene o `transaction_id`; você precisará dele em todas as etapas seguintes.
>
> O valor de `acs_redirect_form.creq` nesta resposta é uma referência de transação do servidor, usada internamente para a continuidade do fluxo. Não o utilize para redirecionar o cliente — os dados reais de redirecionamento do ACS são retornados na resposta de continuação do enrollment.

A resposta também pode retornar `Pending Enrollment Continue` ou `Authenticated` diretamente.

### Passo 2: Continuar o enrollment

Envie o `transaction_id` do Passo 1 para `POST /v2/enrolments-continue`. Inclua os mesmos cabeçalhos específicos da Espanha. A resposta segue a mesma lógica de status do fluxo genérico e pode retornar `Pending Challenge` ou `Authenticated`.

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/enrolments-continue \
  --header 'accept: application/json' \
  --header 'authorization: Bearer <your-token>' \
  --header 'x-seller-id: <your-seller-id>' \
  --header 'tenant: santander' \
  --header 'country: ES' \
  --header 'content-type: application/json' \
  --data '{
    "transaction_id": "526618589740"
  }'
```

**Exemplo de resposta (Pending Challenge):**

```json
{
  "status": "Pending Challenge",
  "redirect_html_template": "<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">...</html>",
  "eci": 0,
  "acs_redirect_form": {
    "action_url": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp",
    "method": "POST",
    "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjExY2YxOTMzLTg3OTgtNDI4MC1iZDkyLWU4MTIwZmUxOTQ0ZSIsImFjc1RyYW5zSUQiOiI1Zjg1YjVmZi04Y2Q5LTQwOWQtOWZlOS1iNjMwZDllMzYwMjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0"
  }
}
```

Redirecione o cliente para o ACS usando um dos métodos a seguir:

**Opção A: template HTML** — injete o `redirect_html_template` na sua página. O template é um formulário de envio automático que redireciona o cliente para a página de challenge da Redsys automaticamente.

**Opção B: ACS Direct Form** — construa um formulário POST usando os dados de `acs_redirect_form`. O formulário exige **apenas o campo `creq`** — não inclua `threeDSSessionData`.

```html
<div id="loader">Redirecting to Redsys secure authentication...</div>

<form id="acs-direct-form" method="POST" action="https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp" enctype="application/x-www-form-urlencoded">
  <input type="hidden" name="creq" value="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjExY2YxOTMzLTg3OTgtNDI4MC1iZDkyLWU4MTIwZmUxOTQ0ZSIsImFjc1RyYW5zSUQiOiI1Zjg1YjVmZi04Y2Q5LTQwOWQtOWZlOS1iNjMwZDllMzYwMjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" />
</form>

<script>
  document.getElementById('acs-direct-form').submit();
</script>
```

> **Principal diferença em relação ao fluxo genérico:** o formulário ACS exige apenas `creq`. O fluxo genérico exige tanto `creq` quanto `threeDSSessionData`.

### Passo 3: Validar autenticação

Depois que o cliente concluir o challenge, o ACS redireciona de volta para o seu `term_url` com um token CRES. Capture esse token e chame `POST /v2/validations`. Envie o CRES no campo `token`.

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/security-gwproxy/v2/validations \
  --header 'accept: application/json' \
  --header 'authorization: Bearer <your-token>' \
  --header 'x-seller-id: <your-seller-id>' \
  --header 'tenant: santander' \
  --header 'country: ES' \
  --header 'content-type: application/json' \
  --header 'x-operation-type: card' \
  --data '{
    "token": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImU5MGVhYzlmLWM2OWYtNDAyNS05MzE2LTQ4ZGI5YzcwNzY0MyIsImFjc1RyYW5zSUQiOiJlODY0NzNlYS1iMGRmLTRkNzktOTdmZi0xN2E1NmY1YWM1MDAiLCJtZXNzYWdlVHlwZSI6IkNSZXMiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwidHJhbnNTdGF0dXMiOiJZIn0="
  }'
```

**Exemplo de resposta (Authenticated):**

```json
{
  "tx_id": "e86473ea-b0df-4d79-97ff-17a56f5ac500",
  "status": "Authenticated",
  "ds_trans_id": "e90eac9f-c69f-4025-9316-48db9c707643"
}
```

> **Observação:** a resposta de validação retorna `tx_id`, `status` e `ds_trans_id`. Ela não inclui todos os campos presentes na resposta genérica (como `xid` ou `cavv`), mas os valores de status seguem a mesma convenção.

### Passo 4: Criar o pagamento

Quando o fluxo 3DS atingir o status `Authenticated`, chame `POST /v2/payments` para cobrar o cartão.

**Requisitos específicos da Espanha:**

1. Defina `order_id` como o `transaction_id` retornado pelo processo de enrollment 3DS — não use um ID de pedido personalizado.
2. Inclua o campo `cres` no objeto `payment`. Para transações na Espanha (ES), apenas `cres` é necessário para a autorização 3DS — não inclua `xid`, `cavv` ou `eci`.

```json
curl --request POST \
  --url https://api-sbx.globalgetnet.com/dpm/payments-gwproxy/v2/payments \
  --header 'content-type: application/json' \
  --header 'authorization: Bearer <your-token>' \
  --header 'x-seller-id: <your-seller-id>' \
  --header 'country: ES' \
  --header 'tenant: santander' \
  --data '{
    "idempotency_key": "91d5f349-8256-4929-a468-7a2c97e68978",
    "request_id": "cf779372-082f-4d13-ad74-35ad0b93d9c5",
    "order_id": "526618589740",
    "data": {
      "amount": 400,
      "currency": "EUR",
      "customer_id": "913f3f9d-7060-4639-af6d-331b658668d4",
      "payment": {
        "payment_id": "6456ef10-55ce-415f-aa82-39336a5d572d",
        "payment_method": "CREDIT",
        "save_card_data": false,
        "transaction_type": "FULL",
        "number_installments": 1,
        "dynamic_mcc": "1234",
        "credentials_on_file_type": "ONE_CLICK",
        "cres": "<cres-token-from-redsys-callback>",
        "card": {
          "number": "4548810000000003",
          "expiration_month": "12",
          "expiration_year": "49",
          "cardholder_name": "Sra. Carmen López",
          "security_code": "123"
        }
      },
      "additional_data": {
        "order": {
          "items": [
            {
              "name": "Producto Electrónico",
              "quantity": 1,
              "sku": "SKU-ES-001",
              "price": 400.00
            }
          ]
        },
        "customer": {
          "email": "carmen.lopez@ejemplo.es",
          "document_number": "12345678Z",
          "document_type": "dni",
          "name": "Sra. Carmen López",
          "phone_number": "34612345678",
          "billing_address": {
            "street": "Calle Gran Vía",
            "number": "28",
            "complement": "Piso 3, Puerta A",
            "district": "Centro",
            "city": "Madrid",
            "state": "Madrid",
            "country": "ES",
            "postal_code": "28013",
            "reference": "Near Callao metro station"
          },
          "shippings": {
            "address": {
              "street": "Calle Gran Vía",
              "number": "28",
              "complement": "Piso 3, Puerta A",
              "district": "Centro",
              "city": "Madrid",
              "state": "Madrid",
              "country": "ES",
              "postal_code": "28013",
              "reference": "Near Callao metro station"
            },
            "name": "Sra. Carmen López",
            "phone_number": "34612345678"
          }
        }
      }
    }
  }'
```

## Veja também

Você pode explorar mais pagamentos da API Getnet Web Checkout:

* Saiba como [criar um pagamento com pré-autorização](/pt/web-checkout/payment-guides-wbc/payment-preauth-wbc).
* Saiba como [criar um pagamento com verificação de cartão](/pt/web-checkout/payment-guides-wbc/payment-cardverif-wbc).