Volver al Blog

Cambios en Google Play y el Acuerdo con Epic: Arquitectura de Third-Party Mobile Billing

Publicado el 6 de marzo de 2026
Cambios en Google Play y el Acuerdo con Epic: Arquitectura de Third-Party Mobile Billing

Cualquier desarrollador de juegos móviles ha mirado su panel de ingresos mensuales y ha hecho una mueca al ver cómo la comisión del 30% de la plataforma vaporiza instantáneamente sus márgenes. Durante años, los desarrolladores de Android estuvieron encerrados en un ecosistema rígido: si querías tu juego en la tienda móvil más grande del mundo, usabas su sistema de facturación propietario, entregabas una parte masiva de tus microtransacciones y construías toda tu arquitectura de derechos (entitlements) en torno a sus APIs específicas.

Esa era está terminando oficialmente. Para capitalizar plenamente los términos que han introducido los google play changes epic settlement, los desarrolladores deben repensar fundamentalmente su infraestructura de backend.

La reciente conclusión de la saga legal Epic Games vs. Google ha dado lugar a cambios ordenados por el tribunal que abren de par en par el ecosistema Android. Los desarrolladores ahora pueden dirigir a los jugadores a pasarelas de pago externas, eludir el impuesto obligatorio del 30% e incluso distribuir a través de tiendas de aplicaciones alternativas alojadas directamente dentro de Google Play.

Pero esta nueva libertad financiera conlleva un severo coste técnico. Si abandonas Google Play Billing, pierdes la validación automática de recibos, el almacenamiento en caché offline y el seguimiento centralizado de derechos que proporcionaba. Ahora eres totalmente responsable de gestionar de forma segura las compras de tus jugadores a través de múltiples pasarelas de pago.

Aquí profundizamos en el impacto técnico de estos cambios y en cómo diseñar un backend de facturación seguro e independiente de la tienda que evite el fraude y mantenga sincronizados los estados del mundo.

El impacto técnico del acuerdo Epic vs. Google

Antes de sumergirnos en el código, debemos entender exactamente qué cambia para la arquitectura de tu juego el mandato judicial (vigente de noviembre de 2024 a noviembre de 2027).

1. El enrutamiento de pagos externos ahora es legal

Google ya no puede prohibir tu juego por incluir enlaces que dirijan a los jugadores a un navegador web para completar una compra. Esto significa que puedes integrar proveedores de pago como Stripe, Xsolla o PayPal, que suelen cobrar entre un 2,9% y un 5% más una pequeña cuota fija por transacción. Para un juego indie mid-core que genera 50.000 dólares al mes en microtransacciones, alejarse de la comisión del 30% de la plataforma ahorra aproximadamente 12.500 dólares cada mes.

2. Sideloading y tiendas de terceros

Las tiendas de aplicaciones alternativas ahora pueden distribuirse directamente a través de Google Play Store, y se prohíbe a Google pagar a los fabricantes de dispositivos para que preinstalen Google Play de forma exclusiva. Tus jugadores podrían descargar tu juego de la Epic Games Store, la Amazon Appstore o un lanzador personalizado del editor, todo ello mientras juegan en el mismo dispositivo Android.

3. El fin de los Entitlements de fuente única

Históricamente, el cliente de tu juego podía simplemente consultar la Google Play Billing Library para preguntar: "¿Posee este usuario el pase de batalla premium?". Si la respuesta era afirmativa, desbloqueabas el contenido.

Ahora, un jugador podría comprar el pase de batalla a través de un enlace de pago de Stripe en su PC, iniciar sesión en tu juego descargado de una tienda Android alternativa y esperar que su contenido esté allí. La validación en el lado del cliente (client-side validation) ha muerto oficialmente. Debes pasar a una arquitectura server-authoritative donde tu backend sea la única fuente de verdad para todos los inventarios de los jugadores.

Arquitectando un Backend de Entitlements independiente de la tienda

Para soportar múltiples pasarelas de pago, tu backend necesita un esquema de base de datos robusto que desacople la transacción financiera del derecho (entitlement) dentro del juego.

Nunca vincules el inventario de un jugador directamente al ID de recibo de una tienda específica. En su lugar, utiliza una tabla de transacciones intermediaria.

El esquema de base de datos recomendado

Para construir esto manualmente, necesitarás tres tablas principales en tu base de datos relacional (por ejemplo, PostgreSQL):

  • Users: El perfil principal del jugador.
  • Transactions: Registra el evento financiero. Incluye GatewayProvider (por ejemplo, "Stripe", "Google", "Xsolla"), GatewayTransactionId, Amount, Currency y Status (Pending, Completed, Refunded).
  • Entitlements: Los artículos reales del juego que posee el usuario. Incluye UserId, ItemId, AcquiredViaTransactionId y RevokedAt.

