Ciclo de vida de la suscripción

Las compras de suscripciones pueden pasar por diferentes estados durante su ciclo de vida, según varios factores, como el comportamiento de renovación automática, los casos de rechazo de pago y las acciones de administración para desarrolladores.

Controla el ciclo de vida de las suscripciones con renovación automática

Cuando cambia el estado de suscripción de un usuario, tu servidor de backend recibe un mensaje SubscriptionNotification.

Figura 1: Estados del ciclo de vida y eventos de transición para la compra de suscripciones con renovación automática.

Para actualizar el estado en tu backend, llama a la API de purchases.subscriptionsv2.get con el token de compra incluido en la notificación. Este extremo proporciona el último estado de la suscripción a partir de un token de compra y se considera la fuente de información para la administración de la suscripción.

El token de compra es válido desde el registro de la suscripción hasta 60 días después del vencimiento. Después de esta fecha, el token de compra ya no es válido para llamar a la API de Google Play Developer.

Nuevas compras de suscripciones con renovación automática

Cuando un usuario compra una suscripción, se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_PURCHASED a tu cliente de RTDN. Si recibes esta notificación o registras una compra nueva en la app con PurchasesUpdatedListener o la recuperación manual de compras en el método onResume() de tu app, debes procesar la compra nueva en el backend seguro. Para hacerlo, sigue estos pasos:

  1. Consulta el extremo purchases.subscriptionsv2.get para obtener un recurso de suscripción que contenga el último estado de la suscripción.
  2. Asegúrate de que el valor del campo subscriptionState sea SUBSCRIPTION_STATE_ACTIVE.
  3. Verifica la compra.
  4. Otórgale al usuario acceso al contenido. La cuenta de usuario asociada con la compra se puede identificar con el objeto ExternalAccountIdentifiers del recurso de suscripción si los identificadores se establecieron en el momento de la compra con setObfuscatedAccountId y setObfuscatedProfileId.

La Biblioteca de Facturación Play también incluye un método para confirmar una suscripción, acknowledgePurchase(), y un método para verificar el estado de confirmación, isAcknowledged(). Sin embargo, te recomendamos que controles el procesamiento de compras en tu backend para mejorar la seguridad.

El recurso de suscripción para compras nuevas es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Renovaciones de suscripciones

En el caso de las suscripciones sin cuotas y con renovación automática, se envía una notificación de SUBSCRIPTION_RENEWED cuando se renueva la suscripción. En el caso de las suscripciones con cuotas, se envía una notificación de SUBSCRIPTION_RENEWED cada vez que se cobra la suscripción en su fecha de facturación. Asegúrate de que el usuario siga teniendo derecho a la suscripción y, luego, actualiza el estado de la suscripción con el expiryTime nuevo proporcionado en el recurso de suscripción que muestra la API de Google Play Developer. El recurso de suscripción es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

No es necesario que confirmes las renovaciones de suscripción.

Período de gracia

Si hay problemas de pago con una renovación de suscripción, Google se lo notifica al usuario y, de forma periódica, intenta renovar la suscripción durante un tiempo antes de que esta venza. Este período de recuperación puede consistir de un período de gracia seguido de un período de suspensión de la cuenta. Durante el período de gracia, el usuario debería seguir teniendo acceso a sus derechos de suscripción.

El método queryPurchasesAsync() continúa mostrando compras que se encuentran en el período de gracia. Si tu app se basa únicamente en queryPurchasesAsync para determinar si un usuario tiene derecho a una suscripción, esta debería controlar automáticamente los períodos de gracia, ya que estas suscripciones se muestran como activas a través de la Biblioteca de Facturación Play.

