Maximiza tu integración de la Facturación Play

1. Descripción general

Optimiza tus fuentes de ingresos y lanza tu app con confianza con este codelab de integración de la biblioteca de Facturación Play de Google Play. Este codelab estructurado te guía a través de la configuración, las pruebas y la implementación del procesamiento de compras confiable, lo que te permite alcanzar tus objetivos de monetización y ofrecer una experiencia del usuario más fluida.

Te ayudaremos a configurar las notificaciones para desarrolladores en tiempo real (RTDN) y Play Billing Lab para suscripciones y productos únicos en tus apps y juegos. Aprenderás a reducir la deserción de suscriptores, protegerte contra el fraude y el abuso, probar casos extremos, simular, reproducir y abordar posibles problemas, y experimentar con ofertas y cambios de precios sin afectar a los usuarios.

Al final, estarás listo para implementar estrategias de recuperación de usuarios, resolver rápidamente los desafíos de integración, mejorar el ROI, brindar una experiencia premium y lanzar tu app y sus actualizaciones con confianza.

Requisitos previos

Qué aprenderás

  • Cómo administrar correctamente los ciclos de vida de las compras para optimizar el crecimiento con técnicas que mejoran las conversiones de compras y la retención de clientes
  • Cómo configurar las notificaciones para desarrolladores en tiempo real (RTDN) con Google Cloud Pub/Sub, que luego se pueden aprovechar para implementar campañas de recuperación y otras estrategias de administración del ciclo de vida
  • Cómo configurar un receptor en tu servidor de backend para controlar de forma segura las notificaciones con un seguimiento y derechos precisos para reducir los reembolsos no deseados o los riesgos de fraude y abuso
  • Cómo probar tu integración y simular errores con Play Billing Lab para mejorar la experiencia del usuario y reducir los costos de desarrollo

Requisitos

2. Estrategias de monetización para suscripciones y compras únicas

Cuando vendes productos digitales a través de tu app, una estrategia de monetización exitosa debe considerar la experiencia del usuario completa, tanto para las compras únicas como para las suscripciones. Una experiencia fluida puede aumentar la disposición a comprar y reducir la deserción.

Un flujo de compra común para una compra única o una suscripción incluirá varias etapas:

  1. El usuario explora los artículos que puede comprar.
  2. Inicia el flujo de compra para que el usuario complete la compra y el pago.
  3. Notifica a tu servidor sobre la compra completada
  4. Verifica la compra en tu servidor.
  5. Proporciona contenido al usuario.
  6. Confirma la entrega del contenido. En el caso de productos consumibles, procesa la compra en el momento adecuado para que el usuario pueda volver a comprar el artículo.

La integración en la app te permite iniciar flujos de compra y administrar esta experiencia del usuario, pero es fundamental que mantengas tu backend actualizado con respecto a los derechos que compran los usuarios. Esto es importante para hacer un seguimiento de las compras y administrar otros aspectos de la experiencia del usuario, como los derechos multiplataforma.

Las notificaciones para desarrolladores en tiempo real (RTDN) son una excelente manera de reconocer estas diferentes etapas del ciclo de vida de la compra y se pueden usar de manera eficaz como herramienta de seguimiento del rendimiento en tiempo real y como herramienta para habilitar estrategias de recuperación de suscriptores.

Por ejemplo, supongamos que el usuario acaba de comprar un artículo nuevo o acaba de incumplir el pago, por lo que la suscripción entró en el período de gracia. Con la RTDN adecuada, puedes reconocer, casi en tiempo real, que cambió el estado del usuario y actuar en consecuencia para lograr que el usuario interactúe aún más con el elemento que acaba de comprar o enviarle correos electrónicos de recordatorio para que actualice sus detalles de pago y continúe con su suscripción.

Las RTDN también son una excelente manera de agregar controles adicionales del servidor para ayudarte a administrar las compras, incluso cuando el cliente del usuario tiene problemas. Supongamos que un usuario realizó una compra exitosa y recibió la confirmación de Google, pero su dispositivo pierde la conexión de red antes de que el dispositivo y tu app reciban la notificación de la compra a través del objeto de escucha de compras. Con las RTDN, recibirías una notificación independiente a través de tu servidor, lo que te permitiría reconocer la compra y otorgar el derecho al usuario independientemente del problema del cliente, lo que garantiza un proceso de compra confiable.