Cuando se produce una compra, la pasarela de pago envía un webhook a tu servidor. Tu servidor verifica el webhook, crea un registro Completed en la tabla Transactions y luego inserta los artículos correspondientes en la tabla Entitlements.

Implementación de una validación segura de Webhooks en el servidor

La parte más crítica de esta nueva arquitectura es el manejador de webhooks. Si estás dirigiendo a los jugadores a una página de pago de terceros, ese proveedor externo enviará una solicitud HTTP POST a tu backend cuando el pago se realice correctamente.

Los estafadores escanean activamente en busca de endpoints de webhooks no protegidos. Si tu endpoint acepta ciegamente payloads JSON sin verificar las firmas criptográficas, los atacantes falsificarán mensajes de "pago correcto" y se concederán a sí mismos moneda premium infinita.

Aquí tienes un ejemplo de TypeScript listo para producción usando Express.js. Este fragmento demuestra cómo validar de forma segura una firma de webhook de Stripe, garantizar la idempotencia (para que a los jugadores no se les cobre dos veces si el webhook se dispara dos veces) y actualizar la base de datos del jugador.

import express from 'express';
import crypto from 'crypto';
import { PrismaClient } from '@prisma/client';

const app = express();
const prisma = new PrismaClient();
const WEBHOOK_SECRET = process.env.PAYMENT_WEBHOOK_SECRET || '';

// We need the raw body to verify the cryptographic signature
app.post('/api/webhooks/billing', express.raw({ type: 'application/json' }), async (req, res) => {
    const signature = req.headers['x-payment-signature'] as string;
    const rawBody = req.body;

    // 1. Cryptographic Signature Verification
    const expectedSignature = crypto
        .createHmac('sha256', WEBHOOK_SECRET)
        .update(rawBody)
        .digest('hex');

    if (signature !== expectedSignature) {
        console.error("Security Alert: Invalid webhook signature detected.");
        return res.status(401).send('Invalid signature');
    }

    const event = JSON.parse(rawBody.toString());

    // 2. Process only successful payments
    if (event.type === 'payment.success') {
        const { transactionId, playerId, itemId } = event.data;

        try {
            // 3. Database Transaction with Idempotency Check
            await prisma.$transaction(async (tx) => {
                // Check if we already processed this transaction (Idempotency)
                const existingTx = await tx.transaction.findUnique({
                    where: { gatewayTransactionId: transactionId }
                });

                if (existingTx) {
                    console.log(`Transaction ${transactionId} already processed. Skipping.`);
                    return;
                }

                // Log the financial transaction
                const newTx = await tx.transaction.create({
                    data: {
                        gatewayTransactionId: transactionId,
                        provider: 'CustomStripeGateway',
                        status: 'COMPLETED',
                        playerId: playerId
                    }
                });

                // Grant the in-game entitlement
                await tx.entitlement.create({
                    data: {
                        playerId: playerId,
                        itemId: itemId,
                        acquiredViaTransactionId: newTx.id
                    }
                });
                
                console.log(`Successfully granted item ${itemId} to player ${playerId}`);
            });

            return res.status(200).send('Webhook processed');

        } catch (error) {
            console.error("Database error during webhook processing:", error);
            return res.status(500).send('Internal Server Error');
        }
    }

    // Acknowledge other event types without crashing
    return res.status(200).send('Event ignored');
});

La importancia del endurecimiento del Payload

Observa cómo el código anterior utiliza express.raw() para capturar el flujo exacto de bytes de la solicitud antes de analizarlo en JSON. Incluso un solo espacio mal colocado en el payload JSON dará lugar a un hash HMAC que no coincidirá.

Asegurar estos endpoints no es opcional. Como hemos visto en incidentes importantes de la industria, no endurecer tu backend contra solicitudes HTTP falsificadas es una forma garantizada de arruinar la economía de tu juego. Para profundizar en cómo las APIs expuestas conducen a exploits catastróficos, lee nuestro análisis en The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises.

Resolviendo el problema de la sincronización en tiempo real

Hemos resuelto la lógica de derechos del backend, pero ahora nos enfrentamos a un problema de UX.

Imagina el flujo del jugador:

  1. El jugador toca en "Comprar 1000 monedas" en tu juego de Android.
  2. El juego abre el navegador web del dispositivo hacia tu página de pago personalizada.
  3. El jugador completa la compra mediante tarjeta de crédito.
  4. La pasarela de pago envía un webhook a tu servidor.
  5. El jugador vuelve a la aplicación del juego.

¿Cómo sabe el cliente del juego que la compra se ha realizado correctamente? Si confías en el HTTP polling (haciendo que el cliente pregunte al servidor "¿Ya lo he comprado?" cada 3 segundos), agotarás la batería del dispositivo y saturarás tu backend con solicitudes inútiles.

