Suscripción con complementos

Las suscripciones con complementos te permiten agrupar varios productos de suscripción que se pueden comprar, facturar y administrar juntos. Tus suscripciones existentes al catálogo de productos se pueden ofrecer sin problemas como complementos, sin necesidad de especificaciones iniciales ni configuración adicional. Puedes iniciar un flujo de compra con varios productos de suscripción existentes y venderlos como complementos.

Consideraciones

Ten en cuenta los siguientes puntos cuando uses la función de suscripción con complementos:

  • Las suscripciones con complementos solo son compatibles con los planes básicos con renovación automática.

  • Todos los elementos de la compra deben tener el mismo período de facturación recurrente. Por ejemplo, no puedes tener una suscripción con facturación anual y complementos con facturación mensual.

  • Puedes tener un máximo de 50 elementos en una suscripción con compra de complementos.

  • Esta función no está disponible en las regiones de India (IN) ni Corea del Sur (KR).

Cómo realizar la integración con la Biblioteca de Facturación Play

En esta sección, se describe cómo integrar la función de suscripción con complementos en la Biblioteca de Facturación Play (PBL). Se supone que conoces los pasos iniciales de la integración de PBL, como agregar la dependencia de PBL a tu app, inicializar el BillingClient y conectarte a Google Play. En esta sección, se abordan los aspectos de la integración de PBL que son específicos de las suscripciones con complementos.

Cómo iniciar un flujo de compra

Para iniciar un flujo de compra de una suscripción con complementos, sigue estos pasos:

  1. Recupera todos los elementos de tu suscripción con el método BillingClient.queryProductDetailsAsync.

  2. Establece el objeto ProductDetailsParams para cada elemento.

    El elemento representado por el objeto ProductDetailsParams especifica tanto el ProductDetails que indica el elemento de suscripción como un offerToken que selecciona una suscripción base plan o offer específicas.

  3. Especifica los detalles del elemento en el método BillingFlowParams.Builder.setProductDetailsParamsList. La clase BillingFlowParams especifica los detalles de un flujo de compra.

    En el siguiente ejemplo, se muestra cómo iniciar el flujo de facturación para la compra de una suscripción con varios elementos:

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

Reglas aplicables a los artículos de la compra

  • Para garantizar que las fechas de renovación de los complementos se alineen con el elemento básico, Google Play puede insertar un cargo prorrateado después de cualquier fase de prueba o precio de lanzamiento.
  • La elegibilidad de la oferta se evaluará por separado para cada artículo.

Procesa compras

El procesamiento de suscripciones con complementos es el mismo que el procesamiento de compras de un solo elemento, como se describe en Integra la Biblioteca de Facturación Google Play en tu app. La única diferencia es que el usuario puede recibir varios derechos con una sola compra. La compra de una suscripción con complementos devuelve varios elementos que se pueden recuperar con Purchase.getProducts() en la Biblioteca de Facturación Google Play y, luego, la lista lineItems en purchases.subscriptionsv2.get de la API de Google Play Developer.

Cómo modificar suscripciones con complementos

Cualquier cambio en tu suscripción con complementos genera una actualización o una degradación. Para obtener más información, consulta cómo actualizar o cambiar a una versión inferior de las suscripciones.

Para cambiar o restablecer una compra existente de una suscripción con complementos en tu app, debes llamar a la API de launchBillingFlow con parámetros adicionales y asegurarte de lo siguiente:

  • Siempre llama a setOldPurchaseToken con el token de compra de la compra de suscripción actual.
  • Para actualizar, cambiar a una versión inferior o cambiar de versión un elemento, llama a SubscriptionProductReplacementParams.setReplacementMode para especificar cómo se debe controlar el cambio de plan entre el elemento de compra anterior y el nuevo. De lo contrario, no es necesario establecer este parámetro.
  • Cuando no se cambia el elemento base, puedes llamar a SubscriptionProductReplacementParams.setSubscriptionReplacementMode para aplicar un comportamiento de reemplazo específico. Para conocer las reglas aplicables en este caso, consulta Permite que el usuario vuelva a suscribirse o cambie de plan dentro de la misma suscripción.
  • Los complementos nuevos se aplicarán de inmediato con un cargo prorrateado para alinear la próxima fecha de renovación con el elemento básico de la suscripción.
  • Los complementos quitados vencerán al final de sus períodos de facturación actuales.
  • Cuando inicies el flujo de facturación, deberás especificar todos los elementos activos de la suscripción con complementos, excepto los que se quitarán, junto con los complementos nuevos.

