Cómo agregar funciones específicas para suscripciones

Las suscripciones se configuran en Play Console de Android. Una vez que tengas una suscripción configurada, podrás agregar Facturación Google Play en la app a fin de habilitar un flujo de compra para la suscripción. Las suscripciones tienen muchas características, que se mencionaron en Descripción general de Facturación Google Play, como el período de facturación, el período de gracia y la prueba gratuita, entre otras. Antes de leer esta sección, te recomendamos conocer esos conceptos.

Para obtener más información, consulta los videos sobre suscripciones más recientes.

Además, antes de leer el resto de esta página, también deberías tener habilitadas las notificaciones para desarrolladores en tiempo real, que te permiten reaccionar de manera proactiva ante los cambios de estado, a fin de aumentar tu participación y reducir la rotación de usuarios. Para habilitarlas, consulta Notificaciones para desarrolladores en tiempo real.

Hay varios casos de uso de suscripciones que deberías intentar incorporar en tu solución general de Facturación Google Play. Los casos prácticos son los siguientes:

  • Controla los cambios de estado relacionados con las suscripciones mediante las notificaciones para desarrolladores en tiempo real.
  • Permite que un usuario actualice una suscripción o pase a una versión anterior de la misma, por ejemplo, que pase de un plan individual a un plan familiar.
  • Permite que un usuario se vuelva a suscribir manualmente cuando se haya cancelado su suscripción, pero antes de que finalice el período de suscripción.
  • Reembolsa el costo de una suscripción.
  • Revoca una suscripción.
  • Cancela una suscripción.
  • Aplaza la facturación para el usuario, de manera que la suscripción sea gratuita por un determinado período de tiempo.
  • Recupera un cliente.

Combina la Biblioteca de Facturación Google Play, la API de desarrolladores de Google Play y las notificaciones para desarrolladores en tiempo real, y resuelve estos casos prácticos.

Controla los estados relacionados con las suscripciones mediante las notificaciones para desarrolladores en tiempo real

Las notificaciones para desarrolladores en tiempo real son notificaciones push del servidor que te brindan la posibilidad de supervisar los cambios de estado de las suscripciones, como SUBSCRIPTION_PURCHASED o SUBSCRIPTION_RECOVERED. Las notificaciones para desarrolladores en tiempo real te permiten reaccionar de manera proactiva ante los cambios de estado, a fin de aumentar tu participación y reducir la rotación de usuarios. Para habilitarlas, consulta Notificaciones para desarrolladores en tiempo real.

Si tienes habilitadas las notificaciones para desarrolladores en tiempo real, tu servidor backend seguro recibe notificaciones que solo te alertan ante cambios de estado de la suscripción. Después de recibir una notificación para desarrolladores en tiempo real debes llamar a la API de desarrolladores a fin de completar el estado y actualizar tu propio estado de backend. Estas notificaciones solo te indican que cambió el estado de la suscripción, no proporcionan la información completa.

Cuando revises la API de desarrollador, haz lo siguiente:

  • Si expiryTimeMillis es en el futuro, otorga el derecho a la suscripción.
  • Si autoRenewing = false, intenta que el usuario vuelva a registrarse, ya que la suscripción finalizará llegada la hora del vencimiento.
  • Si paymentState = 0, usa el vínculo directo del centro de suscripciones para enviar al usuario a que corrija el problema con el pago.

Es posible que agreguemos cambios de estado adicionales en el futuro que impacten en el derecho de suscripción de un usuario, por ejemplo, de pausar o reactivar una suscripción después de que haya caducado. Llama a la API de desarrolladores y realiza las acciones que se describen más arriba para asegurarte de controlar las notificaciones no definidas, de manera que tu integración esté lista para estas características.

El usuario se encuentra dentro del período de gracia: SUBSCRIPTION_IN_GRACE_PERIOD

