# Guardar método de pago

Para guardar un método de pago para uso futuro, debes generar un `paymentToken` al crear o confirmar el pago y, a continuación, almacenarlo en tu servidor. Este proceso se denomina habitualmente **tokenización**.

La tokenización protege los datos sensibles sustituyéndolos por un equivalente no sensible, conocido como token. El token no tiene significado ni valor externo. Es una referencia —o identificador— que, a través de un sistema de tokenización, apunta a los datos sensibles. Este proceso recopila de forma segura la información sensible de la tarjeta y evita el robo de datos.

<!-- -->

## 1. Genera el token de pago[​](#1-generate-payment-token "Enlace directo al 1. Genera el token de pago")

### Al crear un pago `Del lado del servidor`[​](#when-you-create-a-payment-server-side "Enlace directo al when-you-create-a-payment-server-side")

<!-- -->

* cURL
* Node.js
* PHP

POST https\://api.monei.com/v1/payments

```
curl --request POST 'https://api.monei.com/v1/payments' \

--header 'Authorization: pk_test_3c140607778e1217f56ccb8b50540e00' \

--header 'Content-Type: application/json' \

--data-raw '{

    "amount": 110,

    "currency": "EUR",

    "orderId": "14379133960355",

    "generatePaymentToken": true,

    "callbackUrl": "https://example.com/checkout/callback",

    "completeUrl": "https://example.com/checkout/complete"

}'
```

server.js

```
const {Monei} = require('@monei-js/node-sdk');

const monei = new Monei('pk_test_36cf3e8a15eff3f5be983562ea6b13ec');

monei.payments.create({

  amount: 110,

  currency: 'EUR',

  orderId: '14379133960355',

  generatePaymentToken: true,

  callbackUrl: 'https://example.com/checkout/callback',

  completeUrl: 'https://example.com/checkout/complete'

});
```

server.php

```
$monei = new Monei\MoneiClient('pk_test_36cf3e8a15eff3f5be983562ea6b13ec');

$monei->payments->create([

  'amount' => 110,

  'currency' => 'EUR',

  'orderId' => '14379133960355',

  'generatePaymentToken' => true,

  'callbackUrl' => 'https://example.com/checkout/callback',

  'completeUrl' => 'https://example.com/checkout/complete'

]);
```