En el siguiente ejemplo, se muestra cómo llamar a la API de launchBillingFlow cuando se cambia una compra existente de una suscripción con complementos:

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

Situaciones de modificación de suscripciones

En la siguiente tabla, se enumeran las distintas situaciones de modificación de suscripciones con complementos y el comportamiento correspondiente.

Cuándo usar SubscriptionProductReplacementParams

Artículos existentes Artículos modificados ¿Necesitas establecer el modo de reemplazo en SubscriptionProductReplacementParams? Comportamiento
A (artículo base), B A (artículo base) Sí (usa KEEP_EXISTING)
  • El elemento B está programado para su eliminación diferida.
  • Se conserva el elemento A.
  • Los usuarios conservarían el precio actual del artículo A, incluido cualquier resto de los pagos de lanzamiento que hayan recibido en el momento del registro.
A A (artículo base), B Sí (usa KEEP_EXISTING para A)
  • El artículo B se agrega de inmediato con un cargo prorrateado.
  • Se conserva el elemento A.
  • Los usuarios conservarían el precio actual del artículo A, incluido cualquier resto de los pagos de lanzamiento que hayan recibido en el momento del registro.
A (artículo base), B A (elemento base), C Sí (usa KEEP_EXISTING para A)
  • B está programado para su eliminación diferida.
  • C se agrega de inmediato con un cargo prorrateado.
  • Se conserva el elemento A.
  • Los usuarios conservarían el precio actual del artículo A, incluido cualquier resto de los pagos de lanzamiento que hayan recibido en el momento del registro.
A (artículo base), B B (artículo base) No A está programado para una eliminación diferida.
A (artículo base), B C (artículo base)
  • El reemplazo de A -> C depende de SubscriptionProductReplacementParams replacementMode.
  • B está programado para su eliminación diferida.
A (artículo base), B C (artículo base), B
  • El reemplazo de A -> C depende de SubscriptionProductReplacementParams replacementMode.
  • Para mantener el elemento B sin cambios, establece su modo de reemplazo como KEEP_EXISTING. De lo contrario, el modo de reemplazo predeterminado es IMMEDIATE_WITHOUT_PRORATION.
A (artículo base), B C (artículo base), D
  • El reemplazo de A -> C depende de SubscriptionProductReplacementParams replacementMode.
  • B está programado para su eliminación diferida.
  • D se agrega de inmediato con un cargo prorrateado.
A (artículo base), B A (elemento base), C
  • El reemplazo de A -> A y B -> C depende del modo de reemplazo proporcionado en SubscriptionProductReplacementParams replacementMode en cada ProductDetailsParams.
  • Para mantener el elemento A sin cambios, establece su modo de reemplazo como KEEP_EXISTING.
A (artículo base), B y C D (artículo base), B y C
  • El reemplazo de A->D y B->B, C->C depende del modo de reemplazo proporcionado en SubscriptionProductReplacementParams replacementMode en cada ProductDetailsParams.
  • Para mantener los elementos B y C sin cambios, establece su modo de reemplazo como KEEP_EXISTING.

Cuándo usar SubscriptionUpdateParams

Artículos existentes Artículos modificados ¿Necesitas establecer la información de reemplazo? Comportamiento
A (artículo base), B A (artículo base) No
  • El elemento B está programado para su eliminación diferida.
  • El comportamiento del artículo A depende del parámetro de configuración Cambios en el plan básico y las ofertas del plan básico.
  • El precio del artículo A se actualiza al precio más reciente, y es posible que los usuarios pierdan los pagos de lanzamiento que obtuvieron durante el registro según los criterios de elegibilidad de la oferta.
