Crear una integración de suscripciones
Crear y administrar las suscripciones para aceptar pagos recurrentes.

Personaliza con la API de apariencia.
Utiliza Payment Element para crear un formulario de pago personalizado que incrustará en tu solicitud para cobrar los pagos.
Consulta la Guía rápida de componentes integrados para aprender a utilizar la API de pago para crear y gestionar su flujo de pago general.
Utiliza esta guía para aprender a vender suscripciones de precio fijo . Utilizarás Payment Element para crear un formulario de pago personalizado que incrustará en tu solicitud.
Si no deseas crear un formulario de pago personalizado, puedes integrarlo con Checkout. Si deseas una versión detallada de esa guía de integración de principio a fin, consulta la Guía de inicio rápido de Billing.
Si no estás listo para programar una integración, puedes configurar suscripciones básicas de forma manual en el Dashboard. También puedes usar Payment Links para configurar suscripciones sin programar nada. Obtén más información sobre cómo diseñar una integración para comprender las decisiones que debes tomar y los recursos que necesitas.
Tu próximo desarrollo
Esta guía te explica cómo:
- Crea un catálogo de productos.
- Crear un proceso de inscripción que genere un cliente.
- Crear suscripciones y recopilar información de pago.
- Comprobar y monitorear el estado de los pagos y las suscripciones.
- Permitir que los clientes cambien de plan o cancelen la suscripción.
- Learn how to use flexible billing mode to access enhanced billing behavior and additional features.
Cómo construir en Stripe
Subscriptions simplifica tu facturación creando automáticamente Facturas y PaymentIntents por ti. Para crear y activar una suscripción, necesitas crear primero un Producto para definir lo que vendes, y un Precio, que determina el importe por cobrar y la frecuencia. También necesitas un Cliente para almacenar los PaymentMethods utilizados para realizar cada pago recurrente.
Definiciones de los objetos de la API
Recurso | Definición |
---|---|
Customer | Representa a un cliente que compra una suscripción. Usa el objeto Customer asociado a una suscripción para realizar y hacer seguimiento de los cargos recurrentes y para administrar los productos a los que se suscriben. |
Derecho | Representa el acceso de un cliente a una funcionalidad incluida en un producto de servicio al que está suscrito. Cuando creas una suscripción para la compra recurrente de un producto por parte de un cliente, se crea automáticamente un derecho activo para cada funcionalidad asociada a ese producto. Cuando un cliente accede a tus servicios, utiliza sus derechos activos para habilitar las funcionalidades incluidas en su suscripción. |
Funcionalidad | Representa una funcionalidad o capacidad a la que tus clientes pueden acceder cuando se suscriben a un producto de servicio. Puedes incluir funciones en un producto creando ProductFeatures. |
Factura | Una declaración de importes que un cliente adeuda y que rastrea los estados de pago desde el borrador hasta su pago o su finalización. Las suscripciones generan facturas automáticamente. |
PaymentIntent | Una forma de crear flujos de pago dinámicos. Un PaymentIntent hace un seguimiento del ciclo de vida del flujo del proceso compra del cliente y activa pasos adicionales de autenticación, si así lo exigen las disposiciones normativas, las reglas antifraude personalizadas de Radar o los métodos de pago con redireccionamiento. Las facturas crean PaymentIntents de forma automática. |
PaymentMethod | Los métodos de pago que utiliza el cliente para pagar tus productos. Por ejemplo, puedes almacenar una tarjeta de crédito en un objeto Customer y usarla para realizar pagos recurrentes para ese cliente. Normalmente se usa con las API Payment Intents o Setup Intents. |
Precio | Define el precio por unidad, la moneda y el ciclo de facturación para un producto. |
Producto | Un bien o servicio que vende tu empresa. Un producto de servicio puede incluir una o más funciones. |
ProductFeature | Representa la inclusión de una sola funcionalidades en un solo producto. Cada producto está asociado a una ProductFeature para cada funcionalidad que incluye, y cada funcionalidad está asociada a una ProductFeature para cada producto que la incluye. |
Suscripción | Representa la compra recurrente programada de un producto por parte de un cliente. Usa una suscripción para cobrar pagos y proporcionar entrega repetida o acceso continuo a un producto. |
Veamos un ejemplo de cómo funcionan juntos los productos, las funcionalidades y los derechos. Imagina que quieres configurar un servicio recurrente que ofrezca dos niveles: un producto estándar con funcionalidad básica y un producto avanzado que agregue funcionalidad extendida.
- Creas dos funcionalidades:
basic_
yfeatures extended_
.features - Creas dos productos:
standard_
yproduct advanced_
.product - Para el producto estándar, creas una ProductFeature que asocia
basic_
confeatures standard_
.product - Para el producto avanzado, creas dos ProductFeatures: una que asocia
basic_
confeatures advanced_
y otra que asociaproduct extended_
confeatures advanced_
.product
Un cliente, first_
, se suscribe al producto estándar. Cuando creas la suscripción, Stripe crea automáticamente un derecho que asocia first_
con basic_
.
Otro cliente, second_
, se suscribe al producto avanzado. Al crear la suscripción, Stripe crea automáticamente dos derechos: uno que asocia second_
con basic_
y otro que asocia second_
con extended_
.
Puedes determinar qué funcionalidades aprovisionar para un cliente recuperando sus derechos activos o recibiendo notificaciones del evento Resumen de derechos activos. No tienes que recuperar sus suscripciones, productos y funcionalidades.
Configura Stripe
Instala el cliente de Stripe que prefieras:
A continuación, instala la CLI de Stripe. La CLI proporciona pruebas de webhooks y puedes ejecutarla para realizar llamadas API a Stripe. Esta guía muestra cómo utilizar la CLI para configurar un modelo de precios en una sección posterior.
Para obtener más opciones de instalación, consulta Empezar a usar la CLI de Stripe.
Crear el modelo de tarifasCLI o Dashboard de Stripe
Crea los productos con sus precios en el Dashboard o con la CLI de Stripe.
Este ejemplo utiliza un servicio de precio fijo con dos niveles de servicio diferentes: básico y prémium. Para cada opción de nivel de servicio, debes crear un producto y un precio recurrente. (Si quieres agregar un cargo puntual, como el costo de instalación, crea un tercer producto con un precio puntual. Para simplificar, este ejemplo no incluye un cargo puntual).
En este ejemplo, cada producto se factura mensualmente. El precio del producto básico es del 5 USD. El precio del producto prémium es del 15 USD.
Crear el clienteCliente y servidor
Stripe necesita un cliente para cada suscripción. En el front-end de tu aplicación, recopila cualquier información necesaria de tus usuarios y pásala al back-end.
If you need to collect address details, the Address Element enables you to collect a shipping or billing address for your customers. For more information on the Address Element, see the Address Element page.
<form id="signup-form"> <label> Email <input id="email" type="email" placeholder="Email address" value="test@example.com" required /> </label> <button type="submit"> Register </button> </form>
const emailInput = document.querySelector('#email'); fetch('/create-customer', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: emailInput.value, }), }).then(r => r.json());
Crea el objeto Customer de Stripe en el servidor.
Nota
Make sure you store the Customer ID to use in the Checkout Session
Crear la suscripciónCliente y servidor
Nota
Si deseas renderizar el Payment Element sin crear primero una suscripción, consulta Recopilación de datos de pago antes de crear una intención.
Permite que tu cliente elija un plan y, a continuación, crea la suscripción. En el ejemplo de esta guía, el cliente elige entre un plan Básico o un plan Premium.
En el front end, pasa el ID del precio seleccionado y el ID del registro del cliente al back end.
fetch('/create-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ priceId: priceId, customerId: customerId, }), })
En el back end, cree la suscripción con un estado incompleto
utilizando payment_
. A continuación, devuelve el client_
del primer PaymentIntent de la suscripción al front end para completar el pago. Para ello, expande el confirmation_secret en la última factura de la suscripción.
Para habilitar el comportamiento de suscripción mejorado, establece billing_
en flexible
. Debes utilizar la versión de la API de Stripe 2025-06-30.basil o posterior.
Establece save_default_payment_method en on_
para guardar el método de pago como predeterminado para una suscripción cuando un pago tiene éxito. Guardar un método de pago como predeterminado aumenta la tasa de éxito de futuros pagos de suscripciones.
Nota
Si estás utilizando un precio en múltiples monedas, utiliza el parámetro moneda para indicarle a la suscripción cuál de las monedas admitidas debe utilizar. Si omites el parámetro moneda
, la suscripción utilizará la moneda por defecto.
La suscripción ahora está inactiva
y a la espera de pago. El ejemplo de respuesta que figura a continuación destaca los campos mínimos que deben almacenarse, pero puedes almacenar los campos a los que tu solicitud accede con frecuencia.
{ "id": "sub_JgRjFjhKbtD2qz", "object": "subscription", "application_fee_percent": null, "automatic_tax": { "disabled_reason": null, "enabled": false, "liability": "null" }, "billing_cycle_anchor": 1623873347,
Recopila datos de pagoCliente
Utiliza Stripe Elements para cobrar los datos de pago y activar la suscripción. Puedes personalizar Elements para que se adapte al aspecto de tu solicitud.
El Payment Element admite Link, tarjetas de crédito, débito directo SEPA y débito directo BECS para suscripciones. Puedes mostrar los métodos de pago habilitados y recopilar de forma segura los datos de pago según la selección de tu cliente.
Configurar Stripe Elements
El Payment Element se encuentra disponible automáticamente como funcionalidad de Stripe.js. Incluye el script de Stripe.js en tu página de confirmación de compra agregándolo al head
de tu archivo HTML. Siempre debes cargar Stripe.js directamente desde js.stripe.com para cumplir con la normativa PCI. No incluyas el script en un paquete ni alojes una copia en tus sistemas.
<head> <title>Checkout</title> <script src="https://js.stripe.com/clover/stripe.js"></script> </head> <body> <!-- content here --> </body>
Crea una instancia de Stripe con el siguiente JavaScript en tu página de pago:
// Set your publishable key: remember to change this to your live publishable key in production // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe(
);'pk_test_TYooMQauvdEDq54NiTphI7jx'
Agrega el Payment Element a tu página
El Payment Element necesita un lugar donde residir en tu página de pago. Crea un nodo DOM vacío (contenedor) con una ID única en tu formulario de pago.
<form id="payment-form"> <div id="payment-element"> <!-- Elements will create form elements here --> </div> <button id="submit">Subscribe</button> <div id="error-message"> <!-- Display error message to your customers here --> </div> </form>
Una vez cargado el formulario, cree una instancia de Payment Element y móntalo en el nodo DOM contenedor. Cuando creaste la suscripción, pasaste el valor client_
al front-end. Pasa este valor como una opción cuando crees una instancia de Elements.
const options = { clientSecret: '{{CLIENT_SECRET}}', // Fully customizable with appearance API. appearance: {/*...*/}, }; // Set up Stripe.js and Elements to use in the payment form, passing the client secret obtained in step 5 const elements = stripe.elements(options); const paymentElementOptions = { layout: "tabs", }; // Create and mount the Payment Element const paymentElement = elements.create('payment', paymentElementOptions); paymentElement.mount('#payment-element');
El elemento de pago muestra un formulario dinámico que le permite a tu cliente seleccionar un método de pago. El formulario recopila automáticamente todos los datos de pago necesarios para el método de pago que seleccionen.
Configuraciones opcionales del Payment Element
Opcionalmente, puedes hacer lo siguiente:
- Customize the Payment Element to match the design of your site by passing the appearance object into
options
when creating an instance of Elements. - Configura la interfaz de Apple Pay para que devuelva un token de comerciante para admitir pagos recurrentes, recargas automáticas y pagos aplazados.
Completar pago
Utiliza stripe.
para completar el pago utilizando los datos del elemento de pago y activar la suscripción. Esto crea un método de pago, confirma la primera intención de pago de la suscripción incompleta y realiza el cargo. Si se requiere la autenticación reforzada de clientes (SCA) (SCA) para el pago, el elemento de pago se encarga del proceso de autenticación antes de confirmar la intención de pago.
Proporciona una dirección return_url para indicar a dónde redirige Stripe al usuario después de completar el pago. Tu usuario podría redirigirse primero a un sitio intermedio, como una página de autorización bancaria, antes de redirigirse a la return_
. Los pagos con tarjeta redirigen inmediatamente a la return_
cuando el pago se realiza correctamente.
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ //`Elements` instance that was used to create the Payment Element elements, confirmParams: { return_url: "https://example.com/order/123/complete", } }); if (error) { // This point is reached only if there's an immediate error when // confirming the payment. Show an error to your customer (for example, payment // details incomplete) const messageContainer = document.querySelector('#error-message'); messageContainer.textContent = error.message; } else { // Your customer redirects to your `return_url`. For some payment // methods, such as iDEAL, your customer redirects to an intermediate // site first to authorize the payment, and then redirects to the `return_url`. } });
Cuando tu cliente envía un pago, Stripe lo redirige a return_
e incluye los siguientes parámetros de consulta de URL. La página de retorno puede usarlos para obtener el estado del PaymentIntent a fin de mostrarle el estado del pago al cliente.
Cuando especificas la return_
, también puedes adjuntar tus propios parámetros de consulta para usarlos en la página de retorno.
Parámetro | Descripción |
---|---|
payment_ | El identificador único del PaymentIntent . |
payment_ | El secreto de cliente del objeto PaymentIntent . Para las integraciones de suscripciones, este client_secret también se expone en el objeto Invoice a través de confirmation_ |
Cuando el cliente es redirigido a tu sitio, puedes usar el payment_
para consultar el PaymentIntent y mostrarle el estado de la transacción a tu cliente.
Precaución
Si tienes herramientas que hacen el seguimiento de la sesión de navegador del cliente, es posible que tengas que agregar el dominio stripe.
a la lista de exclusión de referentes. Los redireccionamientos hacen que algunas herramientas creen nuevas sesiones que te impiden hacer el seguimiento de toda la sesión.
Utiliza uno de los parámetros de consulta para recuperar el PaymentIntent. Inspecciona el estado del PaymentIntent para decidir qué mostrar a tus clientes. También puedes añadir tus propios parámetros de consulta al proporcionar la return_
, que persisten a través del proceso de redirección.
// Initialize Stripe.js using your publishable key const stripe = Stripe(
); // Retrieve the "payment_intent_client_secret" query parameter appended to // your return_url by Stripe.js const clientSecret = new URLSearchParams(window.location.search).get( 'payment_intent_client_secret' ); // Retrieve the PaymentIntent stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => { const message = document.querySelector('#message') // Inspect the PaymentIntent `status` to indicate the status of the payment // to your customer. // // Some payment methods [immediately succeed or fail][0] upon // confirmation, while others first enter a `processing` status. // // [0]: https://stripe.com/docs/payments/payment-methods#payment-notification switch (paymentIntent.status) { case 'succeeded': message.innerText = 'Success! Payment received.'; break; case 'processing': message.innerText = "Payment processing. We'll update you when payment is received."; break; case 'requires_payment_method': message.innerText = 'Payment failed. Please try another payment method.'; // Redirect your user back to your payment page to attempt collecting // payment again break; default: message.innerText = 'Something went wrong.'; break; } });'pk_test_TYooMQauvdEDq54NiTphI7jx'
Escucha webhooksServidor
Para completar la integración, tienes que procesar los webhooks que envió Stripe. Estos son eventos que se originan cada vez que un estado dentro de Stripe cambia, por ejemplo, cuando las suscripciones crean facturas nuevas. En tu aplicación, configura un controlador de HTTP para aceptar una solicitud POST que contenga el evento de webhook y verifica la firma del evento:
Durante el desarrollo, utiliza la CLI de Stripe para observar los webhooks y reenviarlos a tu solicitud. Ejecuta lo siguiente en un terminal nuevo mientras se ejecuta tu aplicación de desarrollo:
stripe listen --forward-to localhost:4242/webhook
Para la producción, configura un punto de conexión webhook en Workbench, o utiliza la API Webhook Endpoints.
Escucha algunos eventos para completar los pasos restantes de esta guía. Consulta Eventos de suscripción y obtén más detalles sobre los webhooks específicos de la suscripción.
Brindar acceso a tu servicioCliente y servidor
Ahora que la suscripción está activa, dale a tu usuario acceso a tu servicio. Para ello, escucha los eventos customer.
, customer.
, y customer.
. Estos eventos pasan un objeto Subscription
que contiene un campo status
que indica si la suscripción está activa, vencida o cancelada. Consulta el ciclo de vida de la suscripción para obtener una lista completa de estados.
En tu controlador de webhook:
- Verifica el estado de la suscripción. Si es
activo
, tu usuario ha pagado por su producto. - Revisa el producto al que se suscribió el cliente y bríndale acceso al servicio. Es mejor revisar el producto que el precio porque te da más flexibilidad en caso de que tengas que cambiar el precio o el período de facturación.
- Almacena el
product.
,id subscription.
y elid subscription.
en tu base de datos junto constatus customer.
que ya guardaste. Consulta este registro cuando tengas que determinar qué funcionalidades habilitar para el usuario en tu aplicación.id
El estado de la suscripción puede cambiar en cualquier momento de su ciclo de vida, incluso si tu solicitud no hace ninguna llamada directa a Stripe. Por ejemplo, se puede producir un error de renovación debido a una tarjeta de crédito vencida, lo que genera que el estado de la suscripción pase a vencido
. O, si usas el portal de clientes, un usuario puede optar por cancelar la suscripción sin ingresar a tu aplicación directamente. El uso correcto del controlador mantiene el estado de tu solicitud sincronizado con Stripe.
Cancelación de la suscripciónCliente y servidor
Puedes permitir que los clientes cancelen sus suscripciones. El ejemplo siguiente añade una opción de cancelación a la página de configuración de la cuenta.

Configuración de la cuenta con la posibilidad de cancelar la suscripción
function cancelSubscription(subscriptionId) { return fetch('/cancel-subscription', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ subscriptionId: subscriptionId, }), }) .then(response => { return response.json(); }) .then(cancelSubscriptionResponse => { // Display to the user that the subscription has been canceled. }); }
En el back-end, define el punto de conexión para que el front-end haga la llamada.
En tu aplicación, se recibe un evento customer.
.
Una vez que se cancela la suscripción, actualiza tu base de datos para eliminar el ID de suscripción de Stripe que estaba almacenado y limitar el acceso al servicio.
Cuando se cancela una suscripción, no se puede reactivar. En su lugar, recopila la información de facturación actualizada de tu cliente, actualiza su método de pago predeterminado y crea una nueva suscripción con tu registro de cliente existente.
Prueba la integración
Prueba métodos de pago
Usa la siguiente tabla para probar diferentes métodos y escenarios de pago.
Método de pago | Escenario | Cómo hacer la prueba |
---|---|---|
Débito directo BECS | Tu cliente paga correctamente con débito directo BECS. | Completa el formulario con el número de cuenta 900123456 y BSB 000000 . El PaymentIntent confirmado pasa en un principio al estado en proceso y, tres minutos más tarde, a finalizado con éxito . |
Débito directo BECS | El pago de tu cliente falla con un código de error account_ . | Completa el formulario con el número de cuenta 111111113 y BSB 000000 . |
Tarjeta de crédito | El pago con tarjeta se efectúa correctamente y no requiere autenticación. | Completa el formulario de tarjeta de crédito con el número de tarjeta 4242 4242 4242 4242 y cualquier fecha de vencimiento, CVC y código postal. |
Tarjeta de crédito | El pago con tarjeta requiere autenticación. | Completa el formulario de tarjeta de crédito con el número de tarjeta 4000 0025 0000 3155 y cualquier fecha de vencimiento, CVC y código postal. |
Tarjeta de crédito | La tarjeta es rechazada con el código insufficient_ . | Completa el formulario de tarjeta de crédito con el número de tarjeta 4000 0000 0000 9995 y cualquier fecha de vencimiento, CVC y código postal. |
Débito directo SEPA | Tu cliente paga correctamente con débito directo SEPA. | Completa el formulario con el número de cuenta AT321904300235473204 . El PaymentIntent confirmado pasa inicialmente al estado “en proceso” y, tres minutos más tarde, a “completado”. |
Débito directo SEPA | El estado de PaymentIntent de tu cliente pasa de processing a requires_ . | Completa el formulario con el número de cuenta AT861904300235473202 . |
Supervisa los acontecimientos
Configura webhooks para escuchar los eventos de cambio de suscripción, como actualizaciones y cancelaciones. Más información sobre webhooks de suscripción. Puedes ver los eventos en el Dashboard o con Stripe CLI.
Para más detalles, consulta Comprobación de la integración con Billing.
OpcionalPermitir que los clientes cambien de planCliente y servidor
Para permitir que tus clientes cambien su suscripción, recopila el ID de precio de la opción a la que desean cambiar. A continuación, envía el nuevo ID de precio desde el front-end a un punto final del back-end. El ejemplo siguiente también pasa el ID de suscripción, pero puedes recuperarlo de tu base de datos para el usuario que ha iniciado sesión.
function updateSubscription(priceId, subscriptionId) { return fetch('/update-subscription', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ subscriptionId: subscriptionId, newPriceId: priceId, }), }) .then(response => { return response.json(); }) .then(response => { return response; }); }
En el back-end, define el punto de conexión para que el front-end haga la llamada especificando el ID de suscripción y el nuevo ID de precio. La suscripción ahora es una suscripción Premium que cuesta USD 15 por mes en lugar de una suscripción básica de USD 5 por mes.
En tu aplicación, se recibe un evento customer.
.
OpcionalPrevisualizar un cambio de precioCliente y servidor
Cuando tu cliente cambia de suscripción, a menudo se produce un ajuste del importe que debe, conocido como prorrateo. Puedes utilizar el punto de conexión de creación de factura preliminar para mostrar el importe ajustado a tus clientes.
En el front-end, pasa los detalles de creación de vista previa de la factura
a un punto de conexión de back-end.
function createPreviewInvoice( customerId, subscriptionId, newPriceId, trialEndDate ) { return fetch('/create-preview-invoice', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ customerId: customerId, subscriptionId: subscriptionId, newPriceId: newPriceId, }), }) .then(response => { return response.json(); }) .then((invoice) => { return invoice; }); }
En el back-end, define el punto de conexión para que el front-end haga la llamada.
OpcionalMostrar el método de pago del clienteCliente y servidor
Mostrar la marca y los últimos 4 dígitos de la tarjeta le permite saber al cliente qué tarjeta se está utilizando o si es necesario actualizar el método de pago.
En el front end, envía el identificador del método de pago a un punto de conexión que recupere los detalles del método de pago.
function retrieveCustomerPaymentMethod(paymentMethodId) { return fetch('/retrieve-customer-payment-method', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ paymentMethodId: paymentMethodId, }), }) .then((response) => { return response.json(); }) .then((response) => { return response; }); }
En el back-end, define el punto de conexión para que el front-end haga la llamada.
Ejemplo de respuesta:
{ "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42", "object": "payment_method", "billing_details": { "address": { "city": null, "country": null, "line1": null, "line2": null, "postal_code": null,
Nota
Te recomendamos guardar paymentMethod.
y last4
en tu base de datos, por ejemplo, paymentMethod.
como stripeCustomerPaymentMethodId
en tu colección o tabla de users
. Si lo necesitas, también tienes la opción de guardar exp_
, exp_
, fingerprint
y billing_
. Esto sirve para limitar el número de llamadas a Stripe, mejorar el rendimiento y evitar una posible limitación de la frecuencia.
Cuéntales a tus clientes qué es Stripe
Stripe recopila información sobre las interacciones de los clientes con Elements para proporcionarte servicios, mejorarlos y prevenir el fraude. Esto incluye el uso de cookies y direcciones IP para identificar qué Elements vio un cliente durante una sola sesión de finalización de compra. Tienes la responsabilidad de divulgar y obtener todos los derechos y consentimientos necesarios para que Stripe use los datos para dichos fines. Si deseas obtener más información, visita nuestro centro de privacidad.