Aquí puedes obtener más información sobre todos los tipos de RTDN que se admiten actualmente. Cada tipo de RTDN indica un estado de compra distinto. Es fundamental implementar los mecanismos de control correspondientes para garantizar el procesamiento adecuado según sea necesario en tus casos de uso. En este codelab, se te guiará por un ejemplo que controla el mensaje de RTDN en tu servidor de backend seguro, lo que incluye recibir el mensaje, validar la compra y otorgar el derecho al usuario correcto cuando un usuario completa correctamente una compra en tu app. Luego, te mostraremos cómo configurar las RTDN para tu app.

3. Cómo configurar notificaciones para desarrolladores en tiempo real (RTDN)

Las notificaciones para desarrolladores en tiempo real (RTDN) aprovechan Google Cloud Pub/Sub para permitirte reaccionar de inmediato a los cambios de estado de la compra. Cloud Pub/Sub es un servicio de mensajería en tiempo real completamente administrado que puedes usar para enviar y recibir mensajes entre aplicaciones independientes. Google Play usa Cloud Pub/Sub para publicar notificaciones push sobre temas a los que te suscribas.

Para habilitar las RTDN, primero debes configurar Cloud Pub/Sub con tu propio proyecto de Google Cloud Platform (GCP) y, luego, habilitar las notificaciones para tu app. Si no conoces GCP y Cloud Pub/Sub, consulta la Guía de inicio rápido.

Crea un tema

Para empezar a recibir notificaciones, debes crear un tema en el que Google Play deba publicarlas. Para crear un tema, sigue las instrucciones en Cómo crear el tema.

Crea una suscripción a Pub/Sub

Para recibir mensajes publicados en un tema, debes crear una suscripción de Pub/Sub a ese tema. Para crear una suscripción de Pub/Sub, haz lo siguiente:

  1. Lee la Guía para suscriptores de Cloud Pub/Sub para familiarizarte con la configuración de la suscripción como una suscripción push o una suscripción de extracción. En este codelab, trabajaremos con una suscripción de extracción que requiere que el servidor de backend seguro inicie solicitudes al servidor de Cloud Pub/Sub para recuperar mensajes.
  1. Sigue las instrucciones en Cómo agregar una suscripción para crear una.

Cómo otorgar derechos de publicación en tu tema

Cloud Pub/Sub requiere que otorgues privilegios de Google Play para publicar notificaciones en tu tema.

  1. Abre la consola de Google Cloud.
  2. Selecciona tu proyecto, busca "Pub/Sub" en la barra de búsqueda y navega a la página de configuración de Pub/Sub. Busca la página de configuración de Pub/Sub y accede a ella
  3. Encuentra tu tema y abre el parámetro de configuración de permisos. Abre el parámetro de configuración de permisos.
  4. Haz clic en AGREGAR PRINCIPAL para agregar la cuenta de servicio google-play-developer-notifications@system.gserviceaccount.com y otórgale el rol de publicador de Pub/Sub. Agrega la cuenta de servicio google-play-developer-notifications@system.gserviceaccount.com y otórgale el rol de publicador de Pub/Sub.
  5. Haz clic en Guardar para completar la configuración del tema. Haz clic en Guardar para completar la configuración del tema.

Habilita las RTDN para tu app

Aprende a configurar las notificaciones para desarrolladores en tiempo real (RTDN) para mejorar significativamente tu integración de Facturación Play. Puedes mejorar la confiabilidad de las compras con mensajes personalizados y, también, prevenir el fraude y el abuso para mejorar tu ROI general.

Las RTDNs proporcionan actualizaciones inmediatas de servidor a servidor directamente desde Google Play para eventos clave, como renovaciones de suscripciones, compras nuevas y problemas de pago. Ayudan a tus sistemas de backend a sincronizarse automáticamente con el estado real de los derechos del usuario, lo que te permite superar las limitaciones del cliente y reaccionar de forma instantánea y adecuada.