La sincronización del estado de la suscripción con tu backend te permite estar más al tanto de los rechazos de pagos y te brinda mayor contexto a la hora de intentar reducir la deserción involuntaria. Escucha mensajes SubscriptionNotification con el tipo SUBSCRIPTION_IN_GRACE_PERIOD para recibir una notificación cuando el usuario ingrese en un período de gracia. Mientras el usuario se encuentra en un período de gracia, el recurso de suscripción contiene autoRenewEnabled = true. Google Play extiende de forma dinámica el valor expiryTime hasta que finaliza el período de gracia porque el derecho debe durar hasta que el usuario lo cancele o hasta que este período se cumpla por completo. El valor del campo subscriptionState durante este período es SUBSCRIPTION_STATE_IN_GRACE_PERIOD. El recurso de suscripción es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Play les informa a los usuarios que se rechazó su pago y están en un período de gracia, y les solicita que corrijan los problemas con su forma de pago en Play Store. Cuando un usuario ingresa en un período de gracia, también debes sugerirle que corrija su forma de pago en caso de que el rechazo sea de origen involuntario. Una forma directa de hacerlo es usar la API de In-App Messaging. Si llamas a esta API cuando el usuario abre tu app, este verá un mensaje de Play en una barra de notificaciones temporal informándole que se rechazó su pago. El mensaje también incluye un vínculo directo para que el usuario corrija su forma de pago en Google Play.

En cuanto el usuario corrige la forma de pago, la suscripción se renueva con su fecha de renovación original, y puedes controlar la renovación como se describe en Renovaciones.

Si el usuario no corrige la forma de pago durante el período de gracia, se suspenderá la cuenta y se cancelará el derecho correspondiente.

Acceso a la suscripción durante el período de gracia y recuperación

En la Figura 2, se muestra el cronograma de una suscripción que entra en un período de gracia y se recupera cuando el usuario corrige la forma de pago. Una vez que finaliza el período de gracia, el usuario debería perder los beneficios de la suscripción, y la cuenta debería suspenderse.

Figura 2: Cronograma de una suscripción que entra en un período de gracia y se recupera antes de que finalice.

Es importante recordar los siguientes puntos:

  • Durante el período de gracia, el usuario debería conservar el acceso a los beneficios de la suscripción.
  • Cuando una suscripción se recupera durante un período de gracia, la fecha de renovación no se restablece.
  • Si aumentas el período de gracia (por ejemplo, de 7 a 14 días), los usuarios que están en un período de gracia tendrán acceso extendido a los beneficios de la suscripción.
  • Si reduces el período de gracia, se revocarán de inmediato los beneficios de la suscripción a los usuarios que estén lo suficientemente avanzados en el período de gracia anterior como para superar el nuevo. Por ejemplo, si reduces el período de gracia de 14 a 7 días, se revocarán de inmediato los beneficios de la suscripción a los usuarios que se encuentren entre los días 8 y 14 del período de gracia anterior.
  • La suscripción permanecerá en un estado activo y no recibirás una RTDN de período de gracia hasta que finalice el período de gracia silencioso.

Período de gracia silencioso

Puedes establecer un período de gracia de 0 días, pero Play esperará un mínimo de 1 día para garantizar tiempo suficiente para los reintentos de pago. Este período de gracia silencioso ofrece una red de seguridad para el procesamiento de pagos. Durante este período de 24 horas, la suscripción permanece en el estado ACTIVE.

La mejor manera de mantenerte al tanto de los cambios de estado de las suscripciones es escuchar las notificaciones para desarrolladores en tiempo real (RTDN) y reaccionar a ellas. Llama al método purchases.subscriptionsv2.get() con el tiempo de RTDN en lugar del tiempo de vencimiento para obtener un estado más preciso de la suscripción.

Según el estado de la suscripción después del período de gracia de 24 horas, deberías recibir una de las siguientes notificaciones:

  • SUBSCRIPTION_ON_HOLD (si está habilitada)
  • SUBSCRIPTION_CANCELED (si se canceló)
  • SUBSCRIPTION_EXPIRED (si venció)
  • SUBSCRIPTION_RENEWED (si se renovó correctamente)

También puedes llamar al método subscriptionV2.get() en cualquier momento después del período de gracia silencioso de 24 horas para obtener el estado más reciente de la suscripción.

Suspensión de la cuenta

