# Crear un pago autenticado con 3DS

Este documento aplica a los siguientes países:
Brasil | Chile | México | España | Uruguay
---|---|---|---|---|

En el Web Checkout de Getnet, **3D Secure (3DS)** es un protocolo adicional de autenticación, usado en pagos online con tarjeta para verificar la identidad del titular de la tarjeta con el banco emisor durante el proceso de checkout. Cuando una transacción se envía a través de Web Checkout, el banco emisor puede requerir que el cliente complete un paso de autenticación, como una contraseña de un solo uso (OTP), verificación biométrica o confirmación en la aplicación bancaria.

Según la evaluación de riesgo, la autenticación puede ocurrir mediante un **flujo frictionless** (sin interacción del cliente) o un **flujo de challenge** (que requiere verificación del usuario). Este mecanismo ayuda a reducir el fraude y aumenta la seguridad de las transacciones sin tarjeta presente.

Para comprender las reglas de cada país, consulta el documento [3DS Authentication](/es/web-checkout/core-concepts-wbc/3ds-authentication-wbc).

## Requisitos

Antes de seguir los pasos, necesitas:

* Configurar tu Web Checkout mediante [Portal](/es/web-checkout/first-steps-wbc/configuration-by-portal) o mediante [API](/es/web-checkout/first-steps-wbc/configration-by-api) (dependiendo de tu ubicación).
* Generar tu token siguiendo el documento de [Authentication](/es/web-checkout/first-steps-wbc/authentication-token-wbc).

### Payment intent con 3DS

El flujo consiste en la validación de la tarjeta, la tokenización de datos sensibles y el almacenamiento seguro.

Una vez completado este proceso, se envía un webhook que contiene el `card_id`. Este identificador representa la referencia tokenizada de la tarjeta almacenada.
Utilizando este identificador, el Merchant puede realizar nuevas transacciones a través del endpoint de autorización de la Regional API, proporcionando únicamente el `card_id` en la solicitud, sin necesidad de enviar de nuevo todos los datos de la tarjeta.

<Callout type="warning">

3DS actúa como una importante capa de seguridad y, por este motivo, no se recomienda desactivarlo para todos los pagos.

</Callout>

Para pasar por la autenticación 3DS, estos parámetros deben enviarse en el payment intent.

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

**Campos obligatorios**
| Atributo | Tipo | Descripción | Ejemplo |
|---|---|---|---|
|`configurations`| Object | Conjunto de opciones de pago. | -- |
|`preauthorization`| Boolean | Indica si es un pago de tipo preautorizado. | `false`|
|`card_verification`| Boolean | Indica si es un pago de tipo verificación de tarjeta. | `false` |
|`3ds`| Boolean | Indica si es un pago de tipo 3DS. | `true`|

El siguiente bloque de código muestra los campos que deben enviarse en el [payment intent endpoint](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` y `preauthorization` **no están disponibles** para Argentina.

## Comprender el proceso de autenticación 3DS

El emisor de la tarjeta determina dinámicamente el flujo de autenticación según la evaluación de riesgo, la marca de tarjeta y las capacidades del emisor. Después de iniciar el enrollment, la API devuelve un campo `status` que indica tu próxima acción.

Gestiona los tres escenarios posibles:

1. **Autenticación directa**: el emisor autentica al titular de la tarjeta de inmediato (estado: `Authenticated` o `Attempt`).
2. **Challenge requerido**: el emisor requiere verificación interactiva del titular de la tarjeta (estado: `Pending Challenge`). Elige entre renderizar una plantilla HTML o realizar un POST manual usando los datos de **ACS Direct Form**.
3. **Pending Enrollment Continue**: el emisor requiere procesamiento adicional antes de llegar a un estado final (estado: `Pending Enrollment Continue`). Este paso puede finalizar en autenticación o en un challenge.

## Referencia rápida: flujo de decisión

Sigue esta lógica de decisión según el `status` devuelto por la API:

**Después del Paso 2 (Iniciar Enrollment):**

* **`Authenticated` o `Attempt`**: continúa con [Paso 4: Crear el pago](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).
* **`Pending Challenge`**: redirige al cliente usando `redirect_html_template` o `acs_redirect_form`. Después de que se complete el challenge, continúa con [Paso 3B: Validar autenticación](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3b-validate-authentication), luego con [Paso 4: Crear el pago](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).
* **`Pending Enrollment Continue`**: continúa con [Paso 3C: Continuar enrollment](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3c-continue-enrollment).

---

## Pasos de implementación

### Paso 1: Obtener Access Token y tokenizar la tarjeta

1. Solicita un access token usando tus credenciales de API.
2. Tokeniza la información de la tarjeta usando el [token endpoint](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/cards/POST/dpm/cofre-gw-proxy/v1/tokens/card).

### Paso 2: Iniciar Enrollment

Llama al endpoint [3DS - Init Authentication](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/enrolments-initial). Incluye el objeto `extra_fields` con la dirección de facturación, la dirección de envío, los detalles del navegador y la información del cliente, para respaldar una evaluación de riesgo 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"
    }
  }
}'
```

**Ejemplo de respuesta (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"
  }
}