A A (artículo base), B No
  • El artículo B se agrega de inmediato con un cargo prorrateado.
  • El comportamiento del artículo A depende del parámetro de configuración Cambios en el plan básico y las ofertas del plan básico.
  • El precio del artículo A se actualiza al precio más reciente, y es posible que los usuarios pierdan los pagos de lanzamiento que obtuvieron durante el registro según los criterios de elegibilidad de la oferta.
A (artículo base), B A (elemento base), C No
  • B está programado para su eliminación diferida.
  • C se agrega de inmediato con un cargo prorrateado.
  • El comportamiento del artículo A depende del parámetro de configuración Cambios en el plan básico y las ofertas del plan básico.
A (artículo base), B B (artículo base) No A está programado para una eliminación diferida.
A (artículo base), B C (artículo base)
A (artículo base), B C (artículo base), B El reemplazo de A -> C depende de setSubscriptionReplacementMode (obsoleto en PBL 8.1).
A (artículo base), B C (artículo base), D
  • El reemplazo de A -> C depende de setSubscriptionReplacementMode (obsoleto en PBL 8.1).
  • B está programado para su eliminación diferida.
  • D se agrega de inmediato con un cargo prorrateado.

Notificaciones para desarrolladores en tiempo real

El campo subscriptionId no se proporciona en RTDN para las compras de suscripciones con complementos, que contienen varios derechos de elementos. En su lugar, puedes usar las APIs de Play Developer para obtener la compra y ver los derechos de los elementos asociados.

Cambios de precios para los suscriptores existentes

Cambiar los precios de las suscripciones para los suscriptores existentes de una suscripción con compra de complementos es similar a cambiar los precios de las suscripciones de un solo elemento, como se describe en Cambia los precios de la suscripción. Sin embargo, existen algunas limitaciones y diferencias funcionales, como se describe en esta sección.

Finaliza una cohorte de precios heredados

El cierre de una cohorte heredada también afecta las compras de suscripciones con complementos. Se aplican las siguientes reglas:

  • Todos los aumentos de precio con solicitud de aceptación pendientes deben tener el mismo horario de renovación con el nuevo precio. Si un elemento de una compra de suscripción con complementos tiene un aumento de precio con solicitud de aceptación que el usuario aún no confirmó, se ignorará cualquier aumento de precio con solicitud de aceptación nuevo para otros elementos de la compra, a menos que genere el mismo tiempo de renovación de la aplicación del precio nuevo que el aumento de precio existente en estado PENDIENTE. Una vez que el usuario confirme el aumento de precio, se registrarán los cambios de precio más recientes. Además, los usuarios solo pueden aceptar todos los aumentos de precios con solicitud de aceptación no confirmados a la vez.

    Ejemplo:

    • Considera una suscripción con complementos (artículos A y B) que se renueva el día 7 de cada mes.
    • El artículo A tiene una migración de precios en curso de USD 7 a USD 10, y se espera que el aumento de precio se aplique el 7 de julio.
    • El 2 de junio, comienza una nueva migración de precios de USD 5 a USD 6 para el artículo B. Dado que el aumento de precio con solicitud de aceptación comienza 37 días después de la migración, el aumento de precio más temprano para el artículo B será el 7 de agosto.

    En este caso, hasta que el usuario acepte el cambio de precio del elemento A (hasta que esté en estado CONFIRMED), no se registrará el cambio de precio del elemento B para esta compra de suscripción, y SubscriptionPurchaseV2 no devolverá los detalles del cambio de precio del elemento B. Después de que el usuario confirma el cambio de precio del artículo A, comienza el cambio de precio del artículo B. El usuario recibe el aumento de precio con solicitud de aceptación del artículo B solo después de aceptar el aumento con solicitud de aceptación del artículo A.

  • El correo electrónico de Google Play contiene una lista de todos los elementos con aumentos o disminuciones de precios que entrarán en vigencia el mismo día.