Consulta todos los [parámetros de solicitud](https://docs.monei.com/es/apis/rest.md) disponibles.

nota

Para obtener el token de pago para uso futuro sin cobrar a tu cliente, crea un pago con los siguientes parámetros:

```
{

  "amount": 0,

  "currency": "EUR",

  "orderId": "14379133960355",

  "transactionType": "VERIF",

  "generatePaymentToken": true,

  "callbackUrl": "https://example.com/checkout/callback",

  "completeUrl": "https://example.com/checkout/complete"

}
```

### Al confirmar un pago `Del lado del servidor`[​](#when-you-confirm-a-payment-server-side "Enlace directo al when-you-confirm-a-payment-server-side")

* cURL
* Node.js
* PHP

POST https\://api.monei.com/v1/payments/:id/confirm

```
curl --request POST 'https://api.monei.com/v1/payments/26d1f09c42bb59a29b06e280f9553cd5/confirm' \

--header 'Authorization: pk_test_3c140607778e1217f56ccb8b50540e00' \

--header 'Content-Type: application/json' \

--data-raw '{

    "paymentToken": "7cc38b08ff471ccd313ad62b23b9f362b107560b",

    "generatePaymentToken": true

}'
```

server.js

```
const {Monei} = require('@monei-js/node-sdk');

const monei = new Monei('pk_test_36cf3e8a15eff3f5be983562ea6b13ec');

monei.payments.confirm('26d1f09c42bb59a29b06e280f9553cd5', {

  paymentToken: '7cc38b08ff471ccd313ad62b23b9f362b107560b',

  generatePaymentToken: true

});
```

server.php

```
$monei = new Monei\MoneiClient('pk_test_36cf3e8a15eff3f5be983562ea6b13ec');

$monei->payments->confirm(

  '832b77d1a4b372349a7ae0bb1b2af059',

  [

    'paymentToken' => '7cc38b08ff471ccd313ad62b23b9f362b107560b',

    'generatePaymentToken' => true

  ]

);
```

Consulta todos los [parámetros de solicitud](https://docs.monei.com/es/apis/rest/payments-confirm.md) disponibles.

### Al enviar un formulario de pago `Del lado del cliente`[​](#when-you-submit-a-payment-form-client-side "Enlace directo al when-you-submit-a-payment-form-client-side")

Puedes pasar `generatePaymentToken: true` al enviar un formulario de pago. Esto es útil para permitir que tus clientes elijan si desean guardar el método de pago para uso futuro.

checkout.html

```
<form

  action="https://secure.monei.com/payments/{{payment_id}}/confirm"

  method="post"

  id="payment-form"

>

  <div class="card-field">

    <div id="card-input">

      <!-- A MONEI Card Input Component will be inserted here. -->

    </div>

    <!-- Used to display card errors. -->

    <div id="card-error"></div>

  </div>

  <label>

    <!-- A checkbox to save payment method -->

    <input type="checkbox" name="generatePaymentToken" value="true" />

    save payment method

  </label>

  <button type="submit" id="payment-button">Submit payment</button>

</form>
```

Consulta la integración del [método de pago con tarjeta](https://docs.monei.com/es/payment-methods/card.md) para más detalles.

## 2. Obtén y almacena el token de pago[​](#2-obtain-and-store-payment-token "Enlace directo al 2. Obtén y almacena el token de pago")

Una vez completado el pago, el cliente es redirigido a la `completeUrl` con el parámetro de consulta **payment\_id**. Puedes obtener el `paymentToken` permanente llamando al endpoint [obtener pago](https://docs.monei.com/es/apis/rest/payments-get.md).

Almacena este `paymentToken` en tu base de datos junto con la información del cliente. La próxima vez que el cliente realice una compra, [crea un pago](https://docs.monei.com/es/apis/rest/payments-create.md) con este token para omitir el formulario de pago. Ten en cuenta que el cliente deberá completar igualmente la verificación 3D Secure.

nota

MONEI no devolverá el **paymentToken** en la solicitud HTTP POST a la **callbackUrl** por motivos de seguridad. Debes llamar al endpoint [obtener pago](https://docs.monei.com/es/apis/rest/payments-get.md) para obtener el token. El **paymentToken** generado no caduca y solo debe utilizarse **del lado del servidor**.

## 3. Cobra con un método de pago guardado[​](#charge-saved "Enlace directo al 3. Cobra con un método de pago guardado")

Cómo cobras con un `paymentToken` guardado depende de si el cliente está presente:

* **Iniciado por el cliente (un clic)** — el cliente está en tu sitio y elige su tarjeta guardada. [Crea un pago](https://docs.monei.com/es/apis/rest/payments-create.md) con el `paymentToken` para saltarte el formulario. Es posible que el cliente aún tenga que completar **3D Secure**.
* **Iniciado por el comercio / sin el cliente presente** — cobras al cliente cuando **no** está presente (por ejemplo, plazos o tu propia facturación recurrente). Marca el primer pago de la serie con el parámetro **`sequence`** y, después, cobra los pagos siguientes con el `paymentToken` y el **`sequenceId`** de ese primer pago. Los pagos iniciados por el comercio no piden al cliente completar 3D Secure cada vez. Consulta la referencia de [crear pago](https://docs.monei.com/es/apis/rest/payments-create.md) para ver los campos exactos de `sequence`.

tip

Para la facturación recurrente estándar, usa [MONEI Suscripciones](https://docs.monei.com/es/subscriptions/overview.md) — guarda el método de pago, gestiona el ciclo de facturación, los reintentos y la secuencia iniciada por el comercio por ti, así no tienes que gestionar tokens manualmente.

## 4. Guarda métodos de pago en un cliente[​](#customers "Enlace directo al 4. Guarda métodos de pago en un cliente")

En lugar de guardar los tokens en tu propio servidor, puedes dejar que MONEI los guarde en un **cliente**. Un cliente es tu registro de un comprador. Créalo con el endpoint [crear cliente](https://docs.monei.com/es/apis/rest/customers-create.md) o con la mutación de GraphQL [`createCustomer`](https://docs.monei.com/es/apis/graphql/operations/mutations/create-customer.md).

* **Vincula los pagos.** Envía el ID del cliente como `customerId` cuando [crees un pago](https://docs.monei.com/es/apis/rest/payments-create.md). MONEI guarda el método de pago en ese cliente. Consulta los métodos guardados con el endpoint [listar métodos de pago](https://docs.monei.com/es/apis/rest/customers-list-payment-methods.md) o con la consulta [`customerPaymentMethods`](https://docs.monei.com/es/apis/graphql/operations/queries/customer-payment-methods.md).
* **Método de pago predeterminado.** El primer método de pago reutilizable que guarda un cliente pasa a ser el predeterminado (`defaultTokenId`). Puedes cambiar `defaultTokenId` a otro método de pago reutilizable del cliente cuando [actualizas el cliente](https://docs.monei.com/es/apis/rest/customers-update.md). MONEI solo rellena un predeterminado vacío, así que tu valor se mantiene.
* **Cobra el predeterminado.** Envía `customerId` con `useDefaultPaymentMethod: true` y sin `paymentToken` ni `paymentMethod`. MONEI cobra el método de pago predeterminado del cliente. El pago se rechaza si el cliente no tiene un predeterminado.

POST https\://api.monei.com/v1/payments

```
{

  "amount": 110,

  "currency": "EUR",

  "orderId": "14379133960356",

  "customerId": "a4e1d1dd-e0c2-4f7a-a2b1-2b0f1f9b6b1e",

  "useDefaultPaymentMethod": true

}
```

Para eliminar un método de pago guardado, usa el endpoint [eliminar método de pago](https://docs.monei.com/es/apis/rest/customers-delete-payment-method.md). Si era el predeterminado, el predeterminado queda vacío, y el siguiente método de pago reutilizable que guarde el cliente pasa a ser el nuevo predeterminado. Al [eliminar un cliente](https://docs.monei.com/es/apis/rest/customers-delete.md) también se eliminan todos sus métodos de pago guardados, que es lo que suele necesitar una solicitud de supresión de datos. Los pagos ya realizados se conservan.

aviso

MONEI rechaza ambas eliminaciones con `409` mientras sigan en uso. No puedes eliminar un cliente mientras una suscripción en estado `ACTIVE`, `TRIALING`, `PAUSED` o `PAST_DUE` lo indique. No puedes eliminar un método de pago mientras una suscripción activa lo cobre. Cancela o cambia esas suscripciones primero.

El `customerId` de un pago no tiene relación con `paymentMethod.trustly.customerId`, que es un identificador que Trustly devuelve para su propio titular de cuenta.