El período de gracia dura una cantidad de tiempo determinada en función de la configuración de tu producto integrado en la aplicación de Google Play Console. Google Play intenta renovar la suscripción durante el período de gracia. A fin de alertar al usuario acerca del problema con el pago, proporciona un mensaje en tu app que indique a los usuarios cómo corregir la forma de pago. De lo contrario, perderán el acceso a la suscripción. El mensaje puede decir, por ejemplo: "Para evitar interrupciones en tu cuenta, accede a la configuración de tu suscripción en Google Play y corrige la forma de pago". El mensaje podría contener un vínculo a la configuración de la suscripción para que el usuario pueda hacer la corrección.

A fin de determinar cuánto tiempo lleva el usuario en el período de gracia, llama a la API de desarrolladores de Google Play. Google Play extiende el valor de expiryTimeMillis en forma dinámica hasta el vencimiento del período de gracia. Durante ese tiempo, deberías comprobar si la suscripción del usuario se canceló, se renovó o si está suspendida. Deberías revisar el estado actual de la suscripción del usuario una vez que pasó expiryTimeMillis y así podrás conocer el estado más reciente de la suscripción.

El contenido de la respuesta de JSON varía en función del estado de la suscripción, tal como se muestra en los siguientes fragmentos. Por ejemplo, si consultas por una suscripción durante el período de gracia (la forma de pago no funciona), el valor de expiryTimeMillis se actualiza en forma dinámica a una marca de tiempo en el futuro y paymentState se configura en 0:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 0  # Payment pending
    }
    

Si consultas por una suscripción que se renovó correctamente (se actualizó la forma de pago), expiryTimeMillis se configura en una marca de tiempo en el futuro y el valor de paymentState se configura en 1:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 1  # Payment received
    }
    

Si haces una consulta sobre la suscripción una vez transcurrido el período de gracia, verás que la suscripción está suspendida (si habilitas Suspensión de la cuenta en Google Play Console) o cancelada (si no habilitas Suspensión de la cuenta en Google Play Console). Para ver respuestas de JSON de muestra de SUBSCRIPTION_ON_HOLD y SUBSCRIPTION_CANCELLED, consulta la sección Suspensión de la cuenta: SUBSCRIPTION_ON_HOLD.

Suspensión de la cuenta: SUBSCRIPTION_ON_HOLD

El período de suspensión de la cuenta dura 30 días. En ese tiempo, deberías comprobar si se canceló, restauró o volvió a adquirir la suscripción del usuario. Durante ese período, informa al usuario el motivo de suspensión del acceso a la suscripción. Para ello, proporciona un mensaje en tu app con instrucciones sobre cómo corregir la forma de pago y volver a obtener acceso a la suscripción. Por ejemplo: "Hay un problema con tu suscripción. Accede a la configuración de tu suscripción en Google Play y corrige la forma de pago". El mensaje podría contener un vínculo a la configuración de la suscripción de Google Play para que el usuario pueda hacer la corrección. También deberías realizar algunas acciones, por ejemplo, las siguientes:

  • Si el usuario actualiza su forma de pago y recupera la suscripción, tu app debería restaurar el acceso al contenido de la suscripción. Para obtener más información, consulta Suscripción recuperada: SUBSCRIPTION_RECOVERED. Sin embargo, si la suscripción no se recupera durante el período de suspensión, esta se cancela y el usuario debe comprar una nueva.
  • Si tus usuarios esperan que la app acceda a la suscripción por fuera de la app, podrías enviarle una notificación push o un correo electrónico al usuario para que sepa que la suscripción ya no está activa. Si solo es posible acceder a tu suscripción cuando el usuario abre la app, es probable que solo tengas que decir que la suscripción se interrumpirá la próxima vez que el usuario abra la app.

Para verificar si una cuenta sigue suspendida, deberías revisar el estado actual de la suscripción del usuario cada vez que este intente acceder al contenido de la suscripción.

El contenido de la respuesta de JSON varía en función del estado de la suscripción, tal como se muestra en los siguientes fragmentos. Por ejemplo, si consultas por una suscripción durante la suspensión (la forma de pago no funciona), el valor de expiryTimeMillis se configura en una marca de tiempo pasada y paymentState se configura en 0:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_past,
      "autoRenewing": true,
      ...
      "paymentState": 0  # Payment pending
    }
    