Si hay problemas de pago con una renovación de la suscripción, después de que finalice cualquier período de gracia, comenzará un período de suspensión de la cuenta. Cuando una suscripción entra en suspensión de la cuenta, debes bloquear el acceso al derecho de suscripción.

Durante la suspensión de la cuenta, debes controlar las cancelaciones, los restablecimientos o las recompras de tus suscripciones, según sea necesario, ya que es posible que el usuario realice estos cambios en ese período.

Las RTDN te notifican cuando el usuario entra en el período de suspensión de la cuenta, de modo que puedas informarle lo antes posible por qué se suspendió su acceso a la suscripción. Una forma directa de hacerlo es usar la API de In-App Messaging. El llamado a esta API cuando el usuario abra la app mostrará un mensaje en una barra de notificaciones temporal informándole que se rechazó su pago. El mensaje también incluye un vínculo directo para que el usuario corrija su forma de pago en Google Play.

Si el usuario puede acceder al contenido de la suscripción fuera de la app, es posible que descubra que perdió el acceso en diferentes plataformas. Te recomendamos que le envíes una notificación push o un correo electrónico al usuario para que sepa que la suscripción ya no está activa debido al rechazo del pago.

El método queryPurchasesAsync() no muestra la suscripción durante la suspensión de la cuenta, por lo que, si tu app se basa en este método para mostrar compras existentes, debes admitir la suspensión de la cuenta de forma predeterminada.

Con las notificaciones para desarrolladores en tiempo real, recibirás un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_ON_HOLD cuando se suspenda una cuenta. Llama al método purchases.subscriptionsv2.get desde tu servidor de backend seguro para recuperar la información de la suscripción nueva. Durante la suspensión de la cuenta, el campo expiryTime del recurso de suscripción se establece en una marca de tiempo de pasado, y subscriptionState se establece en SUBSCRIPTION_STATE_ON_HOLD:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Para restablecer el acceso, los usuarios deben corregir su forma de pago. Play informa a los usuarios que tienen suspendida la cuenta por el rechazo del pago, y también debes sugerirles que corrijan su forma de pago.

Después que el usuario corrija su forma de pago, la suscripción volverá a un estado activo, y deberás restablecer el acceso al contenido de la suscripción. En este caso, el token de compra es el mismo que antes de que comenzara la suspensión de la cuenta, ya que se recupera la misma compra, y recibes una RTDN de tipo SUBSCRIPTION_RECOVERED.

En el caso de las suscripciones por cuotas, es posible que se produzcan rechazos y recuperaciones de pagos para cualquier intento de pago individual.

Después de la recuperación, la Biblioteca de Facturación Play vuelve a mostrar la suscripción con el método queryPurchasesAsync(). Si usas este método para determinar si un usuario tiene derecho a una suscripción, tu app debería controlar automáticamente la recuperación de la suscripción de la suspensión de la cuenta.

Detecta un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_RECOVERED para recibir una notificación cuando se recupere una suscripción, y el usuario debería recuperar el acceso. Si consultas por una suscripción después de recibir esta notificación, se establece el campo expiryTime en una marca de tiempo de futuro, y el campo subscriptionState se vuelve a establecer en SUBSCRIPTION_STATE_ACTIVE:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Si el usuario no corrige su forma de pago antes de que finalice el período de suspensión de la cuenta, en su lugar, recibirás una RTDN con el tipo SUBSCRIPTION_CANCELED. Para obtener instrucciones para controlar una cancelación, consulta la sección Cancelaciones. Cuando consultas una suscripción que se canceló de esta manera, el campo expiryTime que se muestra se establece en una marca de tiempo de pasado:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Después de que se te notifique la cancelación durante la suspensión de la cuenta, también recibirás una RTDN de tipo SUBSCRIPTION_EXPIRED porque el usuario no tiene derechos de pago, y la suscripción desertó con la cancelación. Puedes controlar este vencimiento como lo harías normalmente.