Sigue estos pasos para habilitar las notificaciones para desarrolladores en tiempo real en tu app:

  1. Abre Google Play Console.
  2. Selecciona tu app.
  3. Ve a Monetiza con Play > Configuración de la monetización.
  4. Desplázate hasta la sección Notificaciones para desarrolladores en tiempo real.
  5. Marca Habilitar notificaciones en tiempo real.
  6. En el campo Nombre del tema, ingresa el nombre del tema de Cloud Pub/Sub completo que configuraste antes. El nombre del tema debe tener el formato projects/{project_id}/topics/{topic_name}, donde project_id es el identificador único de tu proyecto y topic_name es el nombre del tema que se creó antes.
  7. Haz clic en Enviar mensaje de prueba a fin de enviar un mensaje de prueba. Realizar una publicación de prueba ayuda a garantizar que todo esté configurado de manera correcta. Si la publicación de prueba se realiza de manera exitosa, aparece un mensaje que lo indica. Si adjuntaste una suscripción para este tema, deberías recibir el mensaje de prueba. Para obtener una suscripción de extracción, ve a la suscripción en Cloud Console, haz clic en Ver mensajes y, luego, extrae los mensajes. Debes confirmar cualquier mensaje que hayas extraído para evitar la entrega repetida de Cloud Pub/Sub. Para una suscripción de envío, verifica si el mensaje de prueba se entrega a tu extremo de envío. Un código de respuesta correcto servirá como mensaje de confirmación. Si hay un error en la publicación, aparecerá un mensaje. Asegúrate de que el nombre del tema sea correcto y de que la cuenta de servicio google-play-developer-notifications@system.gserviceaccount.com tenga acceso como publicador de Pub/Sub al tema.
  8. Elige los tipos de notificaciones que quieres recibir.
  • Recibir notificaciones de suscripciones y de todas las compras anuladas: Recibe notificaciones para desarrolladores en tiempo real relacionadas con suscripciones y compras anuladas. No recibirás notificaciones sobre las compras de productos únicos.
  • Recibir todas las notificaciones de suscripciones y productos únicos: Recibe notificaciones de todos los eventos de suscripciones y compras anuladas. También recibirás eventos de compra de productos únicos, como ONE_TIME_PRODUCT_PURCHASED y ONE_TIME_PRODUCT_CANCELED. Consulta Ciclo de vida de compras únicas para obtener más información sobre estos eventos de compra.

a266e5dec5c93cd8.png

  1. Haz clic en Guardar cambios.

Ahora que completaste las notificaciones para desarrolladores en tiempo real de tu app, tienes las herramientas para abordar desafíos comunes, como la deserción de usuarios a través de mensajes de recuperación o el fraude y el abuso. En la siguiente sección, compilaremos un suscriptor en tu servidor de backend seguro para consumir los mensajes enviados a tu tema de Cloud Pub/Sub.

4. Recibir notificaciones

Es fundamental mantener actualizado tu servidor de backend sobre el estado de las compras para brindar la mejor experiencia del usuario en tu app. Por ejemplo, cuando un usuario completa correctamente una compra con un pago en la app, debe recibir el contenido en su cuenta lo antes posible.

Esto requiere que la finalización de la compra se detecte y procese de manera oportuna. La Biblioteca de Facturación Play proporciona varias formas de detectar las compras en tu app. Cuando se detecta una compra completada, tu app debe notificar a tu servidor de backend para que verifique la compra, otorgue el contenido al usuario correcto y, luego, notifique a Google que se procesó la compra. Sin embargo, es posible que tu app no haya detectado la compra de manera oportuna por varios motivos. Por ejemplo, un usuario puede realizar una compra exitosa y recibir la confirmación de Google, pero su dispositivo pierde la conexión de red antes de que el dispositivo y tu app reciban la notificación a través de la interfaz de la biblioteca de Play Billing. RTDN proporciona controles adicionales del servidor para ayudarte a administrar las compras incluso cuando el cliente del usuario tiene problemas. Las RTDN garantizan notificaciones independientes a tu servidor cuando se producen cambios en el estado de la compra, lo que te permite reconocer los cambios en el estado de la compra casi de inmediato a través de una segunda ruta de forma independiente de los posibles problemas del cliente, lo que garantiza un proceso de compra más confiable.

En esta sección, compilarás un suscriptor para consumir los mensajes que se envían a tu tema de Cloud Pub/Sub con las bibliotecas cliente de Cloud Pub/Sub. Estas bibliotecas están disponibles en varios idiomas. En las siguientes secciones, agregaremos al suscriptor para verificar la compra, otorgar derechos al usuario correcto y confirmar o consumir la compra en el servidor. En este codelab, usaremos Java.

Cada publicación realizada en un tema de Cloud Pub/Sub incluye un campo de datos único con codificación base64.