Si consultas por una suscripción después de que esta se recuperó (se actualizó la forma de pago), expiryTimeMillis se configura en una marca de tiempo en el futuro y el valor de paymentState se configura en 1:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 1  # Payment received
    }
    

Si consultas por la suscripción después de transcurridos los 30 días de la suspensión y una vez cancelada la suscripción, expiryTimeMillis se configura en una marca de tiempo del pasado y el valor de cancelReason se configura en 1:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_past,
      "autoRenewing": false,
      ...
      "cancelReason": 1  # The system canceled the subscription
    }
    

Suscripción recuperada: SUBSCRIPTION_RECOVERED

Después de recuperar una suscripción, por lo general, el token de compra es idéntico a como era antes de que comience la suspensión de la cuenta del usuario. Sin embargo, es posible que el usuario haya vuelto a obtener acceso al contenido de la suscripción si volvió a comprarla durante el período de suspensión. En este caso, se muestra un nuevo valor de token de compra para representar la nueva instancia de la suscripción.

Después de registrar los datos de la nueva suscripción en tu servidor, puedes mostrar un mensaje en tu app que informe a los usuarios que se restableció la suscripción. Por ejemplo: "Se registró tu forma de pago actualizada y se restableció tu suscripción".

Cancelación de la suscripción: SUBSCRIPTION_CANCELLED

Un usuario puede cancelar una suscripción voluntariamente desde Play Store o hacer que se cancele de forma automática si no la recupera después de una suspensión. Cuando tu servidor backend seguro recibe una notificación para desarrolladores en tiempo real SUBSCRIPTION_CANCELLED, sucede lo siguiente:

  • Aparece un mensaje en tu app que informa al usuario que se canceló su suscripción. Por ejemplo: "Tu suscripción vencerá el **fecha**. Accede a la configuración de tu suscripción en Google Play para restaurarla". Este mensaje debería contener un vínculo a la configuración de la suscripción de Google Play para que el usuario pueda renovarla.
  • Deberías ofrecer la posibilidad de descartar este mensaje de forma permanente.

Cuando recibas el nuevo token de compra, sigue los pasos que aparecen en Cómo verificar un token de compra.

Nota: Los mensajes de cancelación podrían frustrar a los usuarios, en especial, a los que cancelaron manualmente una suscripción (en lugar de las cancelaciones que resultan de una forma de pago desactualizada). Puedes elegir no informar a los usuarios que cancelaron manualmente una suscripción.

Cómo cambiar el precio de una suscripción

Google Play Console te permite cambiar el precio de las suscripciones que ofreces dentro de tu app. Esta función resulta útil si cambias la cantidad de contenido o el alcance de un beneficio de la app asociado con una suscripción determinada.

Para actualizar el precio de una suscripción, completa los siguientes pasos en Google Play Console:

  1. Navega hasta la app que contiene la suscripción cuyo precio quieres cambiar.
  2. Selecciona Presencia en Google Play Store > Productos integrados en la aplicación y abre la pestaña Suscripciones.
  3. Selecciona el vínculo Editar que aparece junto al precio que quieres cambiar, como se muestra en la Figura 1.

    Vínculo "Editar" junto al precio de la suscripción
    Figura 1: Edición del campo de precio de la suscripción
  4. Ingresa el nuevo precio que quieres que tenga la suscripción.

    Cuando cambias el precio, aparece un diálogo de advertencia, como se muestra en la Figura 2, donde se explica que el cambio surte efecto de inmediato para los nuevos suscriptores y en un período de 30 días para los suscriptores existentes que aceptan el cambio de precio.

    Diálogo de advertencia de cambio de precio de la suscripción
    Figura 2: Advertencia acerca del momento en que surte efecto el cambio de precio de la suscripción

Comunica el cambio de precio al usuario