Para recuperar el acceso, el usuario, vuelve a comprar el mismo plan de suscripción o cualquier otro plan que ofrezcas en la app durante el período de suspensión de la compra original. En ese caso, se emite un token de compra nuevo, y se muestra el valor nuevo como parte de un evento SUBSCRIPTION_PURCHASED que representa esta instancia nueva.

Acceso y recuperación a una cuenta suspendida

En la Figura 3, se muestra el cronograma de una suscripción que entra en suspensión de la cuenta y, luego, se recupera cuando el usuario corrige la forma de pago.

Figura 3: Cronograma de una suscripción que entra en suspensión de la cuenta y se recupera antes de que finalice.

Al igual que en el ejemplo anterior, en la Figura 4, se muestra el cronograma de una suscripción que primero entra en un período de gracia antes de entrar en suspensión de la cuenta y que luego se recupera mientras está suspendida.

Figura 4: Cronograma de una suscripción que entra en período de gracia, luego, en suspensión de la cuenta y, por último, se recupera antes de que finalice la suspensión.

Es importante recordar los siguientes puntos:

  • Antes de que una suscripción entre en suspensión de la cuenta, Google Play realizará intentos adicionales para realizar el cobro a la forma de pago durante un máximo de 48 horas. El usuario retiene los beneficios de la suscripción durante este período. Después de que haya transcurrido este período de reintento, la suscripción entra en suspensión de la cuenta, y el usuario debería perder el acceso a los beneficios de la suscripción.
  • La suscripción entra en suspensión de la cuenta directamente cuando esta se reanuda desde un estado pausado con una forma de pago fallida.
  • Cuando una suscripción se recupere de la suspensión de cuenta, se restablecerá la fecha de renovación.

Vencimientos

Una vez que vence una suscripción, el usuario debería perder acceso a ella. En ese caso, se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_EXPIRED. Cuando recibas esta notificación, consulta la API de Google Play Developer para obtener el recurso de suscripción más reciente. Después de confirmar que subscriptionState sea SUBSCRIPTION_STATE_EXPIRED, quita el derecho y registra el estado de la compra como no válido en tu backend. El recurso de suscripción es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

Cancelaciones

Un usuario puede cancelar una suscripción de forma voluntaria desde el centro de suscripciones de Play o hacer que se cancele automáticamente si no la recupera después de una suspensión de la cuenta. Los desarrolladores también pueden activar una cancelación con purchases.subscriptions.cancel. Cuando se cancela una suscripción, el usuario retiene el acceso al contenido hasta que finalice el ciclo de facturación actual. Cuando finaliza el ciclo de facturación, se debería revocar el acceso.

La cancelación de una suscripción sin cuotas y con renovación automática activa una notificación de SUBSCRIPTION_CANCELED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer tiene el campo subscriptionState establecido en SUBSCRIPTION_STATE_CANCELED, y el campo expiryTime contiene la fecha en la que el usuario debería perder el acceso a la suscripción. Si esa fecha está en el pasado, el usuario debería perder los derechos de inmediato. Esto puede ocurrir, por ejemplo, si un usuario cancela una suscripción mientras está suspendida, debido al rechazo del pago.

El recurso de suscripción por una compra cancelada es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

En el caso de las suscripciones por cuotas, se envía una notificación SUBSCRIPTION_CANCELLATION_SCHEDULED cuando el usuario inicia una cancelación y quedan pagos pendientes para el período de compromiso. La cancelación está pendiente y entrará en vigencia al final del período de compromiso actual. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer tiene el campo subscriptionState establecido en SUBSCRIPTION_STATE_ACTIVE porque la suscripción por cuotas sigue activa hasta el final del período de compromiso. Sin embargo, hay un objeto pendingCancellation vacío presente. Se envía una notificación de SUBSCRIPTION_CANCELED seguida de una de SUBSCRIPTION_EXPIRED al final del período de compromiso.

El recurso de suscripción para una compra de suscripción por cuotas que está pendiente de cancelación es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

