Agrega 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 la 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 la 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 en tiempo real para desarrolladores, que te permiten reaccionar de manera proactiva ante cambios de estado, a fin de aumentar tu participación y reducir la rotación de usuarios. Para habilitarlas, consulta Notificaciones en tiempo real para desarrolladores.

Hay varios casos prácticos de suscripciones que deberías intentar incorporar en tu solución general de la 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 en tiempo real para desarrolladores

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

Si tienes habilitadas las notificaciones en tiempo real para desarrolladores, tu servidor de backend seguro recibe notificaciones que solo te alertan ante cambios de estado de suscripciones. Después de recibir una notificación en tiempo real para desarrolladores, debes llamar a la API de desarrollador 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 y 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, porque 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 impacten en el derecho de suscripción 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 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 podría 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". 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 desarrolladores de Google Play. Google Play extiende dinámicamente el valor expiryTimeMillis hasta que finaliza el período de gracia. Durante ese tiempo, deberías comprobar si se canceló, se renovó o se suspendió la suscripción del usuario. Debes verificar el estado actual de la suscripción del usuario una vez que haya pasado expiryTimeMillis para obtener el último estado 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ó, restableció 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 de Google Play para que el usuario pueda corregir su forma de pago. También deberías realizar algunas acciones, como las siguientes:

  • Si el usuario actualiza su forma de pago y recupera la suscripción, tu app debería restablecer el acceso al contenido. Para obtener más información, consulta Suscripción recuperada: SUBSCRIPTION_RECOVERED. Sin embargo, si la suscripción no se recupera durante este período de suspensión, la suscripción se cancela y el usuario debe comprar una nueva suscripción.
  • Si tus usuarios esperan que la app acceda a la suscripción de forma externa, 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 recuperar la suscripción (se actualizó la forma de pago), expiryTimeMillis se establece en una marca de tiempo del 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 recuperaste 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 de backend seguro recibe una notificación en tiempo real para desarrolladores de tipo 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 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.

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)
}

Cambia el precio de una suscripción

Advertencia: No deberías cambiar el precio de una suscripción de tipo 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 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 contenga 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 quieras cambiar, como se muestra en la Figura 1.

    Vínculo
    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. En este diálogo, se 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 acerca de un cambio de precio de la suscripción

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

Inicia 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 sobre la respuesta del usuario al diálogo desde la función de notificaciones en tiempo real para desarrolladores de Google. Si un usuario acepta el 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 PriceChangeConfirmationListener de tu app. En este caso, mantén la suscripción anterior, que vencerá en la próxima fecha de renovación. Si un usuario no aceptó el cambio de precio antes del vencimiento de la suscripción anterior, se anulará su suscripción y recibirás una notificación en tiempo real para desarrolladores 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 puede apreciarse 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 ella, 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 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: Pantalla que 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 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 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 administrar 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, cuando se actualiza la suscripción o se cambia a una versión anterior, pasas los ID de productos de 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. Si necesitas 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 el token anterior no se use 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 de backend seguro. Para administrar SUBSCRIPTION_PURCHASED, consulta Cómo administrar SUBSCRIPTION_PURCHASED.

Configura el modo de prorrateo

Cuando se actualiza una suscripción o se cambia a una versión anterior, 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 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, 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 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 por mes, 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 el 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.

Pausa 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 tiempo de entre una semana y tres meses, según el período recurrente. Una vez habilitada la función de pausa, 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 ten en cuenta 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 la reanudación es exitosa, la suscripción vuelve a estar activa. Si, debido a un problema con la forma de pago, falla la reanudación, 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

Al pausar una suscripción, recomendamos indicar al usuario, cuando se encuentre en la app, que no tendrá acceso a ella 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 desarrolladores de Google Play, busca los campos expiryTimeMillis y autoResumeTimeMillis en la respuesta 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 renovó 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 en tiempo real para desarrolladores (RTDN). A fin de asegurarte de obtener la información más reciente de la suscripción, debes llamar a la API de Google Play Developer en respuesta a todos los tipos 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: No se pudo llevar a cabo un intento para reanudar la suscripción y, actualmente, está suspendida la cuenta correspondiente.
  • En el dispositivo Android, usa la Biblioteca de la Facturación Google Play para llamar a queryPurchases() cada vez que se inicie la aplicación. Usa PurchasesUpdatedListener para recibir actualizaciones mientras la app se está ejecutando. 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 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 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 de 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 suscribirse". 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. Si necesitas más información, consulta Cómo verificar una compra. La API para desarrolladores de Google Play mostrará un 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 anterior para acceder a tus servicios.

Ofrece un código promocional para una suscripción

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

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 Google Play Developer o 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 Merchant Center.

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

Revoca 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, se revocará al instante el acceso a la suscripción. Generalmente, esto se hace si tú o Google sospechan que hubo fraude.

Cancela una suscripción

Un usuario también puede cancelar una suscripción desde la app de Play Store. Con la API de desarrolladores de Google Play, también puedes cancelar una suscripción 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. Luego, se revoca el acceso.

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

Restablece una suscripción

Nota: La función de restablecimiento está habilitada de manera predeterminada para todos los desarrolladores que habilitaron las suscripciones. Te recomendamos que pruebes esta función a fin de asegurarte de que puedes administrar correctamente los restablecimientos. Para ayudar en las pruebas, Google habilitó la función de restablecimiento para todas las cuentas de prueba de licencias. Si necesitas más información sobre las pruebas de suscripciones, consulta Prueba 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 seguirá 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 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 en tiempo real para desarrolladores.
  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 restaurado 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 restauren 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

Aplaza la facturación

Si usas la API de desarrolladores de Google Play, puedes aplazar la próxima fecha de facturación de un suscriptor mediante el recurso Purchases.subscriptions:defer. El usuario seguirá suscrito al contenido y tendrá acceso total a este, pero no se le cobrará 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 a 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 Pesca trimestral. Normalmente, se le factura GBP 1.25 el primer día de cada mes. En marzo, participa en una encuesta en línea que le envió el editor de la app. A modo de recompensa, recibe 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.

Te recomendamos que notifiques al usuario (por correo electrónico o dentro de la app) para que sepa 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 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 la 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.