Si estás pensando en monetizar tu aplicación Android, probablemente te hayas dado cuenta de que las compras integradas o IAP son la vía más efectiva para generar ingresos recurrentes. Ya sea que quieras ofrecer contenido premium, mejores juegos Android gratis y premium, monedas virtuales o un modelo de suscripción mensual, hacerlo bien no es solo cuestión de poner un botón de compra, sino de montar toda una arquitectura que sea fiable y, sobre todo, segura para evitar fraudes.
En este sentido, Google ha actualizado sus herramientas y ahora es obligatorio migrar a la versión 7 de la Billing Library. No te preocupes si te parece un mundo, porque aunque la lógica de fondo es la misma, las nuevas versiones traen mejoras en la estabilidad y la gestión de reconexiones que te harán la vida más fácil. Vamos a desgranar paso a paso cómo montar este sistema, desde la configuración en la consola hasta el procesamiento en tu servidor.
Preparando el terreno en Google Play Console
Para que todo ruede sobre ruedas, lo primero es dejar lista la casa. Antes de tocar una sola línea de código, debes entrar en la consola de desarrollador y configurar tus productos. Aquí es donde decides si vas a vender productos únicos (como una espada en un juego) o suscripciones (como un acceso mensual a contenidos).
Al crear una suscripción, fíjate bien en el ID del producto; te recomiendo que sea descriptivo para que luego no te vuelvas loco analizando las estadísticas. También es el momento de jugar con los precios y, si quieres atraer a más gente, puedes configurar un periodo de prueba gratuito o un precio especial de lanzamiento. No olvides activar el período de gracia, que es fundamental para que el usuario no pierda el acceso inmediatamente si tiene un problema puntual con su tarjeta de crédito.
Conectando tu app con el sistema de facturación
El corazón de todo es el BillingClient. Esta es la interfaz que permite que tu aplicación hable con Google Play. Para empezar, debes añadir las dependencias necesarias en tu archivo build.gradle. Si programas en Kotlin, te aconsejo usar el módulo KTX, ya que te permite aprovechar las corrutinas y escribir un código mucho más limpio y moderno.
Para inicializar la conexión, utiliza el método newBuilder. Es vital que el BillingClient sea una instancia única (tipo singleton) para evitar que se disparen múltiples callbacks de compra al mismo tiempo. Un detalle muy importante de la versión v7 es la posibilidad de activar la reconexión automática del servicio mediante el método
enableAutoServiceReconnection(). Esto es una bendición, ya que reduce drásticamente los errores de desconexión que antes obligaban al desarrollador a escribir bloques enormes de código para reintentar la conexión.Mostrando los productos y lanzando la compra
No puedes simplemente lanzar un precio fijo en la app, ya que los precios varían según el país y la moneda. Por eso, debes usar queryProductDetailsAsync para obtener la información actualizada y localizada directamente desde Google. Este método te devolverá una lista de detalles del producto que podrás mostrar al usuario de forma atractiva.
Cuando el usuario decide comprar, entra en juego el método launchBillingFlow. Aquí es donde Google toma el control y muestra su propia pantalla de pago. Un truco para mejorar la seguridad y combatir el fraude es adjuntar el obfuscatedAccountId, que es básicamente un identificador de tu usuario cifrado. De esta forma, cuando la compra llegue a tu servidor, sabrás exactamente a quién asignar el beneficio sin exponer datos sensibles.
Gestión de transacciones y estados de compra
No todas las compras son instantáneas. Existe el concepto de transacciones pendientes, que ocurre cuando un usuario elige un método de pago diferido (como pagar en efectivo en un comercio). En estos casos, la compra queda en estado PENDING. Es crucial que tu aplicación no entregue el contenido hasta que el estado cambie a PURCHASED.
Para gestionar esto, debes implementar el PurchasesUpdatedListener. Este escucha te avisará en tiempo real cuando una transacción se complete. Si el resultado es exitoso, obtendrás un token de compra. Este token es la llave maestra: es el identificador único que deberás enviar a tu backend para validar que la operación es legítima antes de dar el premio al usuario.
El papel fundamental del servidor Backend
Si quieres dormir tranquilo, no confíes la validación de las compras solo al teléfono del usuario, ya que existen herramientas para saltarse estas comprobaciones. Lo ideal es implementar una validación mixta. Tu app envía el token al servidor, y este se comunica con la API de Google Play Developer usando los endpoints de
purchases.products:get o purchases.subscriptions:get.Una vez que el servidor confirma que la compra es real y no ha sido procesada anteriormente, procede a otorgar los derechos. Tras esto, es obligatorio notificar a Google que la compra ha sido procesada. Si no lo haces en un plazo de tres días, Google asumirá que hubo un problema y reembolsará el dinero automáticamente al usuario. Para productos consumibles se usa
consumeAsync y para no consumibles o suscripciones se utiliza acknowledgePurchase.Sincronización avanzada con RTDN
Para no tener que estar preguntando a Google cada cinco minutos si una suscripción sigue activa, existen las Real-time Developer Notifications (RTDN). Este sistema utiliza Google Cloud Pub/Sub para enviarte un aviso instantáneo a tu servidor cada vez que algo cambie: una renovación, una cancelación o un problema de pago.
Configurar RTDN implica crear un tema en la consola de Google Cloud y dar permisos a la cuenta de servicio de Google Play. Cuando tu servidor recibe una notificación, puede actualizar la base de datos de derechos del usuario de inmediato. Esto es especialmente útil para implementar estrategias de recuperación; por ejemplo, si una suscripción entra en período de gracia, puedes enviar un correo automático al usuario pidiéndole que actualice su método de pago.
Pruebas y diagnóstico con Play Billing Lab
Probar todos los escenarios posibles (como que se caiga la red justo al pagar) puede ser una pesadilla. Para eso existe Play Billing Lab, una aplicación gratuita que permite simular respuestas de la librería de facturación. Puedes configurar códigos de error específicos para ver cómo reacciona tu app ante un SERVICE_DISCONNECTED o un error de consumo.
Para que esto funcione, debes añadir unas etiquetas de metadatos en el AndroidManifest.xml, como
enableBillingOverridesTesting. Recuerda quitar estas etiquetas antes de subir la versión final a producción, ya que son solo para entornos de desarrollo y testeo. Utilizar este laboratorio te asegura que el flujo de usuario sea fluido y que no haya fugas de ingresos por errores de implementación.Continúar leyendo...