```

### Paso 3: Comprobar el estado y seguir el escenario correspondiente

#### Status: `Authenticated` o `Attempt`

Extrae los datos de autenticación (`xid`, `eci`, `cavv`, `ds_trans_id`) y continúa con [Paso 4: Crear el pago](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-4-create-the-payment).

#### Status: `Pending Challenge`

Redirige al cliente a su banco para la autenticación. Elige uno de los siguientes métodos de redirección:

**Opción A: plantilla HTML**

Extrae y renderiza el `redirect_html_template` directamente en tu aplicación. La plantilla contiene un formulario autoenviable que redirige automáticamente al cliente a la página de autenticación de su banco.

**Ejemplo — renderizar la plantilla HTML del lado del 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>
```

**Ejemplo — renderizar la plantilla HTML del lado del 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);
  }
});
```

**Opción B: ACS Direct Form**

Usa el objeto `acs_redirect_form` para realizar una solicitud POST manual desde el navegador del cliente. Este método es preferible porque evita scripts de terceros y te permite mostrar una interfaz de carga personalizada durante la redirección.

**Detalles requeridos del POST:**

* **URL**: usa el valor `action_url` de la respuesta.
* **Método**: `POST`
* **Content-Type**: `application/x-www-form-urlencoded`
* **Body**: incluye `creq` y `threeDSSessionData`.

**Ejemplo — redirección manual con 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`

Continúa con [Paso 3C: Continuar enrollment](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3c-continue-enrollment) antes de gestionar cualquier estado posterior.

### Paso 3B: Validar autenticación

Después de que el cliente complete el challenge y el navegador redirija de vuelta a tu sitio, captura el token CRES del callback y llama al endpoint [3DS - Validate Authentication](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/validations). Envía el token junto con el `transaction_id` y el `xid` de la respuesta del enrollment.

**Ejemplo de solicitud:**

```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>"
}'
```

### Paso 3C: Continuar enrollment

Si el enrollment inicial devuelve `Pending Enrollment Continue`, llama al endpoint [3DS - Continue Enrollment](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/security-gwproxy/v2/enrolments-continue) con el `transaction_id` del Paso 2. La respuesta sigue la misma lógica de estado que el enrollment inicial y puede devolver `Pending Challenge` o `Authenticated`.

Si la respuesta devuelve `Pending Challenge`, redirige al cliente usando la [Opción A o la Opción B](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#status-pending-challenge), luego llama a [Paso 3B: Validar autenticación](/es/global-api/sep-api/payment-guides-api/card-payments/3ds-guide#step-3b-validate-authentication).

**Ejemplo de respuesta (estado 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"
  }
}
```

### Paso 4: Crear el pago

Una vez que se complete la autenticación (`Authenticated` o `Attempt`), llama al endpoint [Create - Authorize](https://docs.globalgetnet.com/en/products/online-payments/regional-api/swagger#tag/payments/post/dpm/payments-gwproxy/v2/payments). Incluye los datos de autenticación (`xid`, `eci`, `cavv`, `ds_trans_id`) en el objeto `payment`.

> **Requisitos específicos por país**: algunos mercados pueden requerir campos obligatorios adicionales. En Uruguay debes incluir un array `rates` con la clave `iva`. Envía `regional_regulation_code` solo cuando la transacción califique para una regulación regional o un beneficio fiscal. Cada entrada tiene un `code` (`17934` o `19210`) y un `invoice` opcional de hasta 9 caracteres alfanuméricos. Cuando omites el `invoice`, Getnet lo obtiene de tu `order_id`. Consulta la referencia [Taxes and Regulations](https://predocs.globalgetnet.com/en/articles?article=taxes-and-regulations) para más información.

**Ejemplo de solicitud:**

```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": { ... }
      }
    }
  }'