En su lugar, tu backend necesita enviar el estado actualizado del inventario al cliente en el milisegundo exacto en que se confirma la transacción de la base de datos. Esto requiere una conexión bidireccional persistente. Si estás construyendo esta infraestructura desde cero, necesitarás implementar una capa de WebSocket que escuche los eventos de tu base de datos y los transmita a la sesión activa del cliente.

Si tienes problemas con la arquitectura para esto, puedes aprender a implementar estas notificaciones push en tiempo real en nuestra guía: Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

5 mejores prácticas para la facturación móvil de terceros

Si estás migrando tu juego fuera de la biblioteca estándar de Google Play Billing para aprovechar estos nuevos cambios en el ecosistema, sigue estas cinco mejores prácticas arquitectónicas:

  1. Aplica una idempotencia estricta: Los tiempos de espera de red ocurren constantemente en los dispositivos móviles. Una pasarela de pago puede enviar el mismo webhook de "éxito" tres veces si tu servidor tarda demasiado en responder. Comprueba siempre en tu base de datos el TransactionId antes de conceder artículos para asegurarte de que a los jugadores no se les concedan accidentalmente múltiples copias de un artículo.
  2. Automatiza las revocaciones de contracargos: La facturación de terceros significa que eres responsable de gestionar los contracargos y reembolsos. Tu manejador de webhooks debe escuchar los eventos payment.refunded y marcar automáticamente la fila correspondiente en tu tabla de Entitlements como Revoked. Si te saltas esto, los jugadores descubrirán que pueden pedir el reembolso a su tarjeta de crédito y quedarse con la moneda premium.
  3. Desacopla el cliente de la pasarela: El cliente de tu juego nunca debe comunicarse directamente con la API de la pasarela de pago. El cliente debe solicitar un token de sesión de pago a tu backend, abrir la vista web con ese token y dejar que el backend se encargue de la validación real de la transacción.
  4. Implementa una degradación elegante: Si tu base de datos se cae, tu juego debería seguir siendo jugable. Almacena en caché los derechos localmente en el dispositivo mediante un archivo de guardado cifrado, pero valida siempre contra la verdad del lado del servidor cuando el jugador intente gastar moneda premium o unirse a una partida multijugador.
  5. Unifica tu flujo de moneda virtual: No crees "Google Coins" y "Stripe Coins" separados en tu base de datos. Mapea todas las transacciones fiduciarias entrantes a un único ID de moneda virtual unificado en tu backend para evitar grandes dolores de cabeza en la lógica de la interfaz de usuario de tu juego.

Realidad de la infraestructura: ¿Construir o comprar?

El acuerdo Epic vs. Google es una victoria masiva para los ingresos de los desarrolladores, pero traslada la carga de la infraestructura directamente a tus hombros.

Construir un backend de facturación de alta disponibilidad e independiente de la tienda requiere configurar bases de datos PostgreSQL, configurar Redis para el almacenamiento en caché de idempotencia, gestionar certificados SSL para webhooks seguros y mantener servidores WebSocket para actualizaciones de clientes en tiempo real. Para un equipo indie pequeño, esto supone fácilmente entre 4 y 6 semanas de ingeniería de backend dedicada, tiempo que debería emplearse en hacer que tu juego sea divertido.

Esta es exactamente la fricción arquitectónica que eliminamos. Con horizOn, estos complejos servicios de backend vienen preconfigurados. Nuestra plataforma proporciona un sistema de derechos independiente de la tienda que gestiona de forma segura la validación de webhooks de servidor a servidor, evita transacciones duplicadas y sincroniza automáticamente los inventarios de los jugadores en tiempo real. Obtienes los beneficios financieros de la facturación de terceros sin tener que convertirte en un ingeniero de DevOps.

Mirando hacia el futuro

El ecosistema de los juegos móviles está experimentando su cambio estructural más significativo en más de una década. Los jardines vallados están cayendo finalmente, y los desarrolladores que adapten sus arquitecturas de backend para que sean independientes de la plataforma cosecharán enormes recompensas financieras al evitar el tradicional impuesto del 30% de la plataforma.

Sin embargo, esta libertad exige responsabilidad técnica. La autoridad en el lado del cliente ya no es viable. Si quieres sobrevivir en un mundo de múltiples tiendas y múltiples pasarelas, debes tratar a tu backend como la fuente absoluta de verdad.

¿Estás listo para escalar tu backend multijugador e implementar derechos multiplataforma seguros sin escribir miles de líneas de código de infraestructura repetitivo? Prueba horizOn gratis y déjanos encargarnos de la arquitectura de tu servidor para que puedas centrarte en lanzar tu juego.


Fuente: Major Google Play Changes as Epic v Google Ends