Tienes al menos 7 días para comunicar a tus suscriptores existentes acerca del cambio de precio antes de que Google Play comience a notificarlos. Cuando Google Play notifica a los usuarios, muestra un diálogo similar al que aparece en la Figura 3. Este diálogo muestra el precio anterior, el nuevo precio y la fecha en la que surtirá efecto este último.

Diálogo de cambio de precio de suscripción genérico
Figura 3: Diálogo genérico para notificar al usuario acerca de un cambio de precio de la suscripción

Dentro de tu app, puedes mostrar este diálogo de las siguientes maneras:

Cómo iniciar el flujo de confirmación de cambio de precio

Para que el diálogo se muestre al iniciar tu app, agrega la siguiente lógica a tu clase de cliente de facturación:

Kotlin

    val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
            .setSkuDetails(changedPriceSubscriptionSkuDetails)
            .build()

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            object : PriceChangeConfirmationListener() {
                override fun onPriceChangeConfirmationResult(responseCode: Int) {
                    if (responseCode == BillingResponse.OK) {
                        // User has confirmed the price change.
                    } else if (responseCode == BillingResponse.USER_CANCELED) {
                        // User hasn't confirmed the price change.
                    }
                }
            })
    

Java

    PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
            .setSkuDetails(changedPriceSubscriptionSkuDetails)
            .build();

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            new PriceChangeConfirmationListener() {
                @Override
                public void onPriceChangeConfirmationResult(int responseCode) {
                    if (responseCode == BillingResponse.OK) {
                        // User has confirmed the price change.
                    } else if (responseCode == BillingResponse.USER_CANCELED) {
                        // User hasn't confirmed the price change.
                    }
                }
            });
    

Antes de mostrar el diálogo de cambio de precio de Google Play, puedes presentar tu propio mensaje o diálogo donde se explique el motivo del cambio de precio. Si creas este tipo de mensaje personalizado y lo muestras, es más probable que tus usuarios elijan renovar la suscripción con el nuevo precio.

Después de que el usuario responda el diálogo personalizado, tu app volverá a activarse y recibirá un responseCode del tipo BillingClient.BillingResponse de la biblioteca de Facturación Play.

Puedes controlar la respuesta del usuario en tu implementación de PriceChangeConfirmationListener. Por ejemplo, podrías mostrar un mensaje de agradecimiento personalizado si el usuario aceptó el cambio de precio.

Controla la confirmación del cambio de precio del usuario

Si el usuario acepta el nuevo precio de la suscripción, la biblioteca también envía una notificación a tu servidor de facturación. Puedes recibir notificaciones acerca de la respuesta del usuario al diálogo desde la función de notificaciones para desarrolladores en tiempo real de Google. Si un usuario acepta tu cambio de precio, recibes una notificación del tipo SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Qué hacer si se rechazó el cambio de precio

Es posible que el usuario no acepte el cambio de precio en PriceChangeConfirmationListener de tu app. En este caso, mantén la suscripción al producto anterior, que vencerá en la próxima fecha de renovación. Si un usuario no aceptó tu cambio de precio antes del vencimiento de la suscripción anterior, se anulará la suscripción y recibirás una notificación para desarrolladores en tiempo real del tipo SUBSCRIPTION_CANCELED.

Si tu app admite suscripciones, incluye un vínculo a la pantalla de configuración o preferencias que permita a los usuarios administrar sus suscripciones. En la Figura 4, se muestra un ejemplo de este tipo de vínculo. En el controlador de clic del vínculo, agrega la lógica para determinar si el usuario tiene alguna suscripción sin vencimiento de tu app (donde expiryTimeMillis es en el futuro o el valor de autoRenewing está configurado en true):

  • Si el usuario no tiene ese tipo de suscripción dentro de tu app, haz que se dirija a la página que muestra todas las demás suscripciones, como se muestra en la Figura 5, mediante la siguiente URL:

        http://play.google.com/store/account/subscriptions
        
  • Si, por el contrario, el usuario tiene una suscripción sin vencimiento, puedes hacer que navegue directamente a su suscripción, como se muestra en la Figura 6, mediante la siguiente URL:

        https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
        