Puedes consultar el campo canceledStateContext en el recurso de suscripción para saber por qué se canceló la suscripción (por ejemplo, si fue cancelada por el usuario, el sistema o tú). Si el usuario canceló la suscripción, puedes consultar el campo userInitiatedCancellation para conocer el motivo de la cancelación. Esto puede ayudar a informar estrategias de comunicación.

Cuando se cancela una suscripción, pero todavía no venció, de todos modos, se muestra desde queryPurchasesAsync(). Es posible que desees mostrar un mensaje en tu app para informarle al usuario que se canceló su suscripción y darle la fecha de vencimiento.

Revocaciones

Un usuario puede revocar una suscripción por varios motivos, incluida la revocación del backend con purchases.subscriptionsv2.revoke o la devolución del cargo de la compra. En este caso, revoca el derecho del usuario de inmediato. Cuando esto ocurre, se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_REVOKED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer tiene el campo subscriptionState establecido en SUBSCRIPTION_STATE_EXPIRED.

El recurso de suscripción por una compra revocada es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

Suscripciones diferidas

Existen varios motivos por los que podrías querer extender el derecho de un usuario. Por ejemplo, es posible que quieras ofrecerles a los usuarios acceso sin costo como una promoción especial, por ejemplo, dar una semana gratis para comprar una película o brindar acceso gratuito a los clientes como gesto de buena voluntad. Puedes usar el método purchases.subscriptions.defer de la API de Play Developer para adelantar la próxima fecha de facturación de una suscripción con renovación automática. Cuando lo haces, se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_DEFERRED. Durante el período de diferimiento, el usuario está suscrito a tu contenido con acceso completo, pero no se le cobra. Se actualiza la fecha de renovación de la suscripción para reflejar la nueva fecha.

En el caso de los planes prepagados, puedes usar la API para aplazar la facturación para diferir la fecha de vencimiento.

El recurso de suscripción para una suscripción diferida es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

Suscripciones pausadas

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.

Recursividad de la suscripción Semanal Mensual Tres meses Seis meses Anual
Duraciones de pausa disponibles* 1 semana
2 semanas
3 semanas
4 semanas
1 mes
2 meses
3 meses
1 mes
2 meses
3 meses
1 mes
2 meses
3 meses
N/A
*Sujeto a cambios en cualquier momento.

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 y no paga el precio de renovación. Cuando finaliza 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, debido a un problema con la forma de pago, no es posible reanudar la suscripción, se suspenderá la cuenta del usuario, como se muestra en las Figuras 5 y 6:

Figura 5: Un usuario pausa la suscripción y, luego, la reanuda.
Figura 6: Un usuario pausa su suscripción y se suspende la cuenta.

Durante el período de pausa, el usuario también puede decidir si desea reanudar la suscripción manualmente en cualquier momento, como se muestra en la Figura 6. En este caso, la fecha de facturación cambia a la fecha de reanudación manual.

Cuando se pausa la suscripción de un usuario, la Biblioteca de Facturación Play no la muestra a través del método queryPurchasesAsync(). Si se reanuda la suscripción, el método queryPurchasesAsync() la vuelve a mostrar.

Detecta las RTDN para estar al tanto de cuándo un usuario pausa su suscripción. Estas notificaciones también te permiten informarles a los usuarios en tu app cuando pausaron su suscripción y no tienen acceso a ella. También deberías proporcionarles un vínculo directo a Google Play para que puedan reanudar la suscripción manualmente en cualquier momento.

Se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED cuando el usuario pausa su suscripción. En este momento, el usuario debería mantener el acceso a su suscripción hasta la próxima fecha de renovación, y el recurso de suscripción contiene autoRenewEnabled = true. En este punto, el valor del campo subscriptionState es SUBSCRIPTION_STATE_ACTIVE.

Se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_PAUSED cuando la pausa entra en vigor. Cuando esto sucede, el usuario debería perder acceso a su suscripción, el recurso de suscripción contiene autoRenewEnabled = true, y el campo subscriptionState se establece en SUBSCRIPTION_STATE_PAUSED. Para saber cuándo se espera que la suscripción vuelva a renovarse, verifica el objeto PausedStateContext.

