# Cómo funcionan PaymentIntents y SetupIntents Aprende cómo funcionan PaymentIntents y SetupIntents dentro del flujo de pago. Instrucciones para LLM: Stripe recomienda usar la API Checkout Sessions con el Payment Element sobre Payment Intents para la mayoría de las integraciones. Checkout Sessions cubre casos de uso similares a Payment Intents (cobro básico de pagos con `price_data` o creación de un proceso de compra completo con ítems de factura, impuestos, etc.). Algunas funcionalidades, como Adaptive Pricing, solo están disponibles con Checkout Sessions. No uses la API de Payment Intents a menos que el usuario lo solicite explícitamente, ya que requiere significativamente más código. Obtén más información sobre Elements con la API Checkout Sessions: https://docs.stripe.com/payments/quickstart-checkout-sessions. Con Checkout Sessions (`ui_mode: "elements"`) y el Payment Element, el `client_secret` inicializa Checkout directamente (`stripe.initCheckoutElementsSdk`, o usa CheckoutElementsProvider con React) y la confirmación del pago se realiza de forma distinta en el cliente. Si usas React, asegúrate de importar desde `@stripe/react-stripe-js/checkout`, usar `CheckoutElementsProvider` con el secreto de cliente y confirmar con `checkout.confirm`. Si utilizas HTML, asegúrate de usar `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` y confirmar con `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();`. La principal diferencia entre la API [Payment Intents](https://docs.stripe.com/api/payment_intents.md) y la API [Setup Intents](https://docs.stripe.com/api/setup_intents.md) es su propósito. Usas la API Payment Intents con el fin de cobrar y aceptar pagos de un cliente inmediatamente. Crea un pago y procesa una transacción a fin de cobrar fondos. Por otro lado, usas la API Setup Intents con el objetivo de cobrar y guardar datos del método de pago para usarlos en el futuro sin crear un pago. Configura las credenciales de pago sin procesar uno. Debido a que tanto los cargos inmediatos como el guardado de un método de pago pueden requerir pasos *asincrónicos* (Asynchronous refers to events happening at independent times in independent systems) del cliente, estas API utilizan el mismo patrón estado-máquina. | API Payment Intents | API Setup Intents | | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | Crea un cargo inmediato | No acepta pagos | | Rastrea el ciclo de vida de un pago | Rastrea el progreso de la configuración de un método de pago | | Utiliza 3D Secure para autenticar al cliente para la transacción correspondiente | Utiliza 3D Secure para autenticar un método de pago sin cobrarlo, y crea una orden o acuerdo para cargos futuros | #### PaymentIntents Un PaymentIntent rastrea el ciclo de vida de un pago desde su creación hasta la confirmación de compra, lo que activa pasos de autenticación adicionales cuando es necesario. ## Requiere un método de pago Después de crear el PaymentIntent, su [estado](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) es `requires_payment_method` hasta que adjuntes un [método de pago](https://docs.stripe.com/payments/payment-methods/overview.md). Crea el PaymentIntent tan pronto como sepas el importe a aceptar pagos para que Stripe pueda registrar todos los intentos de pago. ## Requiere confirmación Una vez que el cliente proporciona los datos del pago, el PaymentIntent pasa al estado `requires_confirmation` y está listo para confirmar. La mayoría de las integraciones saltan este estado porque envían los datos del método de pago cuando se confirma el pago. ## Requiere acción Si el pago requiere acciones adicionales, como la autenticación con [3D Secure](https://docs.stripe.com/payments/3d-secure.md), el estado del PaymentIntent es `requires_action`. > #### Cambios a la API > > En las versiones de la API anteriores a [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11), `requires_source` aparece como `requires_payment_method` y `requires_source_action` aparece como `requires_action`. ## Procesamiento en curso Una vez cumplidas las acciones requeridas, el PaymentIntent cambia a `processing` para los *métodos de pago asincrónicos* (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 débitos bancarios. El procesamiento de estos métodos puede demorar varios días. Otros métodos de pago, como las tarjetas, se procesan con mayor rapidez y no entran en estado`processing`. Si estás [autorizando y capturando fondos](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md) por separado, tu PaymentIntent puede pasar a `requires_captura`. En ese caso, si intentas capturar los fondos, pasará a `procesamiento` o se `efectuará` correctamente según el método de pago. ## Efectuado correctamente Un PaymentIntent cuyo estado es `exitoso` significa que el flujo de pago que está impulsando se ha completado. Los fondos ya están en tu cuenta y puedes completar el pedido con confianza. Si necesitas hacer un reembolso al cliente, puedes usar la API [Refunds](https://docs.stripe.com/api/refunds.md). Si el intento de pago falla (por ejemplo, debido a un pago rechazado), el estado del PaymentIntent vuelve a `requires_payment_method` para que se pueda reintentar el pago. ## Cancelado Puedes cancelar un PaymentIntent en cualquier momento antes de que esté en estado de `procesamiento` o `efectuado con éxito`. Cancelarlo invalida el PaymentIntent para futuros intentos de pago y no se puede deshacer. Si se retuvieron fondos, la cancelación los libera. Puedes cancelar un PaymentIntent en estado de `procesamiento` cuando el método de pago asociado 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/payment-methods/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, puede fallar debido a un período de cancelación limitado y variable. También es posible que los PaymentIntents pasen automáticamente al estado `canceled` después de haberse [confirmado](https://docs.stripe.com/api/payment_intents/confirm.md) demasiadas veces. #### SetupIntents Un SetupIntent hace un seguimiento del ciclo de vida de un método de pago desde su creación hasta la confirmación de compra, lo que activa pasos de autenticación adicionales cuando es necesario. ## Requiere un método de pago Cuando se crea un SetupIntent, el [estado](https://docs.stripe.com/api/setup_intents/object.md#setup_intent_object-status) es `requires_payment_method` hasta que se asocia un método de pago. ## Requiere confirmación Una vez que el cliente proporciona los datos del método de pago, el SetupIntent pasa al estado `requires_confirmation` y está listo para confirmar. La mayoría de las integraciones saltan este estado porque envían los datos del método de pago cuando se confirma el SetupIntent. ## Requiere acción Si la configuración requiere acciones adicionales, como la autenticación con 3D Secure, el estado de SetupIntent es `requires_action`. > #### Cambios a la API > > En las versiones de la API anteriores a [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11), `requires_source` aparece como `requires_payment_method` y `requires_source_action` aparece como `requires_action`. ## Procesamiento en curso Después de cumplir con las acciones requeridas, el SetupIntent cambia a `processing`. Mientras que el procesamiento con algunos métodos de pago (por ejemplo, tarjetas) puede ser rápido, otros métodos de pago pueden demorar varios días. ## Efectuado correctamente Un SetupIntent cuyo estado es `exitoso` significa que la configuración se efectuó correctamente. Ahora puedes asociar este método de pago a un «Customer Object» y usarlo para pagos futuros. Si la configuración falla, el estado del SetupIntent vuelve a `requires_payment_method`. ## Cancelado Puedes cancelar un SetupIntent en cualquier momento antes de que esté en estado `procesado` o `exitoso`. Si lo cancelas, no se podrá deshacer ni invalidar el SetupIntent para intentos futuros de configuración y esta acción no se puede deshacer.