Cómo cancelar una suscripción con complementos

Los usuarios pueden cancelar toda la compra de una suscripción con complementos en el Centro de suscripciones de Play, y tú solo puedes cancelar toda la compra de una suscripción con complementos usando la API de Google Play Developer.

Cuando se cancela una compra de suscripción sin revocarse, ninguno de los elementos de la compra se renovará automáticamente, pero el usuario seguirá teniendo acceso a los elementos a los que tiene derecho hasta que finalicen los períodos de facturación correspondientes.

Cómo revocar y reembolsar suscripciones con complementos

Estos son algunos de los lineamientos para revocar y reembolsar suscripciones:

  • Usa Play Console para emitir un reembolso basado en un importe para un pedido específico sin revocar el acceso a la suscripción.

  • Llama a orders.refund para reembolsar por completo pagos de suscripciones específicos que realizó el usuario sin revocar el acceso a la suscripción.

  • Llama a purchases.subscriptionsv2.revoke para revocar de inmediato el acceso a todos los elementos de la suscripción. Con esta API, puedes hacer lo siguiente:

    • Revocar el acceso a todos los elementos y proporcionar un reembolso prorrateado

    • Cuando se revoca una suscripción con complementos usando reembolsos prorrateados, se emitirá un reembolso por el pedido más reciente de cada elemento con un importe prorrateado basado en el tiempo restante hasta la próxima renovación.

    • Revoca el acceso a todos los elementos y proporciona un FullRefund.

    • Revoca el acceso a un elemento individual con un reembolso total del elemento.

Revoca un elemento individual en una suscripción con complementos

Para revocar elementos de suscripción individuales en una suscripción con complementos sin revocar toda la compra, llama a purchases.subscriptionsv2.revoke con el campo ItemBasedRefund establecido en RevocationContext. El productId del elemento que se debe revocar y reembolsar se puede establecer en el campo ItemBasedRefund.

El campo ItemBasedRefund se puede configurar para compras con uno o más elementos de suscripción con renovación automática.

  • Si aún quedan elementos activos en la compra de la suscripción después de revocar el elemento especificado en ItemBasedRefund, solo se revocará el elemento y se reembolsará por completo sin interrumpir el estado de la suscripción.
  • Si no quedan elementos activos en la compra de la suscripción después de revocar el elemento especificado en ItemBasedRefund, se revoca el elemento, se reembolsa por completo y se cancela la suscripción.

Consideraciones

  • Cuando se usa ItemBasedRefund, solo se puede revocar un elemento a la vez. Se puede llamar a la solicitud varias veces si se deben revocar diferentes elementos.
  • Cuando la compra de la suscripción se encuentra en cualquiera de los estados de pago rechazado, o bien el artículo especificado en ItemBasedRefund no es propiedad del usuario o venció, se bloquea el rechazo del artículo.
  • No se admite el rechazo de elementos en suscripciones prepagadas.

Vencimiento del elemento durante el rechazo del pago

En el caso de la compra de una suscripción con complementos, es posible que algunas renovaciones solo necesiten extender un subconjunto de derechos de elementos, sin afectar a los elementos con una fecha de vencimiento futura.

Independientemente de los elementos que se incluyan en una renovación, si se rechaza el pago de renovación, la compra de suscripción general entrará en el período de gracia y la suspensión de la cuenta, como se describe en la siguiente documentación.

Selección del período de recuperación

Como el período de gracia en sí otorga derechos al usuario, cuando se compra una suscripción con complementos, se rechaza el pago de renovación, se selecciona el elemento con el período de gracia mínimo entre todos los elementos activos y se aplican su período de gracia y su período de suspensión de la cuenta como período de recuperación para esta renovación.