Se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_RENEWED si se reanuda la suscripción automáticamente al final del período de pausa o si el usuario decidió reanudar la suscripción manualmente. Esto se debe controlar, según se describe en Renovaciones.

Se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_ON_HOLD si se produjo un error de pago mientras se intentaba reanudar la suscripción después de la pausa. Esto se debe controlar según se describe en Suspensión de la cuenta.

Cómo volver a suscribirse

En el caso de los planes básicos de suscripción con renovación automática, Google Play Store puede mostrar el botón Volver a suscribirse, que les permite a los usuarios recuperar el acceso a una suscripción. Es posible que no aparezca por varios motivos, como cuando una suscripción venció hace mucho tiempo.

Figura 7: En la sección Cuenta > Suscripciones de la app de Google Play Store, se muestra una suscripción cancelada y el botón Resubscribe (Volver a suscribirse).

Si bien el botón siempre se etiqueta como Volver a suscribirse, su funcionalidad depende del estado de la suscripción.

Cuando se cancela una suscripción, pero todavía no venció, el usuario sigue suscrito y recibe los beneficios de la suscripción. Si el usuario presiona Volver a suscribirse, se deshace la cancelación y se renueva la suscripción. Esta acción se conoce como restablecer en la documentación y las APIs para desarrolladores de Play.

Una vez que venció una suscripción con renovación automática, puedes permitir que los usuarios compren el mismo plan básico de suscripción. Esta acción se conoce como volver a suscribirse en la documentación y las APIs para desarrolladores de Play. Puedes configurar esta opción para cada plan básico en Play Console o con la API.

Cómo restablecer antes del vencimiento

Si tu app depende solo del método queryPurchasesAsync() para determinar si un usuario tiene derecho a una suscripción, debería controlar automáticamente los restablecimientos, ya que el método queryPurchasesAsync() continúa mostrando compras canceladas antes de sus fechas de vencimiento. Una suscripción restablecida se renueva como si no se hubiera cancelado.

Si tu app sincroniza el estado de la suscripción con un backend, debes detectar el mensaje SubscriptionNotification con el tipo SUBSCRIPTION_RESTARTED. Después de recibir este RTDN, tu app puede responder a la notificación, registrar que la suscripción está lista para renovarse y dejar de mostrar mensajes de restablecimiento. El recurso de suscripción es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Cómo volver a suscribirse después del vencimiento

Si se configura un plan básico con renovación automática a través de Google Play Console o la API para permitir la acción de Volver a suscribirse, los usuarios pueden volver a comprar una suscripción vencida en Google Play Store.

Estas son compras nuevas. Google Play emite un token de compra nuevo, y el backend recibe una RTDN con el tipo SUBSCRIPTION_PURCHASED. El estado de compra de este tipo de compra fuera de la app no incluirá un linkedPurchaseToken asociado con la compra original en este caso, ya que la suscripción original venció por completo. Se trata de compras nuevas que tu backend debe procesar y confirmar como cualquier otra compra.

Actualizaciones, cambios a versiones inferiores y cómo volver a suscribirse

Cuando un usuario realiza una actualización, cambia a una versión inferior o vuelve a registrarse después de la cancelación desde tu app antes del vencimiento de la suscripción, la suscripción anterior se invalida, y se crea una suscripción nueva con un token de compra nuevo.

Además, el recurso de suscripción que muestra la API de Google Play Developer contiene el campo linkedPurchaseToken que indica la compra anterior desde la que el usuario realizó la actualización, cambió a una versión inferior o volvió a suscribirse. Puedes usar el token de compra en ese campo para buscar la suscripción anterior e identificar la cuenta de usuario existente, de manera que puedas asociar la compra nueva con la misma cuenta.