```

## Integración con Europa

El flujo 3DS para el tenant `santander` con `country: ES` sigue el mismo ciclo de vida que el flujo genérico, pero con comportamientos específicos en cada etapa. Esta sección documenta el flujo lineal completo.

### Identificadores clave

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

### Encabezados requeridos

Todas las solicitudes del flujo de España requieren los siguientes encabezados adicionales:

| Encabezado | Valor |
| :--- | :--- |
| `x-seller-id` | Tu UUID de seller |
| `tenant` | `santander` |
| `country` | `ES` |
| `x-operation-type` | `card` |

### Paso 1: Iniciar Enrollment

Llama a `POST /v2/enrolments-initial` con los encabezados específicos de España. Incluye el objeto `extra_fields` con los detalles del cliente, la dirección de facturación, la dirección de envío y el 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"
      }
    }
  }'
```

**Ejemplo de respuesta (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 — estado `Attempt` en España:** siempre continúa con el Paso 2 (Continue Enrollment) cuando recibas `Attempt`. No lo trates como una autenticación completa. El paso de continuación puede revelar un estado `Pending Challenge` o `Authenticated`. Guarda el `transaction_id`; lo necesitas para todos los pasos siguientes.
>
> El valor `acs_redirect_form.creq` de esta respuesta es una referencia de transacción del servidor, usada internamente para continuar el flujo. No lo uses para redirigir al cliente — los datos reales de redirección del ACS se devuelven en la respuesta de Continue Enrollment.

La respuesta también puede devolver directamente `Pending Enrollment Continue` o `Authenticated`.

### Paso 2: Continuar Enrollment

Envía el `transaction_id` del Paso 1 a `POST /v2/enrolments-continue`. Incluye los mismos encabezados específicos de España. La respuesta sigue la misma lógica de estado que el flujo genérico y puede devolver `Pending Challenge` o `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"
  }'
```

**Ejemplo de respuesta (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"
  }
}
```

Redirige al cliente al ACS usando cualquiera de los dos métodos:

**Opción A: plantilla HTML** — inyecta el `redirect_html_template` en tu página. La plantilla es un formulario autoenviable que redirige automáticamente al cliente a la página de challenge de Redsys.

**Opción B: ACS Direct Form** — construye un formulario POST usando los datos de `acs_redirect_form`. El formulario requiere **únicamente el campo `creq`** — no incluyas `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>
```

> **Diferencia clave respecto al flujo genérico:** el formulario ACS requiere únicamente `creq`. El flujo genérico requiere tanto `creq` como `threeDSSessionData`.

### Paso 3: Validar autenticación

Después de que el cliente complete el challenge, el ACS redirige de vuelta a tu `term_url` con un token CRES. Captura este token y llama a `POST /v2/validations`. Envía el CRES en el 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="
  }'
```

**Ejemplo de respuesta (Authenticated):**

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

<Callout type="note">

la respuesta de validación devuelve `tx_id`, `status` y `ds_trans_id`. No incluye todos los campos presentes en la respuesta genérica (como `xid` o `cavv`), pero los valores de estado siguen la misma convención.

</Callout>

### Paso 4: Crear el pago

Una vez que el flujo 3DS llegue a `Authenticated`, llama a `POST /v2/payments` para cobrar la tarjeta.

**Requisitos específicos de España:**

1. Establece `order_id` con el `transaction_id` devuelto por el proceso de enrollment 3DS, no con un ID de orden personalizado.
2. Incluye el campo `cres` en el objeto `payment`. Para transacciones de ES, solo se requiere `cres` para la autorización 3DS; no incluyas `xid`, `cavv` ni `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"
          }
        }
      }
    }
  }'
```

## Ver también

Puedes explorar más pagos de la API de Getnet Web Checkout:

* Aprende cómo [crear un pago con preautorización](/es/web-checkout/payment-guides-wbc/payment-preauth-wbc).
* Aprende cómo [crear un pago con verificación de tarjeta](/es/web-checkout/payment-guides-wbc/payment-cardverif-wbc).