Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

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 este artículo sobre 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 correspondiente 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 para desarrolladores, haz lo siguiente:

  • Si expiryTimeMillis es una fecha futura, 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 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 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 corregir el problema.

A fin de determinar cuánto tiempo lleva el usuario en el período de gracia, llama a la API de Google Play Developer. 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 se canceló, se renovó o se suspendió la suscripción del usuario. 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 de forma dinámica a una marca de tiempo en el futuro 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 que se renovó correctamente (se actualizó la forma de pago), expiryTimeMillis se configura como una marca de tiempo en el futuro y el valor de paymentState se establece 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). A fin de obtener respuestas de muestra de 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 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 corregir el problema. 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 el período de suspensión, esta se cancelará y el usuario deberá comprar una nueva.
  • 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 (la forma de pago no funciona), el valor de expiryTimeMillis se configura como una marca de tiempo pasada y paymentState se establece en 0, de la siguiente manera:

{
  "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 como una marca de tiempo en el futuro y el valor de paymentState se establece en 1, de la siguiente manera:

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

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

{
  "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 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 a la suscripción del usuario. Por ejemplo:

{
  "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 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 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 "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:

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 el diálogo personalizado, tu app volverá a activarse y recibirá un objeto responseCode de tipo BillingClient.BillingResponse de la Biblioteca de la 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 de 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 el objeto 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á la suscripción y recibirás una notificación en tiempo real para desarrolladores de 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 una fecha futura 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 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. Para ver un ejemplo de la lógica necesaria en el servidor, consulta el método queryCurrentSubscriptions() dentro de la app de ejemplo de 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 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: 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 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 Google Play Developer 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 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 de 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: A fin de habilitar la pausa, también debes habilitar la suspensión de la cuenta.

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 Google Play Developer, busca los campos expiryTimeMillis y autoResumeTimeMillis en la respuesta Purchases.subscriptions:

    • Si el usuario tiene una pausa pendiente, tanto expiryTimeMillis como autoResumeTimeMillis contendrán fechas futuras.
    • Si el usuario está actualmente en pausa, autoResumeTimeMillis contendrá una fecha futura y expiryTimeMillis una 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 decidió pausar o reanudar la suscripción antes de que la pausa surta efecto.
    • SUBSCRIPTION_PAUSED: La suscripción actualmente está pausada.
    • SUBSCRIPTION_RENEWED: La suscripción se reanudó correctamente.
    • SUBSCRIPTION_ON_HOLD: No se pudo llevar a cabo un intento para reanudar la suscripción y, actualmente, está suspendida la cuenta de la suscripción.
  • 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 en pausa.

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 de Google Play Developer 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 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 esta referencia.

Revoca una suscripción

Si usas la API de Google Play Developer, 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. Si usas la API de Google Play Developer, 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 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: A fin de garantizar una experiencia del usuario coherente en todas las apps, a partir del 15 de abril de 2019, Google habilitará la función de restablecimiento de manera predeterminada para todos los desarrolladores con suscripciones habilitadas. Te recomendamos que pruebes esta función antes de esa fecha a fin de asegurarte de que puedes administrar correctamente los restablecimientos. Para facilitar esta transición, Google habilitó el restablecimiento para todas las cuentas de prueba de licencia. Si necesitas más información sobre las pruebas de suscripciones, consulta Prueba funciones específicas de suscripciones.

Si precisas hacer algún cambio en el código y no puedes completarlo antes del 15 de abril de 2019, inhabilita la función en 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 seguirá visible en la app de Play Store hasta la fecha de vencimiento. Un usuario puede restaurar una suscripción cancelada antes de que caduque. Para ello, debe hacer 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 una vez que se restablezca una suscripción, el valor de purchaseToken será idéntico al que tenía antes de su cancelación.

Para permitir que los usuarios restablezcan 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 Google Play Developer, 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 a contenido en línea para la app de Fishing Quarterly. Normalmente, se le factura GBP 1.25 el primer día del 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.