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

Personaliza con la API Appearance.
Usa esta guía para aprender a vender suscripciones de precio fijo. Usarás el Mobile Payment Element para crear un formulario de pago personalizado que insertas en tu aplicación.
Nota
Si vendes productos o servicios digitales que se consumen dentro de tu aplicación (por ejemplo, suscripciones, monedas de juegos, niveles de juegos, acceso a contenido prémium o desbloqueo de una versión completa), debes usar las API de compra desde la aplicación de Apple. Esta regla tiene algunas excepciones, como los servicios personales uno a uno y las aplicaciones basadas en regiones específicas. Consulta las pautas de revisión de la App Store para obtener más información.
Crear tu suscripción
Esta guía te explica cómo:
- Modelar tu empresa creando un catálogo de productos.
- Crear un proceso de registro para agregar clientes.
- Crear suscripciones y recopilar información de pago.
- Comprueba y supervisa el estado de los pagos y las suscripciones.
- Permitir que los clientes cambien de plan o cancelen la suscripción.
Cómo modelar la suscripción en Stripe
Las suscripciones simplifican tu facturación mediante la creación automática de Facturas y PaymentIntents para ti. Para crear y activar una suscripción, primero tienes que crear un Producto a fin de modelar lo que se vende y un Precio, que determina el intervalo y el importe que se cobrará. También necesitas un Customer para almacenar los PaymentMethods que se usan para efectuar cada pago recurrente.
Definiciones de los objetos de la API
Configura Stripe
The Stripe iOS SDK is open source, fully documented, and compatible with apps supporting iOS 13 or above.
Nota
Para obtener más detalles sobre la última versión del SDK y las versiones anteriores, consulta la página Versiones en GitHub. Para recibir notificaciones cuando se publique una nueva versión, mira las versiones del repositorio.
Configura el SDK con tu clave publicable de Stripe al iniciar la aplicación. Esto permite que tu aplicación haga solicitudes a la API de Stripe.
Nota
Usa las claves de prueba durante las pruebas y el desarrollo, y tus claves para modo activo cuando publiques tu aplicación.
Y, después, instala la CLI de Stripe. La CLI te permite hacer pruebas de webhooks y puedes ejecutarla para que la API haga llamadas a Stripe. En esta guía, se muestra cómo utilizar la CLI para configurar un modelo de tarifas 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 requiere un cliente para cada suscripción. En el front-end de tu aplicación, recopila toda la información necesaria de tus usuarios y envíala al back-end.
Si necesitas recopilar datos de la dirección, el Address Element te permite recopilar una dirección de envío o facturación para tus clientes. Para obtener más información sobre el Address Element, visita la página de Address Element.
struct RegisterView: View { @State var email = "" var body: some View { VStack { TextField(text: $email) { Text("Email") } Button { Task { var request = URLRequest(url: URL(string: "http://localhost:4242/create-customer")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try! JSONEncoder().encode(["email": email]) let (data, _) = try! await URLSession.shared.data(for: request) let responseJSON = try! JSONSerialization.jsonObject(with: data) // Return the customer ID here print(responseJSON["customer"]) } } label: { Text("Submit") } } } }
Crea el “Customer Object” de Stripe en el servidor.
Crear la suscripciónCliente y servidor
Nota
Si quieres procesar el Payment Element antes de crear una suscripción, consulta Recopilar los datos de pago antes de crear un Intent.
Permite que tu nuevo cliente elija un plan y luego cree la suscripción. En esta guía, elegirá entre un plan Básico y un plan Prémium.
En tu aplicación, envía el ID de precio seleccionado y el ID del registro del cliente al back-end.
func createSubscription(priceId: String, customerId: String) async -> SubscriptionsResponse { var request = URLRequest(url: URL(string: "http://localhost:4242/create-subscription")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try! JSONEncoder().encode(["customerId": customerId, "priceId": priceId]) let (responseData, _) = try! await URLSession.shared.data(for: request) // SubscriptionsResponse is a Decodable struct conforming to the expected response from your backend. // It should include the client_secret, as discussed below. let subscriptionsResponse = try! JSONDecoder().decode(SubscriptionsResponse.self, from: responseData) return subscriptionsResponse }
En el back-end, crea una suscripción con estado incomplete
usando payment_
. Luego, devuelve el client_
desde el primer payment intent de la suscripción al front-end para completar el pago expandiendo el confirmation_
en la factura más reciente de la suscripción.
Establece save_default_payment_method en on_
para guardar el método de pago como predeterminado para una suscripción cuando un pago se realiza correctamente. Guardar un método de pago predeterminado aumenta la tasa de éxito de futuros pagos de suscripción.
Nota
Si usas un precio en múltiples monedas, usa el parámetro currency para indicarle a la suscripción cuál de las monedas del precio debe usar. (Si omites el parámetro currency
, la suscripción utilizará la moneda predeterminada del precio).
En este punto, Subscription está inactive
y en espera del pago. Veamos un ejemplo. Los campos básicos que se deben almacenar aparecen resaltados, pero debes almacenar todos los campos a los que tu aplicación suela acceder.
{ "id": "sub_JgRjFjhKbtD2qz", "object": "subscription", "application_fee_percent": null, "automatic_tax": { "disabled_reason": null, "enabled": false, "liability": "null" }, "billing_cycle_anchor": 1623873347,
Recopilar datos de pagoCliente
Usa el Mobile Payment Element para recopilar los datos de pago y activar la suscripción. Puedes personalizar Elements para que coincida con el aspecto de tu aplicación.
Mobile Payment Element recopila de forma segura todos los detalles de pago necesarios para una amplia variedad de métodos de pago. Obtén información sobre los métodos de pago admitidos para Mobile Payment Element y Subscriptions.
Agregar el Payment Element a tu aplicación
Nota
Este paso muestra una forma de empezar, pero puedes usar cualquier integración de pagos dentro de la aplicación.
Inicializa y presenta el Payment Element móvil usando la clase PaymentSheet.
struct SubscribeView: View { let paymentSheet: PaymentSheet @State var isPaymentSheetPresented = false init(clientSecret: String) { var config = PaymentSheet.Configuration() // Set `allowsDelayedPaymentMethods` to true if your business handles // delayed notification payment methods like US bank accounts. config.allowsDelayedPaymentMethods = true config.primaryButtonLabel = "Subscribe for $15/month" self.paymentSheet = PaymentSheet(paymentIntentClientSecret: clientSecret, configuration: config) } var body: some View { Button { isPaymentSheetPresented = true } label: { Text("Subscribe") }.paymentSheet(isPresented: $isPaymentSheetPresented, paymentSheet: paymentSheet) { result in switch result { case .completed: // Handle completion case .canceled: break case .failed(let error): // Handle error } } } }
El Payment Element móvil renderiza una hoja 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 elijan.
Establecer allowsDelayedPaymentMethods
en true permite aceptar métodos de pago de notificación diferida como cuentas bancarias en EE. UU. Para estos métodos de pago, el estado final del pago no se conoce cuando se completa el PaymentSheet
, sino que se efectúa con éxito o falla más tarde. Si aceptas este tipo de métodos de pago, infórmale al cliente que su pedido está confirmado y solo finalízalo (por ejemplo, envía el producto) cuando el pago se realice correctamente.
Puedes personalizar el Payment Element para que coincida con el diseño de tu aplicación usando la propiedad appearance
en tu objeto PaymentSheet.
.
Confirmar pago
El Payment Element móvil crea un PaymentMethod y confirma que el primer PaymentIntent de la suscripción está incompleto, lo que genera un cargo. Si se requiere autenticación reforzada de clientes (SCA) para el pago, el Payment Element se encarga del proceso de autenticación antes de confirmar el PaymentIntent.
Configurar una URL de retornoLado del cliente
El cliente puede salir de tu aplicación para autenticarse (por ejemplo, en Safari o en su aplicación bancaria). Para permitirles que regresen automáticamente a tu aplicación después de autenticarse, configura un esquema de URL personalizado y define el delegado de la aplicación para que envíe la URL al SDK. Stripe no admite enlaces universales.
Además, debes definir la returnURL del objeto PaymentSheet.Configuration en la URL de tu aplicación.
var configuration = PaymentSheet.Configuration() configuration.returnURL = "your-app://stripe-redirect"
Escuchar 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, usa la CLI de Stripe para observar los webhooks y reenviarlos a tu aplicación. Ejecuta lo siguiente en una nueva terminal mientras tu aplicación de desarrollo está funcionando:
stripe listen --forward-to localhost:4242/webhook
Para la producción, configura una URL de punto de conexión de webhook en el Dashboard o utiliza la API Webhook Endpoints.
Escucharás algunos eventos para completar los pasos pendientes en esta guía. Consulta los eventos de suscripciones para obtener más información sobre los webhooks específicos para suscripciones.
Brindar acceso a tu servicioCliente y servidor
Ahora que la suscripción está activa, bríndales a los usuarios acceso a tu servicio. Para ello, escucha los eventos customer.
, customer.
y customer.
. Estos eventos muestran un objeto de suscripción que contiene el 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 los estados.
En tu controlador de webhook:
- Verifica el estado de la suscripción. Si está
active
entonces el usuario pagó por tu 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 necesites cambiar la tarifa o el intervalo de facturación.
- Almacena el
product.
,id subscription.
yid subscription.
en tu base de datos junto con elstatus customer.
que ya has guardado. Comprueba este registro al determinar qué características habilitar para el usuario en la aplicación.id
El estado de una suscripción puede cambiar en cualquier momento de su ciclo de vida, incluso si tu aplicación 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 bien, si implementas el portal de clientes, un usuario puede cancelar su suscripción sin visitar directamente tu aplicación. El uso correcto del controlador mantiene el estado de tu aplicación sincronizado con Stripe.
Cancelar la suscripciónCliente y servidor
Con frecuencia, se les permite a los clientes cancelar su suscripción. En este ejemplo, se agrega la opción de cancelación en la página de configuración de la cuenta.
En este ejemplo, el ID de la suscripción se recopila en el front-end, pero tu aplicación puede obtener esta información de tu base de datos para el usuario que ha iniciado sesión.

Configuración de la cuenta con la posibilidad de cancelar la suscripción
func cancelSubscription() { var request = URLRequest(url: URL(string: "http://localhost:4242/cancel-subscription")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try! JSONEncoder().encode(["subscriptionId": subscription.id]) let (subscriptionResponse, _) = try! await URLSession.shared.data(for: request) // Update the state to show the subscription has been cancelled }
En el back-end, define el punto de conexión para que la aplicación haga la llamada.
Tu back-end 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 una suscripción se cancela, no se puede reactivar. En su lugar, recopila información de facturación actualizada de tu cliente, actualiza su método de pago predeterminado y crea una nueva suscripción con su registro de cliente existente.
Prueba tu integración
Prueba métodos de pago
Usa la siguiente tabla para probar diferentes métodos y escenarios de pago.
Método de pago | Scenario | Cómo hacer la prueba |
---|---|---|
BECS Direct Debit | Your customer successfully pays with BECS Direct Debit. | Completa el formulario con el número de cuenta 900123456 y BSB 000-000 . El PaymentIntent confirmado pasa inicialmente al estado processing y, tres minutos más tarde, a succeeded . |
BECS Direct Debit | 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 000-000 . |
Credit card | 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. |
Credit card | 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. |
Credit card | 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 eventos
Configura webhooks para recibir notificaciones de los eventos de cambios en las suscripciones, como actualizaciones y cancelaciones. Obtén más información sobre los webhooks de suscripciones. Puedes ver los eventos en el Dashboard o con la CLI de Stripe.
Para obtener más detalles, consulta cómo probar tu integración con Billing.
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.