Cada SKU de la suscripción coincide con el ID del producto que le asignaste al crearlo en Play Console. Para determinar el SKU de una suscripción existente de manera programática, consulta el backend de tu app a fin de conocer la lista de suscripciones asociadas con un usuario en particular. Para ver un ejemplo de la lógica necesaria en el servidor consulta el método queryCurrentSubscriptions() dentro de la app de ejemplo ClassyTaxi.

Una pantalla de Configuración que incluye un botón llamado "Suscripciones de Google Play"
Figura 4: El botón Suscripciones de Google Play en este mensaje proporciona un ejemplo de vínculo para "administrar suscripciones"
Una pantalla de información detallada de suscripciones que muestra las suscripciones del usuario en todas las apps
Figura 5: La pantalla muestra todas las suscripciones del usuario que compró fuera de la app y que lo enviaron a esta pantalla
Una pantalla de información detallada de suscripciones que muestra una suscripción específica que el usuario compró en una app determinada
Figura 6: La pantalla muestra información detallada de una suscripción específica que el usuario compró desde la app y que lo envió a esta pantalla

Permite la actualización o el cambio a una versión anterior de una suscripción

Puedes ofrecer diferentes niveles de suscripción a los usuarios, por ejemplo, un nivel básico y un nivel premium. En la Figura 7, se muestra una pantalla que ofrece dos niveles de suscripción:

Figura 7: Niveles de suscripción

Los usuarios deberían poder acceder a una pantalla similar para actualizar o cambiar a una versión anterior la suscripción mediante la compra de un nivel de suscripción diferente. Tu app debería manejar este caso con el mismo flujo de compra de productos integrados en la aplicación que se usó para comprar la suscripción original en Habilita la compra de un producto integrado en la aplicación. Sin embargo, al actualizar la suscripción o cambiarla a una versión anterior, pasas los ID de productos para la suscripción actual y la futura (ya sea que se haya actualizado o cambiado a una versión anterior) al objeto BillingFlowParams con el método setOldSku(). Por ejemplo:

Kotlin

    val flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(newSkuDetails)
            .setOldSku(currentId)
            .build()
    val responseCode = billingClient.launchBillingFlow(activity, flowParams)
    

Java

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(newSkuDetails)
            .setOldSku(currentId)
            .build();
    int responseCode = billingClient.launchBillingFlow(flowParams);

    

Cuando recibas el token de compra, sigue el mismo proceso de verificación que usaste para un nuevo token de compra. Para obtener más información, consulta Cómo verificar una compra. La API de desarrolladores de Google Play mostrará linkedPurchaseToken en el recurso de la suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken a fin de asegurarte de que no se use el token anterior para acceder a tus servicios.

Cuando un usuario actualiza la suscripción o la cambia a una versión anterior, el estado SUBSCRIPTION_PURCHASED se envía a un servidor backend seguro. Para administrar SUBSCRIPTION_PURCHASED, consulta Cómo administrar SUBSCRIPTION_PURCHASED.

Cómo configurar el modo de prorrateo

Al actualizar una suscripción o cambiar a una versión anterior de la misma, puedes configurar replaceSkusProrationMode en la clase BillingFlowParams para proporcionar información detallada acerca del prorrateo que se aplicará cuando cambie la suscripción.

Kotlin

    val flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(skuDetails)
            .setOldSku(oldSku)
            .setReplaceSkusProrationMode(replaceSkusProrationMode)
            .build()
    val responseCode = billingClient.launchBillingFlow(activity, flowParams)
    

Java

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(skuDetails)
            .setOldSku(oldSku)
            .setReplaceSkusProrationMode(replaceSkusProrationMode)
            .build()
    int responseCode = billingClient.launchBillingFlow(activity, flowParams);
    

En la siguiente tabla, se enumeran los modos de prorrateo.