Antes de ofrecerles a los usuarios opciones de actualización, cambio a una versión inferior o volver a suscribirse en la app, debes confirmar la suscripción existente. Cualquier cambio de plan o caso en que se vuelva a suscribir se bloquea si la suscripción existente aún está pendiente de confirmación.

Si el usuario compra correctamente la actualización, cambia a una versión inferior o vuelve a suscribirse, esta es una compra nueva que debes confirmar. La forma recomendada de hacerlo es usar la API de Google Play Developer. El recurso de suscripción es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Cambios de precio

Consulta la guía de prácticas recomendadas para el cambio de precio para obtener información sobre cómo cambiar los precios de las suscripciones con renovación automática y cómo notificarles a los usuarios cuando corresponda.

Cuando los cambios de precio se apliquen a los suscriptores existentes con solicitud de aceptación, recibirás una RTDN si el usuario toma medidas para confirmar o rechazar el precio nuevo.

Controla la confirmación del cambio de precio con solicitud de aceptación por parte del usuario

Cuando un usuario acepta el aumento de precio de tu suscripción, recibes un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Si hay una disminución de precio sin solicitud de aceptación o cuando se renueve el aumento de precio de la suscripción, recibirás un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_RENEWED. Trata esta notificación como cualquier otra renovación.

Controla los casos en los que se rechaza un aumento de precio con solicitud de aceptación

Si un usuario rechazó el aumento de precio con solicitud de aceptación antes de la renovación por un precio más alto, se anula la suscripción automáticamente y recibes un mensaje SubscriptionNotification del tipo SUBSCRIPTION_CANCELED. Controla este evento como se describe en Cancelaciones.

Los usuarios también pueden seguir el mismo mecanismo para cancelar sus suscripciones por un aumento de precio sin solicitud de aceptación.

Controla el ciclo de vida de los planes prepagados

Al igual que con las suscripciones con renovación automática, debes confirmar los planes prepagados después de cada compra nueva. En el caso de los planes prepagados, debes procesar, por completo, la compra inicial y las recargas, ya que el usuario debe pasar siempre por el flujo de compra.

Debido a las posibles duraciones breves del plan prepagado, es importante que confirmes la compra lo antes posible. Los planes prepagados con una duración de una semana o más deben confirmarse en un plazo de 3 días. Los planes prepagados con una duración menor a una semana deben confirmarse en la mitad de la duración del plan. Por ejemplo, los desarrolladores tienen 1.5 días para confirmar la compra de un plan prepagado de tres días.

Figura 8: Estados del ciclo de vida y eventos de transición para la compra de suscripciones.

Se envía un mensaje SubscriptionNotification con el tipo SUBSCRIPTION_PURCHASED a tu cliente de RTDN cada vez que se compra una suscripción de un plan prepagado, incluidas todas las recargas. Llama al método purchases.subscriptionsv2.get para comprobar el estado más reciente de la suscripción del plan prepagado.

Se emite un nuevo token de compra para las compras de recarga, y recibes el token de compra anterior en el campo linkedPurchaseToken como parte del nuevo estado de compra de la suscripción. El token de compra es válido desde el registro de la suscripción hasta 60 días después del vencimiento. Después de esta fecha, el token de compra ya no es válido para llamar a la API de Google Play Developer.

El recurso de suscripción para la compra de un plan prepagado es similar al siguiente ejemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

Puedes ver cuándo finaliza el derecho en el campo expiryTime. Las compras de recarga aumentan el tiempo de derecho acumulándolo. Es decir, si el usuario realiza una recarga antes de que finalice su derecho original, el período de tiempo nuevo se suma a la fecha de vencimiento anterior.

Es posible que desees mostrar un mensaje en tu app para informarle al usuario que sus suscripciones prepagadas se pueden extender con una recarga. Para saber cuándo un usuario podrá realizar una recarga, consulta el campo allowExtendAfterTime en el recurso de suscripción.

Los planes prepagados no se renuevan automáticamente, por lo que no se pueden cancelar. Si un usuario desea cancelar un plan prepagado, puede dejar que alcance su fecha de vencimiento.