{
 "message": {
   "attributes": {
     "key": "value"
   },
   "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
   "messageId": "136969346945"
 },
 "subscription": "projects/myproject/subscriptions/mysubscription"
}

Una vez que se decodifica el campo de datos con codificación base64, el objeto DeveloperNotification incluye los siguientes campos:

{
 "version": string,
 "packageName": string,
 "eventTimeMillis": long,
 "oneTimeProductNotification": OneTimeProductNotification,
 "subscriptionNotification": SubscriptionNotification,
 "voidedPurchaseNotification": VoidedPurchaseNotification,
 "testNotification": TestNotification
}

Para obtener más información, consulta la referencia de notificaciones para desarrolladores en tiempo real.

A continuación, se muestra el código de muestra de un NotificationReceiver para que tu servidor de backend seguro procese los mensajes de Pub/Sub. Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Consulta Configura la autenticación para un entorno de desarrollo local.

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.Base64;
import org.json.JSONObject;

/** Real-time developer notifications receiver. */
public class NotificationReceiver {

 private NotificationReceiver() {}

 /*
  * Receive notification messages from the subscription.
  *
  * @param projectId The project ID of your Google Cloud Project.
  * @param subscriptionId The subscription ID of the subscriber to the pub/sub topic.
  */
 public static void receiveNotificationMessages(String projectId, String subscriptionId) {
   ProjectSubscriptionName subscriptionName =
       ProjectSubscriptionName.of(projectId, subscriptionId);

   try {
     Subscriber subscriber =
         Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
     // Start the subscriber.
     subscriber.startAsync().awaitRunning();

     subscriber.awaitTerminated();
   } catch (IllegalStateException e) {
     System.out.println("Subscriber stopped: " + e);
   }
 }

 static class NotificationMessageReceiver implements MessageReceiver {

   @Override
   public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
     // Decode the data into a String from the message data field.
     String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
     // Parse the String into a JSON object.
     JSONObject messageJson = new JSONObject(jsonString);

     // Fetch the value for certain fields.
     String version = messageJson.getString("version");
     String packageName = messageJson.getString("packageName");
     System.out.println("version: " + version);
     System.out.println("packageName: " + packageName);

     // Validate the purchase and grant the entitlement as needed.
     // More details in the following sections.
     // ......

     // Acknowledge the message to avoid repeated delivery.
     consumer.ack();
   }
 }
}

Ahora tienes un receptor de notificaciones que consume los mensajes enviados a tu tema de Cloud Pub/Sub en tu servidor de backend seguro. En las siguientes secciones, abordaremos las prácticas recomendadas para procesar los mensajes de RTDN en tu servidor de backend.

5. Adjunta identificadores de usuario en el flujo de compra de tu app

Cuando tu servidor recibe el mensaje de RTDN sobre la actualización del estado de la compra, debe saber qué usuario realizó la compra para procesarla, por ejemplo, entregar el contenido al usuario correcto. Para ello, adjunta los identificadores de usuario que tengas para el usuario que realiza la compra con obfuscatedAccountId cuando inicies el flujo de compra en tu app. Un ejemplo de identificador podría ser una versión ofuscada del acceso del usuario en tu sistema. Configurar este parámetro puede ayudar a Google a detectar fraudes. Además, puede ayudarte a garantizar que las compras se atribuyan al usuario correcto, como se explica en cómo otorgar derechos a los usuarios.

A continuación, se muestran los códigos de ejemplo para adjuntar el identificador del usuario cuando se inicia el flujo de compra en la app configurando obfuscatedAccountId.

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// A user identifier, e.g. an obfuscated user id in your system.
String obfuscatedAccountId = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // set the offer token to specify the offer to purchase when applicable, e.g., subscription products
            // .setOfferToken(offerToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .setObfuscatedAccountId(obfuscatedAccountId)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Como verás en la siguiente sección, el identificador de usuario establecido en el flujo de compra se incluirá en la compra y se podrá usar para otorgar derechos al usuario correcto.

6. Verifica las compras antes de otorgar derechos

En esta sección, analizaremos las prácticas recomendadas para verificar las compras antes de otorgar derechos en tu servidor de backend seguro.