IMMEDIATE_WITH_TIME_PRORATION El reemplazo se realiza de inmediato y la nueva hora de vencimiento se prorratea y se acredita o se cobra al usuario. Actualmente, este es el comportamiento predeterminado.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE El reemplazo se realiza inmediatamente y el ciclo de facturación no cambia. Se cobrará el precio del período restante.

Nota: Esta opción solo está disponible para la actualización de suscripciones.

IMMEDIATE_WITHOUT_PRORATION El reemplazo se realiza inmediatamente y el nuevo precio se cobra cuando vuelve a aparecer la suscripción. El ciclo de facturación no cambia.
DEFERRED El reemplazo se realiza cuando vuelve a aparecer la suscripción.

Para comprender cómo funciona cada modo, piensa en la siguiente situación:

Samsagaz tiene una suscripción a contenido en línea de la app de Jardinero. Actualmente, tiene una suscripción mensual de la versión de contenido de Nivel 1, que solo tiene texto. Esta suscripción tiene un costo de USD 2 por mes y se renueva el primer día del mes.

El 15 de abril, Samsagaz decide actualizar su suscripción al Nivel 2, lo que incluye actualizaciones de video y tiene un costo de USD 3 por mes.

Al actualizar la suscripción, el desarrollador selecciona un modo de prorrateo. En la siguiente lista, se identifica la manera en que cada modo de prorrateo afecta a la suscripción de Samsagaz.

  • IMMEDIATE_WITH_TIME_PRORATION: Con este modo, la suscripción de Nivel 1 de Samsagaz finaliza de inmediato. Como ya pagó el mes completo (del 1 al 30 de abril), pero solo usó la mitad de esa duración, la mitad de la suscripción de ese mes (USD 1) se aplica a la nueva suscripción. Sin embargo, como la nueva suscripción tiene un valor de USD 3, el saldo del crédito de USD 1 solo paga diez días de suscripción. Por lo tanto, el crédito de Samsagaz se aplica a su suscripción del 15 al 25 de abril. El 26 de abril, se le descuentan USD 3 por su nueva suscripción y otros USD 3 el día 26 de cada mes siguiente.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: Con este modo, la suscripción de Nivel 1 de Samsagaz finaliza de inmediato. Como ya pagó el mes completo (del 1 al 30 de abril), pero solo usó la mitad, la otra mitad de la suscripción de ese mes (USD 1) se aplica a la nueva suscripción. Sin embargo, como la nueva suscripción tiene un costo de USD 3 por mes, los restantes 15 días tienen un costo de USD 1.50. Entonces, se le cobra la diferencia de USD 0.50 por esta nueva suscripción y otros USD 3 el primer día de cada mes siguiente.
  • IMMEDIATE_WITHOUT_PRORATION: Con este modo, la suscripción de Nivel 1 de Samsagaz se actualiza de inmediato al Nivel 2, sin costo adicional. Y, el 1 de mayo, se le cobran USD 3 por su nuevo nivel de suscripción y otros USD 3 el primer día de cada mes siguiente.
  • DEFERRED: Con este modo, la suscripción de Nivel 1 de Samsagaz continúa hasta su vencimiento, que es el 30 de abril. El 1 de mayo, comienza la suscripción de Nivel 2 y a Samsagaz se le cobran USD 3 por el nuevo nivel de suscripción.

Permite que el usuario vuelva a suscribirse

Los usuarios pueden volver a suscribirse a una suscripción cancelada incluso si esta todavía no venció. Podrías permitir que se vuelvan a suscribir dentro de tu app si aplicas el mismo flujo de compra de productos integrados en la aplicación a la suscripción cancelada (con el mismo ID del producto). Para obtener más información, consulta Habilita la compra de un producto integrado en la aplicación.

La nueva suscripción reemplazará a la anterior y se renovará en la misma fecha de vencimiento. Por ejemplo, Aquiles tiene una suscripción a App de Música. La fecha de vencimiento actual para la suscripción es el 1 de agosto. El 10 de julio, vuelve a suscribirse a la suscripción por un mes con el mismo precio mensual. La nueva suscripción se prorrateará con el crédito restante, se activará de inmediato y se renovará el 1 de agosto.

