Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

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 la sección Notificaciones para desarrolladores en tiempo real.

Hay varios casos prácticos de suscripciones que deberías incorporar en tu solución general de Facturación Google Play.

Combina la biblioteca de Facturación Google Play, la API de Google Play Developer y las notificaciones para desarrolladores en tiempo real a fin de abordar estos casos prácticos.

Controla los estados relacionados con las suscripciones mediante 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 la sección 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 obtener el estado completo 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 está en el futuro, otorga siempre el derecho.
  • Si autoRenewing = false, intenta hacer que el usuario vuelva a registrarse, ya que la suscripción finalizará a la hora de vencimiento.
  • Si paymentState = 0, envía al usuario al centro de suscripciones mediante el vínculo directo del centro de suscripciones para solucionar su problema de pago.

Es posible que agreguemos cambios de estado en el futuro que afecten el derecho de acceso de un usuario (por ejemplo, reactivar una suscripción después de vencida). Llama a la API para desarrolladores y realiza las acciones que se describen más arriba a fin de asegurarte de controlar las notificaciones no definidas, de manera que tu integración esté lista para estas funciones.

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

El período de gracia tiene una duración 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á el acceso a la suscripción. El mensaje podría decir, por ejemplo: "Para evitar interrupciones en tu cuenta, accede a la configuración de tu suscripción de Google Play y corrige la forma de pago". Podría contener un vínculo a la configuración de la suscripción para que el usuario pueda corregir el problema.

Para determinar cuánto tiempo tiene el usuario en el período de gracia, llama a la API de Google Play Developer. Google Play extiende dinámicamente el valor expiryTimeMillis hasta que finaliza el período de gracia. Durante ese tiempo, deberías comprobar si la suscripción del usuario se canceló, se renovó o si está suspendida. Debes verificar el estado actual de la suscripción del usuario una vez que haya pasado expiryTimeMillis para obtener el estado actualizado 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 es incorrecta), expiryTimeMillis se actualiza dinámicamente a una marca de tiempo futura y paymentState se establece en 0:

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

Si consultas por una suscripción después de que se haya renovado correctamente (se actualizó la forma de pago), expiryTimeMillis se establece en una marca de tiempo en el futuro y paymentState es 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). Si quieres ver ejemplos de respuestas JSON para 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 la suscripción de 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 corregir su forma de pago. 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 la sección Suscripción recuperada: SUBSCRIPTION_RECOVERED. Sin embargo, la suscripción se cancela si no se recupera durante este período de suspensión, y el usuario debe adquirir una nueva suscripción.
  • 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 de la cuenta (la forma de pago es incorrecta), expiryTimeMillis se establece en una marca de tiempo pasada y paymentState se establece en 0:

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

Si consultas por una suscripción después de recuperarla (se actualizó la forma de pago), expiryTimeMillis se establece en una marca de tiempo en el futuro y paymentState es 1:

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

Si consultas por una suscripción después de que la suspensión se ejecutó durante 30 días y la suscripción se canceló, expiryTimeMillis se establece en una marca de tiempo pasada y cancelReason se establece 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 la suscripción en Google Play para restablecerla". Este mensaje debería contener un vínculo a la configuración de la suscripción 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 producidas por una forma de pago desactualizada). Puedes elegir no informar a los usuarios que cancelaron manualmente una suscripción.

El usuario pausó su suscripción: SUBSCRIPTION_PAUSED

Cuando se consulta por una suscripción que está pausada, si expiryTimeMillis es una fecha pasada y autoResumeTimeMillis es una fecha futura, deberías suspender el acceso del usuario al contenido y considerar pausado el derecho del usuario:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": $subscription_entitlement_end_time (in the past)
      "autoRenewing": true,
      "paymentState": 1  # Payment received
      ...
      "autoResumeTimeMillis": $subscription_auto_resume_time (in the future)
    }
    

Cómo cambiar el precio de una suscripción

Advertencia: No deberías cambiar el precio de una suscripción Suscríbete con Google.

Google Play Console te permite cambiar los precios de las suscripciones que ofreces en tu app. Esta funcionalidad es útil si cambias la cantidad de contenido o el alcance de los beneficios integrados en la aplicación y asociados 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
    Figura 1: Cómo editar el 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 que notifica al usuario sobre un cambio en el 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 al diálogo personalizado, tu app volverá a estar activa y recibirá un responseCode de tipo BillingClient.BillingResponse de la biblioteca de Facturación Google 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, recibirás una notificación del tipo SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Qué hacer si se rechazó el cambio de precio