Después de que un usuario compra un producto único, el suscriptor de Pub/Sub en tu servidor de backend seguro recibirá un mensaje de Pub/Sub. Debes hacer lo siguiente en tu servidor de backend:

  1. Analiza el purchaseToken del mensaje de Pub/Sub. Debes mantener un registro de todos los valores de purchaseToken correspondientes a todas las compras.
  2. Verifica que el valor purchaseToken de la compra actual no coincida con ningún valor purchaseToken anterior. purchaseToken es globalmente único, por lo que puedes usar este valor de forma segura como clave primaria en tu base de datos.
  3. Usa el extremo purchases.products:get en la API de Google Play Developer para verificar con Google que la compra sea legítima.
  1. Si es legítima y no se usó en el pasado, puedes otorgar de manera segura el derecho a la suscripción o al elemento integrado en la app.
  2. Debes otorgar derechos solamente si el estado de la compra es PURCHASED. Asegúrate de procesar correctamente las compras de PENDING. Si deseas obtener más información, consulta la sección Cómo administrar transacciones pendientes.

En el siguiente ejemplo de código, se crea un cliente de API para la API de Google Play Developer. La usaremos para realizar las llamadas a la API más adelante.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

/** Helper class to initialize the publisher APIs client library. */
public class AndroidPublisherHelper {
 /* Your application name */
 private static final String APPLICATION_NAME = "YourApplicationName";

 /* Load credentials from a JSON key file. Replace with the actual path to your downloaded service
  * account key file.
  */
 private static final String RESOURCES_CLIENT_SECRETS_JSON =
     "/path/to/your/service_account_key.json";

 /** Global instance of the JSON factory. */
 private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

 /* The API client */
 private static final AndroidPublisher ANDROID_PUBLISHER = init();

 /**
  * Performs all necessary setup steps for running requests against the API.
  *
  * @return the {@link AndroidPublisher} service
  */
 private static AndroidPublisher init(){
   try {
     // Authorization.
     Credential credential =
         GoogleCredential.fromStream(
                 AndroidPublisherHelper.class.getResourceAsStream(RESOURCES_CLIENT_SECRETS_JSON))
             .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

     // Set up and return API client.
     return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
         .setApplicationName(ApplicationConfig.APPLICATION_NAME)
         .build();
   } catch (GeneralSecurityException | IOException ex) {
     throw new RuntimeException("fail to initialize the publisher APIs client library", ex);
   }
 }
}

Luego, agregamos la lógica para realizar la llamada a la API y modificar el receptor creado anteriormente para validar la compra y otorgar el derecho al usuario correcto.

En AndroidPublisherHelper, agrega el siguiente método para recuperar el objeto ProductPurchase del extremo Purchases.products:get en la API de Google Play Developer.

 /* Fetch the ProductPurchase for the one-time product purchase from
  * Purchases.products.get endpoint in the Google Play Developer API
  */
 public static ProductPurchase executeProductPurchasesGet(
     String packageName, String sku, String purchaseToken) {
   try {
     ProductPurchase productPurchase =
         ANDROID_PUBLISHER.purchases().products().get(packageName, sku, purchaseToken).execute();
     return productPurchase;
   } catch (IOException ex) {
     log.error("Exception was thrown while getting a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to fetch the purchase in case of transient failures.
     return null;
   }
 }

En NotificationMessageReceiver, valida la compra y otorga el derecho al usuario correcto en tu sistema según los datos incluidos en la notificación. Debes seguir haciendo un seguimiento del purchaseToken en tu servidor para evitar el procesamiento duplicado.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   // Decode the data into a String from the message data field.
   String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
   // Parse the String into a JSON object.
   JSONObject messageJson = new JSONObject(jsonString);

   // Fetch the value for certain fields.
   String version = messageJson.getString("version");
   String packageName = messageJson.getString("packageName");

   // Process notification data based on your business requirements.
   // Process oneTimeProductNotification in the message.
   JSONObject oneTimeProductNotificationJson =
       messageJson.getJSONObject("oneTimeProductNotification");
   if (oneTimeProductNotificationJson != null) {
     String purchaseToken = oneTimeProductNotificationJson.getString("purchaseToken");
     String sku = oneTimeProductNotificationJson.getString("sku");
     int notificationType = oneTimeProductNotificationJson.getInt("notificationType");

     if (notificationType == 1) {
       // ONE_TIME_PRODUCT_PURCHASED - A one-time product was successfully purchased by a user.
       // Verify that the purchaseToken value does not match any previous purchaseToken values in
       // your backend system to avoid duplicate processing.
       ......
       // Fetch the ProductPurchase from Purchases.products.get endpoint
       ProductPurchase productPurchase =
         AndroidPublisherHelper.executeProductPurchasesGet(packageName, sku, purchaseToken);
       if (productPurchase != null && productPurchase.getPurchaseState() == 0) {
         // The purchase is valid and in PURCHASED state.

         // The account Id set in the App when launching the billing flow.
         String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
         // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
         // system.
       ......
       }
     }
     // Process subscriptionNotification in the message.
     JSONObject subscriptionNotificationJson = messageJson.getJSONObject("subscriptionNotification");
     if (subscriptionNotificationJson != null) {
       ......
     }
     // Process other notification data in the message as needed.
     ......
   }

   // Acknowledge the message to avoid repeated delivery.
   consumer.ack();
 }