Deberías mostrar una opción de IU adecuada que permita volver a suscribirse:

  • Si el usuario no tiene una suscripción activa, la app mostrará el botón "Comprar".
  • Si el usuario tiene una suscripción cancelada (SUBSCRIPTION_CANCELLED), la app podría mostrar el botón "Volver a suscribir". Para obtener más información, consulta Cómo administrar SUBSCRIPTION_CANCELLED.

Cuando recibas el token de compra, sigue el mismo proceso de verificación que usaste para un nuevo token de compra. Para obtener más información, consulta Cómo verificar una compra. La API de desarrolladores de Google Play mostrará linkedPurchaseToken en el recurso de la suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken a fin de asegurarte de que no se use el token anterior para acceder a tus servicios.

Reembolsa el costo de una suscripción

Google Play no ofrece una ventana de reembolso para las suscripciones. En cambio, los usuarios tendrán que solicitarte directamente el reembolso. Los usuarios pueden usar la página Mis pedidos de Play Store o comunicarse contigo.

Si recibes solicitudes de reembolso, puedes usar la API de desarrolladores de Google Play o el Merchant Center para hacer lo siguiente:

  1. Cancelar la suscripción (Purchases.subscriptions:cancel)
  2. Verificar que ya esté cancelada (muestra el código de respuesta 200 de HTTP) (Purchases.subscriptions:cancel)
  3. Reembolsar el pago del usuario sin cancelar la suscripción (Purchases.subscriptions:refund)

Si quieres reembolsar un importe superior al del pago más reciente, puedes procesar reembolsos adicionales mediante el Merchant Center.

Si la suscripción está cancelada, se envía el estado SUBSCRIPTION_CANCELLED al servidor backend seguro. Para administrar SUBSCRIPTION_CANCELLED, consulta Cómo administrar SUBSCRIPTION_CANCELLED.

Cómo revocar una suscripción

Si usas la API de desarrolladores de Google Play, puedes usar el recurso Purchases.subscriptions:revoke para revocar suscripciones. Cuando lo hagas, instantáneamente se revocará el acceso a la suscripción. Generalmente, esto se hace si tú o Google sospechan que hubo fraude.

Cómo cancelar una suscripción

Un usuario también puede cancelar una suscripción desde la app de Play Store. Si usas la API de desarrolladores de Google Play, también puedes usar el recurso Purchases.subscriptions:cancel para cancelar suscripciones.

Nota: Esta API suele usarse cuando los usuarios solicitan un reembolso desde la página Mis pedidos. Para obtener más información consulta Reembolsa el costo de una suscripción.

Los usuarios conservan el acceso al contenido hasta que finaliza el ciclo de facturación actual. Entonces, se revoca el acceso.

Importante: No deberías quitar una suscripción de Google Play mientras haya usuarios con derecho a acceder al contenido. Si quitas contenido que debes a un usuario, podrían aplicarse sanciones legales. Para obtener más información, consulta la sección Cancelaciones en Cómo crear una suscripción.

Cómo restaurar una suscripción

Nota: A fin de garantizar una experiencia del usuario constante en todas las apps, desde el 15 de abril de 2019, Google habilitará la función de restauración de manera predeterminada para todos los desarrolladores con suscripciones habilitadas. Te recomendamos que pruebes la función de restauración antes de esa fecha a fin de asegurarte de que puedes manejar correctamente las restauraciones. Para facilitar esta transición, Google habilitó la restauración para todas las cuentas de prueba de licencia. Para obtener más información sobre las pruebas de suscripciones, consulta Prueba funciones específicas de suscripciones.

