1. Descripción general
Optimiza tus flujos de ingresos y lanza tu app con confianza con este codelab de integración de la biblioteca de Play Billing de Google Play. En este codelab estructurado, se te guía para configurar, probar e implementar un procesamiento de compras confiable, lo que te permitirá respaldar 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 las suscripciones y los productos únicos de 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, ofrecer una experiencia premium y lanzar tu app y las actualizaciones con confianza.
Requisitos previos
- Debes tener conocimientos básicos sobre la integración de la Biblioteca de Facturación Play.
- Familiaridad con el desarrollo de apps para Android (Java)
Qué aprenderás
- Cómo administrar correctamente los ciclos de vida de las compras para optimizar el crecimiento con técnicas que mejoren las conversiones por compras y la retención de clientes
- Cómo configurar 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
- Accede a la cuenta de desarrollador de Play de tu app en Google Play Console.
- Acceso a tu proyecto de Google Cloud Platform con la API de Google Play Developer habilitada
- Un servidor de backend para controlar las cuentas y los derechos de tu app para Android
- Verificadores de licencias registrados para tu app en Play Console
- Play Billing Lab instalado en tu dispositivo de prueba
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 toda la experiencia del usuario, tanto para las compras únicas como para las suscripciones. Una experiencia fluida puede aumentar la preparación para la compra y reducir la deserción.
Un flujo de compra común para una compra única o una suscripción implicará varias etapas:
- El usuario explora los artículos que quiere comprar.
- Inicia el flujo de compra para que el usuario complete la compra y el pago.
- Notifica a tu servidor sobre la compra completada
- Verifica la compra en tu servidor.
- Proporciona contenido al usuario.
- Confirma la entrega del contenido. En el caso de los productos consumibles, consume 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 las compras y se pueden usar de manera eficaz como una herramienta de seguimiento del rendimiento en tiempo real y como una herramienta para habilitar estrategias de recuperación de suscriptores.
Por ejemplo, supongamos que tu usuario acaba de comprar un artículo nuevo o no realizó 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 el estado del usuario cambió y actuar en consecuencia, ya sea haciendo que el usuario interactúe aún más con el artículo que acaba de comprar o enviándole correos electrónicos de recordatorio para que actualice los 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.
Puedes obtener más información sobre todos los tipos de RTDN compatibles actualmente aquí. Cada tipo de RTDN indica un estado de compra distinto. Es fundamental implementar los mecanismos de control correspondientes para garantizar un procesamiento adecuado según sea necesario en tus casos de uso. En este codelab, se analizará 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 estás familiarizado con 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 a Pub/Sub, haz lo siguiente:
- Lee la Guía para suscriptores de Cloud Pub/Sub para familiarizarte con la configuración de la suscripción como push o pull. En este codelab, trabajaremos con una suscripción de extracción que requiere que el servidor de backend seguro inicie solicitudes en el servidor de Cloud Pub/Sub para recuperar mensajes.
- Sigue las instrucciones en Cómo agregar una suscripción para crear una.
Otorga derechos de publicación en tu tema
Cloud Pub/Sub requiere que otorgues privilegios de Google Play para publicar notificaciones en tu tema.
- Abre la consola de Google Cloud.
- Selecciona tu proyecto y, luego, busca "Pub/Sub" en la barra de búsqueda y navega a la página de configuración de Pub/Sub.
- Busca tu tema y abre la configuración de permisos.
- Haz clic en AGREGAR PRINCIPAL para agregar la cuenta de servicio
google-play-developer-notifications@system.gserviceaccount.com
y asígnale el rol de publicador de Pub/Sub. - Haz clic en Guardar para completar la configuración del tema.
Habilita las RTDN en 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, además, evitar el fraude y el abuso para mejorar tu ROI general.
Las RTDN 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 que tus sistemas de backend se sincronicen automáticamente con el estado real de los derechos de los usuarios, van más allá de las limitaciones del cliente y te permiten reaccionar de forma instantánea y adecuada.
Cómo habilitar las notificaciones para desarrolladores en tiempo real para tu app:
- Abre Google Play Console.
- Selecciona tu app.
- Ve a Monetización con Play > Configuración de monetización.
- Desplázate hasta la sección Notificaciones para desarrolladores en tiempo real.
- Marca Habilitar notificaciones en tiempo real.
- En el campo Nombre del tema, ingresa el nombre completo del tema de Cloud Pub/Sub 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.
- 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 es correcta, 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. - 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 las suscripciones y las compras anuladas. No recibirás notificaciones sobre 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
yONE_TIME_PRODUCT_CANCELED
. Consulta Ciclo de vida de compras únicas para obtener más información sobre estos eventos de compra.
- Haz clic en Guardar cambios.
Ahora que completaste las notificaciones para desarrolladores en tiempo real para tu app, tienes las herramientas necesarias 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 que el servidor de backend esté actualizado con 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 se detecte y procese la finalización de la compra de forma oportuna. La Biblioteca de Facturación Play proporciona varias formas de detectar las compras en tu app. Cuando se detecta una compra completada, la app debe notificar al 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 forma 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. La 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 cambia el estado de la compra, lo que te permite reconocer los cambios de estado de la compra casi de inmediato a través de una segunda ruta, independientemente 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
}
Consulta la referencia de notificaciones para desarrolladores en tiempo real para obtener más información.
El siguiente es 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 compra, debe saber qué usuario realizó la compra para procesarla, por ejemplo, entregar el contenido al usuario correcto. Para lograrlo, adjunta cualquier identificador 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 muestra para adjuntar el identificador de 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 puede usar para otorgar derechos al usuario correcto.
6. Verifica las compras antes de otorgar derechos
En esta sección, repasaremos las prácticas recomendadas para verificar las compras antes de otorgar derechos en tu servidor de backend seguro.
Después de que un usuario realice una compra de producto única, 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:
- Analiza el
purchaseToken
del mensaje de Pub/Sub. Debes mantener un registro de todos los valores depurchaseToken
correspondientes a todas las compras. - Verifica que el valor
purchaseToken
de la compra actual no coincida con ningún valorpurchaseToken
anterior.purchaseToken
es globalmente único, por lo que puedes usar este valor de forma segura como clave principal en tu base de datos. - Usa el extremo purchases.products:get de la API de Google Play Developer para verificar con Google que la compra sea legítima.
- 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.
- Debes otorgar derechos solamente si el estado de la compra es
PURCHASED
. Asegúrate de procesar correctamente las compras dePENDING
. Para obtener más información, consulta 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 modificamos el receptor compilado 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 de 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 el derecho, 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 de productos consumibles o confirma la compra de productos no consumibles después de otorgar los derechos 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 de compras confiable, como se muestra en este codelab. Ahora, para asegurarnos de que todo funcione perfectamente, exploremos Play Billing Lab, una herramienta fácil de usar diseñada para ayudarte a probar tu integración de Facturación Play.
8. Prueba con Play Billing Lab
Para lanzar 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. De esta manera, los desarrolladores pueden probar las funciones de Play Billing, realizar integraciones más rápido y lanzar sus apps con más confianza.
Play Billing Lab ofrece varias funciones de prueba para ayudar a probar diferentes situaciones, como las siguientes:
- Cambia el País de Play desde Play Billing Lab y aplica la configuración a la prueba. Esto permite probar experiencias del usuario personalizadas en diferentes países o regiones, independientemente de dónde realice la prueba el verificador.
- Probar ofertas de lanzamiento o de prueba de forma reiterada con la misma cuenta
- Cómo probar los cambios de precio de las suscripciones sin afectar a otros suscriptores activos
- Simula el código de respuesta de la Biblioteca de Facturación Play para probarlo en varias situaciones de error.
- Acelera las renovaciones de suscripción para acelerar las pruebas
- Realiza pruebas con formas de pago reales para omitir ciertos indicadores de riesgo del flujo de compra
Agregamos nuevas funciones de prueba a la app de Play Billing Lab de forma continua. 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 Response Simulator de la app de 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 esta se detecta como correcta. Supongamos que tu app no pudo consumir la compra debido a una falla de red y que el receptor de RTDN en tu servidor de backend recibe el mensaje y controla la compra correctamente. Puedes aprovechar el simulador de respuestas para simular la situación de tus pruebas. A continuación, te guiaremos 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 anulaciones de facturación de 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 las pruebas, debes usar un archivo AndroidManifest.xml
independiente que no incluya estas etiquetas de metadatos o asegurarte de haberlas quitado 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.
Configura un código de respuesta
- Accede a la app de Play Billing Lab con una cuenta de probador de licencias para tu app. En la siguiente imagen, se muestra el panel de Play Billing Lab, incluida la tarjeta Response Simulator.
- Haz clic en Administrar en la tarjeta del simulador de respuestas para navegar a la pantalla del simulador de respuestas.
- Cuando se te solicite, permite las notificaciones de Play Billing Lab para ver el estado de conexión de tu app.
- Habilita el interruptor Simular respuestas de la Biblioteca de Facturación Play si aún no está habilitado.
- Selecciona un código de respuesta para las APIs de la Biblioteca de Facturación Play que deseas probar. Para simular el error de 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 la biblioteca de Play Billing. Si tu app realiza la llamada a 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 las pruebas, desactiva el interruptor Simular respuesta de la Biblioteca de Facturación Play para dejar de simular la respuesta.
Obtén más información sobre las 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!
Terminaste este codelab y ahora tienes todo lo necesario para optimizar estratégicamente la monetización de tu app y mejorar la experiencia del usuario para 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 para las compras únicas y las suscripciones.
Con estas herramientas, puedes implementar estrategias atractivas para recuperar usuarios de forma eficaz, resolver rápidamente los desafíos 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.
Cuando completes este codelab, tendrás las habilidades necesarias para administrar todo el recorrido de compra y probar rigurosamente tu implementación con Play Billing Lab, lo que te permitirá garantizar una experiencia del usuario fluida y maximizar tu potencial de monetización en Google Play.