7. Notifica a Google que se procesó la compra

Después de otorgar derechos, debes notificar a Google que se procesó la compra llamando a los extremos purchases.products:consume o purchases.products:acknowledge en la API de Play Developer desde tu servidor de backend seguro para consumir un producto consumible o confirmar un producto no consumible.

En AndroidPublisherHelper, agrega los siguientes métodos para llamar a purchases.products:consume o purchases.products:acknowledge en la API de Google Play Developer.

 /* Consume the one-time product purchase by calling
  * Purchases.products.consume endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesConsume(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().consume(packageName, sku, purchaseToken).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while consuming a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly consumed in case of transient failures.
   }
 }

 /* Acknowledge the one-time product purchase by calling
  * Purchases.products.acknowledge endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesAcknowledge(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().acknowledge(packageName, sku, purchaseToken, new ProductPurchasesAcknowledgeRequest()).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while acknowledging a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly acknowledged in case of transient failures.
   }
 }

En NotificationMessageReceiver, consume la compra del producto consumible o confirma la compra del producto no consumible después de otorgar el derecho en tu servidor de backend.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   ......
       String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
       // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
       // system.
       ......
       // If the product is a consumable product, consume the purchase.
       AndroidPublisherHelper.executeProductPurchasesConsume(packageName, sku, purchaseToken);
       // Or if the product is a non-consumable product, acknowledge the purchase.
       // AndroidPublisherHelper.executeProductPurchasesAcknowledge(packageName, sku, purchaseToken);
  ......

 }

Se requiere una confirmación de recepción, ya que notifica a Google Play que se le otorgó al usuario el derecho a la compra. Debes confirmar la compra inmediatamente después de otorgar el derecho.

¡Bien hecho! Integraste correctamente las notificaciones para desarrolladores en tiempo real, lo que permite un procesamiento confiable de las compras, como se demostró en este codelab. Ahora, para asegurarnos de que todo funcione a la perfección, exploremos Play Billing Lab, una herramienta fácil de usar diseñada para ayudarte a probar tu integración de la Facturación Play.

8. Prueba con Play Billing Lab

Para realizar el lanzamiento con confianza, debes probar la integración durante el desarrollo. Play Billing Lab es una app gratuita para Android que ayuda a los desarrolladores a probar su integración con el sistema de facturación de Google Play, lo que les brinda una forma fácil y conveniente de probar las funciones de la Facturación Play, realizar integraciones más rápido y lanzar sus apps con mayor confianza.

Play Billing Lab ofrece varias funciones de prueba para ayudarte a probar diferentes situaciones, incluidas las siguientes:

Agregamos continuamente nuevas capacidades de prueba a la app de Play Billing Lab. Puedes descargar e instalar Play Billing Lab desde Play Store o consultar Cómo probar tu integración para obtener más información sobre las pruebas con Play Billing Lab.

Usa Play Billing Lab para probar BillingResponseCode

Es un desafío común probar todos los flujos de BillingResponseCode cuando integras tu app con la biblioteca de Play Billing, ya que no tienes mucho control sobre la comunicación entre Play Store y el backend de Play. La función Simulador de respuestas de la app Play Billing Lab te permite configurar respuestas de códigos de error para la Biblioteca de Facturación Play y probar varias situaciones de error complejas.

Por ejemplo, implementaste la lógica en tu app para consumir la compra después de que la app detecta que la compra se realizó correctamente. Deseas probar la situación en la que tu app no pudo consumir la compra debido a una falla de red y el receptor de RTDN en tu servidor de backend capta el mensaje y controla la compra correctamente. Puedes aprovechar el Simulador de respuestas para simular la situación de tus pruebas. A continuación, se te guiará por los pasos para realizar pruebas con el simulador de respuestas de Play Billing Lab.

Prueba con el simulador de respuestas

Cuando realices pruebas con el Simulador de respuestas, tu app se comunicará con Play Billing Lab para obtener el código de respuesta que configuraste en el Simulador de respuestas de Play Billing Lab.

Habilita las pruebas de anulaciones de facturación para la Biblioteca de Facturación Play

Para habilitar la comunicación entre el Simulador de respuestas y tu app, primero debes habilitar las pruebas de reemplazos de facturación para la Biblioteca de Facturación Play desde tu app. Para ello, agrega las siguientes etiquetas de metadatos al archivo AndroidManifest.xml de tu app.

<manifest ... >
  <application ... >
    ...
     <meta-data
      android:name="com.google.android.play.largest_release_audience.NONPRODUCTION"
      android:value="" />
    <meta-data
      android:name="com.google.android.play.billingclient.enableBillingOverridesTesting"
      android:value="true" />
  </application>
</manifest>

Compila tu app con el archivo AndroidManifest.xml actualizado. Ahora tu app está lista para el simulador de respuestas de Play Billing Lab.

Cuando implementes tu app en el entorno de producción después de realizar las pruebas, debes usar un archivo AndroidManifest.xml independiente que no incluya estas etiquetas de metadatos o asegurarte de haber quitado estas etiquetas del archivo AndroidManifest.xml.

Simula errores de la Biblioteca de Facturación Play

Para realizar pruebas con errores simulados de la Biblioteca de Facturación Play, primero configura el código de respuesta en la app de Play Billing Lab y, luego, realiza la prueba en tu app.

Cómo configurar un código de respuesta

  1. Accede a la app de Play Billing Lab con una cuenta de tester de licencias para tu app. En la siguiente imagen, se muestra el panel de Play Billing Lab, incluida la tarjeta del Simulador de respuestas.

Panel de Play Billing Lab con el simulador de respuestas

  1. Haz clic en Administrar en la tarjeta del Simulador de respuestas para navegar a la pantalla del Simulador de respuestas.
  2. Cuando se te solicite, permite las notificaciones de Play Billing Lab para ver el estado de conexión de tu app.
  3. Habilita el interruptor Simulate Play Billing Library response si aún no lo está.

c841baa4c96bf306.png

  1. Selecciona un código de respuesta para las APIs de la Biblioteca de Facturación Play que quieras probar. Para simular el error en la compra de consumo, selecciona un código de error para la API de consumeAsync. Tus selecciones se guardan automáticamente. Ahora, el Simulador de respuestas está listo para enviar los códigos de respuesta seleccionados a tu app.

Prueba tu app

Ahora puedes probar tu app para verificar si todo funciona como se espera en la situación de error configurada. Abre tu app y activa el método de la API de Play Billing Library. Si tu app realiza la llamada consumeAsync para consumir la compra, recibirá el código de error que acabas de configurar. Puedes verificar si tu app funciona correctamente según el código de error y si tu servidor de backend procesa la compra correctamente.

Cuando termines de realizar las pruebas, desactiva el interruptor de simulación de la respuesta de la Biblioteca de Facturación Play para detener la simulación.

Obtén más información para realizar pruebas con Play Billing Lab o visita el Centro de ayuda para obtener más información sobre cómo probar la facturación integrada con verificadores de licencias.

9. ¡Felicitaciones!

Completaste este codelab y ahora tienes las herramientas necesarias para optimizar estratégicamente la monetización de tu app y mejorar la experiencia del usuario, lo que generará mejoras en la satisfacción del usuario, las conversiones de compras y la deserción de suscriptores.

Si aprovechas las notificaciones para desarrolladores en tiempo real y la app complementaria Play Billing Lab, puedes abordar de forma proactiva los eventos del ciclo de vida de las compras tanto para las compras únicas como para las suscripciones.

Con estas herramientas, puedes implementar de manera eficaz estrategias de reactivación atractivas, resolver rápidamente los problemas de integración y, en última instancia, mejorar la experiencia del usuario y los flujos de ingresos para lanzar tu app o juego con confianza.

Si completaste este codelab, ahora tienes las habilidades necesarias para administrar todo el recorrido de compra y probar rigurosamente tu implementación con Play Billing Lab, lo que garantiza una experiencia del usuario sin inconvenientes y maximiza tu potencial de monetización en Google Play.