Si necesitas hacer algún cambio en el código y no puedes completarlo antes del 15 de abril de 2019, puedes inhabilitar Google Play Console. Para ello, accede a Presencia en Google Play Store > Productos integrados en la aplicación > Configuración de las suscripciones y anula la selección de Permitir que los usuarios restauren suscripciones en Google Play. Además, ten en cuenta que puedes inhabilitar la opción después de que el cambio entre en vigencia el 15 de abril de 2019.

Una suscripción cancelada sigue visible en la app de Play Store hasta la fecha de vencimiento. El usuario puede hacer clic en RESTABLECER en la sección Cuenta > Suscripciones de la app de Play Store.

Figura 4: Sección Cuenta > Suscripciones en la app de Play Store

Se puede detectar si se restableció una suscripción de las siguientes dos maneras:

  1. Tu app recibe la notificación SUBSCRIPTION_RESTARTED. Puedes obtener más información en Notificaciones para desarrolladores en tiempo real.
  2. Llamas al método getPurchases() cada vez que se abre la aplicación. Ten en cuenta de que una vez que se restaura una suscripción, el valor de purchaseToken será idéntico al que tenía antes de que se cancele.

Para permitir que los usuarios restauren suscripciones canceladas, haz lo siguiente:

  1. Accede a Google Play Console.
  2. Selecciona tu app y navega hasta Presencia en Google Play Store > Productos integrados en la aplicación.
  3. Selecciona la pestaña Suscripciones y, luego, expande la sección Configuración de las suscripciones.
  4. Marca la casilla de verificación Permitir que los usuarios restauren suscripciones en Google Play, como se muestra en la Figura 5 y haz clic en Guardar.
    Figura 5: Casilla de verificación Activar el restablecimiento de suscripciones en Google Play Console.

Cómo aplazar la facturación

Si usas la API de desarrolladores de Google Play, puedes aplazar la próxima fecha de facturación para un suscriptor mediante Purchases.subscriptions:defer. El usuario sigue suscrito al contenido y tiene acceso total al mismo, pero no se cobra durante el período de aplazamiento. La fecha de renovación de la suscripción se actualizará para reflejar la nueva fecha. El aplazamiento de la facturación te permite lo siguiente:

  • Puedes brindar acceso gratuito a los usuarios como parte de un paquete o una oferta especial, como el acceso gratuito al contenido web para los usuarios que se suscriben a una revista impresa.
  • Puedes dar acceso gratuito a los clientes como gesto de buena voluntad.

La facturación puede aplazarse un día o hasta un año por llamada a la API. Luego, puedes volver a llamar a la API antes de que llegue la próxima fecha de facturación para aplazarla nuevamente.

Por ejemplo, Darcy tiene una suscripción mensual a contenido en línea para la app de Pesca trimestral. Normalmente, se le factura GBP 1.25 el primer día del mes. En marzo, participa en una encuesta en línea para el publicador de la app. El publicador la recompensa con seis semanas gratuitas. Para ello, aplaza el próximo pago hasta el 15 de mayo (seis semanas después de la fecha de facturación programada anteriormente del 1 de abril). A Darcy no se le cobra por abril ni el comienzo de mayo, y sigue teniendo acceso al contenido. El 15 de mayo, se le cobra la tarifa de suscripción habitual mensual de GBP 1.25. La próxima fecha de renovación será el 15 de junio.

Tal vez quieras notificar al usuario (por correo electrónico o dentro de la app) para hacerle saber que se aplazó (se cambió) la fecha de facturación.

Recupera un cliente

Si un cliente leal abandona tu servicio después de un largo tiempo, es posible que quieras ofrecer un ID del producto que represente un precio especial por tu suscripción, también llamado SKU de recuperación. Puedes brindar la oferta en tu app o notificar al usuario mediante un correo electrónico. Para iniciar una suscripción de recuperación, inicia el flujo de compra en tu app de Android mediante la Biblioteca de Facturación Google Play. Este es el mismo proceso que el de una suscripción nueva, pero puedes determinar qué SKU está disponible para el usuario.

Noticias y recursos más recientes

Próximos pasos

Una vez que hayas agregado funciones específicas para suscripciones, continúa con las Recomendaciones.