Los elementos activos incluyen los elementos que estaban activos en la compra de una suscripción con complementos justo antes del intento de renovación, excluyen los elementos agregados recientemente (que no tendrán derechos hasta después de la recuperación) y excluyen los elementos que ya no están activos debido a la eliminación o la baja.

Se aplica el parámetro de configuración de suspensión de la cuenta del elemento con el período de gracia mínimo seleccionado. Si hay más de un elemento con el período de gracia mínimo, pero diferentes períodos de suspensión de la cuenta, se aplica el período de suspensión de la cuenta más largo.

Período de gracia

Cuando se rechaza el pago de renovación de una suscripción, la compra de la suscripción entrará en estado de período de gracia. Durante el período de gracia, el usuario seguirá teniendo acceso a todos los elementos activos del período de renovación anterior. Después del período de gracia, si no se corrigió la forma de pago, se suspenderá la cuenta por la compra de la suscripción completa. Si otros elementos alcanzan su fecha de renovación durante el período de gracia, se iniciará un nuevo intento de cargo para esos elementos una vez que se recupere la suscripción del rechazo del pago.

Suspensión de la cuenta

Mientras la compra de la suscripción esté en suspensión de cuenta, se suspenderá el acceso a todos los elementos de la suscripción hasta que se recupere el pago.

Si se recupera la suscripción en suspensión de la cuenta, la compra de la suscripción seguirá existiendo tal como está. Si no se recupera la suscripción, vencerán los elementos en rechazo de pago y se reanudará el acceso a los demás elementos durante el resto de sus períodos de facturación.

Ejemplo:

  • Un usuario tiene una suscripción a Mi plan básico que se renueva el día 1 de cada mes. Luego, el 15 de agosto, agrega un plan complementario de USD 10 por mes con una prueba gratuita de siete días. Ninguno de los elementos tiene establecido un período de gracia, y ambos tienen un período de suspensión de la cuenta de 30 días.

  • El 22 de agosto, se le cobra al usuario USD 2.90 (10*9/31) para prorratear hasta el 31 de agosto, pero la forma de pago del usuario vence antes de esa fecha y la suscripción se rechaza el 22 de agosto.

Cuando la suscripción entra en suspensión de la cuenta debido al rechazo del pago, el usuario no tiene acceso a ninguno de los elementos de la suscripción con complementos. El tiempo restante de los elementos que no se renuevan se devolverá a los usuarios cuando la suscripción deje de estar en suspensión de la cuenta, ya sea porque se recuperó el pago o se canceló.

En el ejemplo anterior, una suscripción entra en suspensión de la cuenta el 22 de agosto.

  • Si la cuenta se recupera el 25 de agosto, antes de la fecha de renovación general del 1 de septiembre, el usuario recuperará el acceso a Mi plan básico y al Plan complementario el mismo día. La próxima fecha de facturación se cambió al 4 de septiembre.

  • Si no se recupera la cuenta después de 30 días, la suscripción se cancelará el 21 de septiembre, y el usuario perderá el acceso al plan complementario y lo recuperará al plan básico hasta el 30 de septiembre.

En este ejemplo, debes obtener el expiryTime actualizado para TODOS los elementos de la suscripción con complementos, ya que algunos elementos pueden reanudar su derecho después del período de gracia y la suspensión de la cuenta.

Informes y conciliación financieros

Usa el Informe de ingresos para conciliar tus suscripciones activas con las transacciones en Play. Cada línea de pedido de la transacción tiene un ID de pedido. En el caso de las compras que representan varios artículos, los informes de Ingresos y Ventas estimadas incluirán filas separadas para cada transacción, como cargos, comisiones, impuestos y reembolsos, para cada artículo involucrado.

En el caso de los paneles de Play Console, ten en cuenta lo siguiente:

  • Las estadísticas de ingresos que se presentan en la sección Informes financieros de la consola se desglosan por elementos.

  • La administración de pedidos refleja la compra de suscripciones con complementos y muestra listas detalladas de lo que se compró. Desde la administración de pedidos, puedes revocar, cancelar o reembolsar por completo la compra de un usuario.