# Cómo funcionan los Payment Intents y los Setup Intents

Descubre el ciclo de vida de los Payment Intents y los Setup Intents.

Stripe recomienda utilizar la API Checkout Sessions con el elemento de pago en lugar de Payment Intents para la mayoría de las integraciones. Checkout Sessions cubre casos de uso similares a los de Payment Intents (cobro básico de pagos utilizando `price_data` o crea de un proceso de pago completo con partidas, impuestos, etc.). Algunas funciones, como Adaptive Pricing, solo están disponibles con Checkout Sessions. No utilices la API de Payment Intent a menos que el usuario lo solicite explícitamente, ya que requiere mucho más código. Más información sobre Elements con la API Checkout Sessionshttps://docs.stripe.com/payments/quickstart. Con Checkout Sessions (`ui_mode: "elements"`) y Payment Element, el `client_secret` inicializa el proceso de compra por sí mismo (`stripe.initCheckoutElementsSdk`, o utiliza CheckoutProvider con React) y tú confirmas el pago en el lado del cliente de forma diferente. Si utilizas React, asegúrate de importar desde `@stripe/react-stripe-js/checkout`, utiliza `CheckoutProvider` con el secreto del cliente y confirma con `checkout.confirm`. Si utilizas HTML, asegúrate de utiliza `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` y confirma con `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();`.

Los agentes de programación deben instalar la CLI de Stripe (`npm i -g @stripe/cli`) y ejecutar el comando `stripe sandbox create --help` para aprovisionar un entorno de prueba de Stripe anónimo con claves API operativas. No se requiere registro de cuenta.

Utilizas la API de [Payment Intents](https://docs.stripe.com/api/payment_intents.md) para efectuar un cargo a un cliente de forma inmediata y cobrar un pago, y la API de [Setup Intents](https://docs.stripe.com/api/setup_intents.md) para recopilar y guardar la información del método de pago para usarla en el futuro sin crear un cargo. Los Payment Intents crean cargos y procesan transacciones para cobrar fondos. Los Setup Intents configuran las credenciales de pago, pero no procesan pagos.

## Autenticación

Los Payment Intents utilizan *3D Secure* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments) (3DS) para autenticar al cliente en la transacción correspondiente.

Los Setup Intents utilizan 3DS para autenticar un método de pago sin efectuar ningún cargo y, a continuación, crean un mandato o acuerdo para futuros cargos.

## Ciclo de vida

Tanto los Payment Intents como los Setup Intents pasan por los mismos estados. Para entender la asignación entre los estatus de pago en el Dashboard y el `status` de PaymentIntent, consulta la sección [Asignación de estatus de pagos](https://docs.stripe.com/payments/payment-intents/verifying-status.md#payment-status-mapping).

| Estado | Payment Intent | Setup Intent |
| --- | --- | --- |
| Requiere un método de pago | Después de crear el Paymentintent, su [estatus](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) es`requires_payment_method` hasta que adjuntes un [método de pagos](https://docs.stripe.com/payments/payment-methods/overview.md). Crear el Paymentintent tan pronto como sepas la cantidad a cobrar para que Stripe pueda registrar todos los intentos de pago. | Una vez que creas el SetupIntent, este tiene un [status](https://docs.stripe.com/api/setup_intents/object.md#setup_intent_object-status) con el valor `requires_payment_method` hasta que asocias un método de pago. |
| Requiere confirmación | Después de que tu cliente proporcione información de pago, el PaymentIntent entra en el estatus `requires_confirmation` y estará listo para confirmar. La mayoría de las integraciones se saltan este estatus porque presentan información sobre el método para pagar cuando se confirma el pago. | Después de que tu cliente proporciona la información de pago, el SetupIntent pasa al estatus `requires_confirmation` y está listo para ser confirmado. La mayoría de las integraciones se saltan este paso porque envían la información del método de pago cuando se confirma el SetupIntent. |
| Requiere una acción
> \#### Cambios a la API
> 
> Versiones de la API antes del [02-11-2019](https://docs.stripe.com/upgrades.md#2019-02-11) muestran `requires_source` en lugar de`requires_pago_method` y`requires_source_action` en lugar de`requires_action`. | Si el pago requiere acciones adicionales, como autenticarse con[3D Seguro](https://docs.stripe.com/payments/3d-secure.md), el PaymentIntent tiene un estatus de`requires_action`. | Si la configuración requiere acciones adicionales, como la autenticación mediante 3D Secure, el estatus de SetupIntent es `requires_action`. |
| Procesamiento en curso | Se produce después de que se gestionen las acciones requeridas y el pago utilice un *método de pago asíncrono* (Asynchronous payment methods can take up to several days to confirm whether the payment has been successful. During this time, the payment can't be guaranteed), como los adeudos bancarios. Estos tipos de métodos de pago pueden tardar hasta un par de días en procesarse. Si vas a [autorizar y capturar fondos](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md) por separado, tu PaymentIntent puede pasar al estatus `requires_capture`. En ese caso, al intentar capturar los fondos se pasa a `processing` o `succeeded`, dependiendo del método de pago. | Se produce después de que se gestionen las acciones requeridas. Algunos métodos de pago (por ejemplo, las tarjetas) se pueden procesar rápidamente, mientras que otros métodos de pago pueden tardar hasta varios días en procesarse. |
| Completado correctamente | Un PaymentIntent con el estatus `succeeded` significa que el flujo de pago correspondiente se ha completado. Los fondos ya están en tu cuenta y puedes despachar el pedido con total seguridad. Si necesitas reembolsar al cliente, puedes usar la API de [Refunds](https://docs.stripe.com/api/refunds.md). Si el intento de pago falla (por ejemplo, debido a un pago rechazado), el estatus del PaymentIntent vuelve a `requires_payment_method` para que se pueda volver a intentar el pago. | Un SetupIntent con el estatus `succeeded` significa que la configuración se ha realizado con éxito. Ahora puedes asociar este método de pago a un objeto Customer y usar el método de pago para futuros pagos. Si la configuración falla, el estatus del SetupIntent vuelve a `requires_payment_method`. |
| Cancelada | Puedes cancelar un PaymentIntent antes de que alcance un estado `processing` o `succeeded`. La cancelación invalida el PaymentIntent para futuros intentos de pago, libera todos los fondos retenidos y no se puede deshacer. También puedes cancelar un PaymentIntent en el estado `processing` cuando el método de pago es [ACH](https://docs.stripe.com/payments/ach-direct-debit.md), [ACSS](https://docs.stripe.com/payments/acss-debit.md), [AU BECS](https://docs.stripe.com/payments/au-becs-debit.md), [BACS](https://docs.stripe.com/payments/bacs-debit.md), [NZ BECS](https://docs.stripe.com/payments/nz-bank-account.md) o [SEPA](https://docs.stripe.com/payments/sepa-debit.md). Sin embargo, la cancelación podría fallar debido a un margen de tiempo limitado y variable para realizarla. Los PaymentIntents también podrían pasar automáticamente a `canceled` si son [confirmed](https://docs.stripe.com/api/payment_intents/confirm.md) demasiadas veces. | Puedes cancelar un SetupIntent antes de que alcance un estado `processing` o `succeeded`. La cancelación invalida el SetupIntent para futuros intentos de configuración y no se puede deshacer. |