Es posible que el usuario no esté de acuerdo con el cambio de precio en el 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 clics de este vínculo, agrega lógica para determinar si el usuario tiene suscripciones sin vencer de tu app (donde expiryTimeMillis está en el futuro o autoRenewing se establece 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:

        https://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.

Una pantalla de Configuración que incluye un botón llamado
Figura 4: El botón Suscripciones de Google Play que se muestra en esta imagen es un ejemplo de vínculo para "administrar suscripciones".
Pantalla que muestra información detallada de las suscripciones del usuario en todas las apps
Figura 5: Pantalla que muestra todas las suscripciones que el usuario compró fuera de la app y lo enviaron a esta pantalla
Pantalla de información detallada de la suscripción que muestra una suscripción específica que el usuario compró en una app determinada
Figura 6: Pantalla que muestra información detallada de una suscripción específica que el usuario compró desde la app y 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 subir o bajar de categoría, pasas los ID de productos para la suscripción actual y la futura (de cualquiera de las dos opciones) 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 Google Play Developer mostrará un linkedPurchaseToken en el recurso de la suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken para garantizar que no se use el anterior al 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

Cuando subes o bajas la categoría de una suscripción, puedes configurar replaceSkusProrationMode en la clase BillingFlowParams para proporcionar información detallada sobre el 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 Country Gardener. 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.

Cómo pausar una suscripción

Puedes permitir que los usuarios pausen sus suscripciones para reducir la deserción voluntaria. Cuando habilitas la función de pausa, los usuarios pueden elegir si desean pausar su suscripción por un período de entre una semana y tres meses, según el período recurrente. Una vez habilitada la función de pausa, esta se muestra en el centro de la suscripción y en el flujo de cancelación. Ten en cuenta que los límites de pausa entre una semana y tres meses pueden cambiar en cualquier momento. También considera que las suscripciones anuales no se pueden pausar.

Importante: Debes habilitar la suspensión de la cuenta a fin de habilitar la pausa.

Para permitir que los usuarios puedan pausar su suscripción, haz lo siguiente:

  1. Accede a Google Play Console.
  2. Selecciona tu app y ve a Presencia en Google Play Store > Productos integrados en la aplicación > Suscripciones.
  3. Expande la secciónConfiguración de las suscripciones.
  4. Marca Activar la pausa.

La pausa de una suscripción solo surte efecto una vez finalizado el período de facturación actual. Mientras la suscripción se encuentra pausada, el usuario no tiene acceso a ella. Al finalizar el período de pausa, se reanuda la suscripción y Google intenta renovarla. Si se reanuda correctamente, la suscripción vuelve a estar activa. Si no se puede reanudar debido a un problema con la forma de pago, se suspende la cuenta del usuario, como se muestra en la figura 8.

Diagrama de transición del estado de pausa a suspensión de la cuenta
Figura 8: Un usuario pausa su suscripción y se suspende la cuenta.

Durante el período de pausa, el usuario también puede decidir reanudar la suscripción manualmente en cualquier momento, como se muestra en la figura 9. Al hacerlo, la fecha de facturación cambia a la fecha de reanudación manual.

Diagrama de transición del estado de pausa al estado de reanudación
Figura 9: Un usuario pausa la suscripción y, luego, la reanuda

A la hora de pausar una suscripción, te recomendamos indicarle al usuario, cuando esté usando la app, que no tendrá acceso a la suscripción porque está pausada. También deberías proporcionarle una manera de reanudar la suscripción manualmente mediante un vínculo directo a Google Play.

Puedes detectar cuando se pausa y, luego, reanuda una suscripción con cualquiera de los siguientes métodos:

  • Con la API de Google Play Developer, busca los campos expiryTimeMillis y autoResumeTimeMillis en la respuesta de Purchases.subscriptions:

    • Si el usuario tiene una pausa pendiente, tanto expiryTimeMillis como autoResumeTimeMillis contienen fechas futuras.
    • Si el usuario está actualmente en pausa, autoResumeTimeMillis contiene una fecha futura y expiryTimeMillis contiene una fecha pasada.
    • Si el usuario reanudó la suscripción, la respuesta contendrá datos de suscripción activos.
    • Si el usuario tiene la cuenta suspendida, la respuesta contendrá datos de la suspensión.
  • Usa notificaciones para desarrolladores en tiempo real (RTDN). A fin de asegurarte de obtener la información más reciente sobre la pausa de la suscripción, debes llamar a la API de Google Play Developer en respuesta a todos los tipos de notificaciones de RTDN, incluidos los que no reconoces. Los tipos de notificaciones pertinentes para la pausa de la suscripción son los siguientes:

    • SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED: Un usuario eligió pausar o reanudar la suscripción antes de que la pausa surta efecto.
    • SUBSCRIPTION_PAUSED: La suscripción está en pausa.
    • SUBSCRIPTION_RENEWED: Se reanudó correctamente la suscripción.
    • SUBSCRIPTION_ON_HOLD: Hubo un intento fallido de reanudar la suscripción y, por el momento, está suspendida la cuenta correspondiente.
  • En el dispositivo Android, usa la biblioteca de Facturación Google Play para llamar al objeto queryPurchases() cada vez que se inicie la aplicación. Usa PurchasesUpdatedListener para recibir actualizaciones mientras se está ejecutando la app. La lista de objetos Purchase en onPurchasesUpdated() no contiene suscripciones pausadas.

Permite que el usuario vuelva a suscribirse

Los usuarios pueden volver a suscribirse a una suscripción cancelada incluso si esta no venció. Puedes permitir que los usuarios se vuelvan a suscribir desde tu app si aplicas el mismo flujo de compra de productos integrados en la aplicación que para la suscripción cancelada (con el mismo ID de producto).

Cuando se vuelven a suscribir los usuarios, cualquier suscripción activa se reemplaza y se conserva la misma fecha de vencimiento que la suscripción que se está reemplazando. 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 por un mes con el mismo precio. La nueva suscripción se prorratea con el crédito restante de la suscripción anterior. Luego, la suscripción nueva se activa de inmediato y se renueva 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 Google Play Developer mostrará un linkedPurchaseToken en el recurso de la suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken para garantizar que no se use el anterior al acceder a tus servicios.

Ofrece un código promocional para una suscripción

Las promociones o los códigos promocionales te permiten obsequiar productos únicos o pruebas gratuitas de suscripciones sin cargo a una cantidad limitada de usuarios. Si quieres implementar códigos promocionales para pruebas de suscripciones, consulta Cómo implementar una promoción.

Cómo reembolsar 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. Para ello, 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 Google Play Developer 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 Google Play Developer, puedes usar el recurso Purchases.subscriptions:revoke a fin de 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 y, con la API de Google Play Developer, puede hacerlo mediante Purchases.subscriptions:cancel.

Nota: Esta API suele usarse cuando los usuarios solicitan un reembolso desde la página Mis pedidos. Para obtener más información, consulta Cómo reembolsar 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 restablecer una suscripción

Nota: La función de restablecimiento está activada de manera predeterminada para todos los desarrolladores que habilitaron las suscripciones. Te recomendamos que pruebes esta función a fin de asegurarte de que puedas administrar correctamente los restablecimientos. Para ayudar en las pruebas, Google habilitó la función de restablecimiento para todas las cuentas de prueba con licencia. Si necesitas más información sobre las pruebas de suscripciones, consulta Cómo probar funciones específicas de suscripciones.

Puedes inhabilitar esta función en Google Play Console. Para ello, debes ir a Presencia en Google Play Store > Productos integrados en la aplicación > Configuración de las suscripciones y desmarcar Permitir que los usuarios restauren suscripciones en Google Play.

Una suscripción cancelada sigue visible en la app de Play Store hasta la fecha de vencimiento. Un usuario puede restablecer una suscripción cancelada antes de que venza si hace clic en RESTABLECER, en la sección Suscripciones de la app de Play Store, como se muestra en la figura 10:

Figura 10: Sección Cuenta > Suscripciones de 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. Puedes llamar al método getPurchases() cada vez que se abre la aplicación. Ten en cuenta que después de que se haya restablecido una suscripción, purchaseToken será idéntico a lo que era antes de que se cancelara la suscripción.

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 restablezcan suscripciones en Google Play, como se muestra en la figura 11 y haz clic en Guardar.
    Figura 11: Casilla de verificación para Activar el restablecimiento de suscripciones en Google Play Console

Cómo aplazar la facturación

Si usas la API de Google Play Developer, puedes aplazar la próxima fecha de facturación de un suscriptor mediante el recurso 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 al contenido en línea de la app de Fishing Quarterly. Normalmente, se le factura GBP 1.25 el primer día de cada 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 mucho tiempo, es posible que quieras ofrecer un ID de producto que represente un precio especial de 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 Prácticas recomendadas.