Torna al Blog

Cambiamenti di Google Play e Accordo Epic: Architettare il Third-Party Mobile Billing

Pubblicato il 6 marzo 2026
Cambiamenti di Google Play e Accordo Epic: Architettare il Third-Party Mobile Billing

Ogni sviluppatore di giochi mobile ha guardato la propria dashboard dei ricavi mensili e ha sussultato vedendo la commissione del 30% della piattaforma vaporizzare istantaneamente i propri margini. Per anni, gli sviluppatori Android sono stati bloccati in un ecosistema rigido: se volevi il tuo gioco sul più grande store mobile del mondo, dovevi usare il loro sistema di billing proprietario, cedere una fetta enorme delle tue microtransazioni e costruire l'intera architettura di entitlement attorno alle loro API specifiche.

Quell'era sta ufficialmente finendo. Per capitalizzare appieno i termini introdotti dai google play changes epic settlement, i developer devono ripensare radicalmente la propria infrastruttura backend.

La recente conclusione della saga legale Epic Games vs. Google ha portato a cambiamenti imposti dal tribunale che aprono completamente l'ecosistema Android. Gli sviluppatori possono ora indirizzare i giocatori verso payment gateway esterni, bypassare la tassa obbligatoria del 30% e persino distribuire tramite app store alternativi ospitati direttamente all'interno di Google Play.

Ma questa nuova libertà finanziaria comporta un severo costo tecnico. Se abbandoni Google Play Billing, perdi la validazione automatica delle ricevute, il caching offline e il tracciamento centralizzato degli entitlement che forniva. Ora sei interamente responsabile della gestione sicura degli acquisti dei tuoi giocatori su più payment gateway.

Ecco un approfondimento sull'impatto tecnico di questi cambiamenti e su come progettare un backend di billing sicuro e indipendente dallo store che prevenga le frodi e mantenga sincronizzati i world state.

L'impatto tecnico dell'accordo Epic vs. Google

Prima di immergerci nel codice, dobbiamo capire esattamente cosa cambia per l'architettura del tuo gioco l'ingiunzione del tribunale (efficace da novembre 2024 a novembre 2027).

1. Il routing dei pagamenti esterni è ora legale

Google non può più bannare il tuo gioco perché include link che indirizzano i giocatori a un browser web per completare un acquisto. Ciò significa che puoi integrare provider di pagamento come Stripe, Xsolla o PayPal, che in genere addebitano circa dal 2,9% al 5% più una piccola commissione fissa per transazione. Per un gioco indie mid-core che genera 50.000 $ al mese in microtransazioni, allontanarsi dalla commissione del 30% della piattaforma fa risparmiare circa 12.500 $ ogni singolo mese.

2. Sideloading e store di terze parti

Gli app store alternativi possono ora essere distribuiti direttamente tramite il Google Play Store e a Google è vietato pagare i produttori di dispositivi per preinstallare esclusivamente Google Play. I tuoi giocatori potrebbero scaricare il tuo gioco dall'Epic Games Store, dall'Amazon Appstore o da un launcher personalizzato del publisher, il tutto giocando sullo stesso dispositivo Android.

3. La fine degli Entitlement da un'unica fonte

Storicamente, il client del tuo gioco poteva semplicemente interrogare la Google Play Billing Library per chiedere: "Questo utente possiede il battle pass premium?". Se la risposta era sì, sbloccavi il contenuto.

Ora, un giocatore potrebbe acquistare il battle pass tramite un link di checkout Stripe sul proprio PC, accedere al gioco scaricato da uno store Android alternativo e aspettarsi che il suo contenuto sia lì. La validazione lato client (client-side validation) è ufficialmente morta. Devi passare a un'architettura server-authoritative in cui il tuo backend è l'unica fonte di verità per tutti gli inventari dei giocatori.

Architettare un Backend di Entitlement indipendente dallo Store

Per supportare più payment gateway, il tuo backend ha bisogno di uno schema di database robusto che separi la transazione finanziaria dall'entitlement in-game.

Non legare mai l'inventario di un giocatore direttamente all'ID ricevuta di uno store specifico. Usa invece una tabella di transazioni intermedia.

Lo schema di database consigliato

Per costruire questo manualmente, avrai bisogno di tre tabelle principali nel tuo database relazionale (es. PostgreSQL):

  • Users: Il profilo principale del giocatore.
  • Transactions: Registra l'evento finanziario. Include GatewayProvider (es. "Stripe", "Google", "Xsolla"), GatewayTransactionId, Amount, Currency e Status (Pending, Completed, Refunded).
  • Entitlements: Gli oggetti di gioco effettivi posseduti dall'utente. Include UserId, ItemId, AcquiredViaTransactionId e RevokedAt.

Quando avviene un acquisto, il payment gateway contatta il tuo server con un webhook. Il tuo server verifica il webhook, crea un record Completed nella tabella Transactions e quindi inserisce gli oggetti corrispondenti nella tabella Entitlements.

Implementazione della validazione sicura dei Webhook lato server

La parte più critica di questa nuova architettura è l'handler del webhook. Se stai indirizzando i giocatori a una pagina di checkout di terze parti, quel provider esterno invierà una richiesta HTTP POST al tuo backend quando il pagamento va a buon fine.

I truffatori scansionano attivamente gli endpoint dei webhook non protetti. Se il tuo endpoint accetta ciecamente payload JSON senza verificare le firme crittografiche, gli aggressori forgeranno messaggi di "successo del pagamento" e si concederanno valuta premium infinita.

Ecco un esempio TypeScript pronto per la produzione che utilizza Express.js. Questo snippet mostra come convalidare in modo sicuro una firma di webhook Stripe, garantire l'idempotenza (in modo che ai giocatori non venga addebitato due volte se il webhook si attiva due volte) e aggiornare il database del giocatore.

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');
});

L'importanza del Payload Hardening

Nota come il codice sopra utilizzi express.raw() per catturare l'esatto byte stream della richiesta prima di parsarla in JSON. Anche un singolo spazio fuori posto nel payload JSON risulterà in un hash HMAC non corrispondente.

Proteggere questi endpoint non è facoltativo. Come abbiamo visto in importanti incidenti del settore, non riuscire a blindare il proprio backend contro richieste HTTP contraffatte è un modo garantito per rovinare l'economia del proprio gioco. Per uno sguardo più approfondito su come le API esposte portino a exploit catastrofici, leggi la nostra analisi su The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises.

Risolvere il problema della sincronizzazione in tempo reale

Abbiamo risolto la logica di entitlement del backend, ma ora dobbiamo affrontare un problema di UX.

Immagina il flusso del giocatore:

  1. Il giocatore tocca "Acquista 1000 monete" nel tuo gioco Android.
  2. Il gioco apre il browser web del dispositivo sulla tua pagina di checkout personalizzata.
  3. Il giocatore completa l'acquisto tramite carta di credito.
  4. Il payment gateway invia un webhook al tuo server.
  5. Il giocatore torna alla tua app di gioco.

Come fa il client di gioco a sapere che l'acquisto è andato a buon fine? Se ti affidi all'HTTP polling (facendo sì che il client chieda al server "L'ho già comprato?" ogni 3 secondi), consumerai la batteria del dispositivo e martellerai il tuo backend con richieste inutili.

Invece, il tuo backend deve inviare lo stato dell'inventario aggiornato al client nell'esatto millisecondo in cui viene eseguito il commit della transazione del database. Ciò richiede una connessione bidirezionale persistente. Se stai costruendo questa infrastruttura da zero, dovrai implementare un livello WebSocket che ascolti gli eventi del tuo database e li trasmetta alla sessione client attiva.

Se hai difficoltà con l'architettura per questo, puoi imparare come implementare queste notifiche push in tempo reale nella nostra guida: Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

5 Best Practice per il Third-Party Mobile Billing

Se stai migrando il tuo gioco dalla libreria standard di Google Play Billing per approfittare di questi nuovi cambiamenti nell'ecosistema, attieniti a queste cinque best practice architetturali:

  1. Imponi una Idempotenza Rigida: I timeout di rete si verificano costantemente sui dispositivi mobili. Un payment gateway potrebbe inviare lo stesso webhook di "successo" tre volte se il tuo server impiega troppo tempo a rispondere. Controlla sempre il tuo database per il TransactionId prima di concedere oggetti per assicurarti che ai giocatori non vengano accidentalmente concesse più copie di un oggetto.
  2. Automatizza le revoche dei Chargeback: Billing di terze parti significa che sei responsabile della gestione di chargeback e rimborsi. Il tuo handler di webhook deve ascoltare gli eventi payment.refunded e contrassegnare automaticamente la riga corrispondente nella tabella Entitlements come Revoked. Se salti questo passaggio, i giocatori capiranno di poter chiedere il rimborso alla carta di credito e tenersi la valuta premium.
  3. Disaccoppia il Client dal Gateway: Il client del tuo gioco non dovrebbe mai comunicare direttamente con l'API del payment gateway. Il client dovrebbe richiedere un token di sessione di checkout al tuo backend, aprire la web view con quel token e lasciare che il backend gestisca l'effettiva validazione della transazione.
  4. Implementa la Graceful Degradation: Se il tuo database va giù, il tuo gioco dovrebbe essere comunque giocabile. Memorizza gli entitlement localmente sul dispositivo utilizzando un file di salvataggio crittografato, ma convalida sempre rispetto alla verità lato server quando il giocatore tenta di spendere valuta premium o partecipare a un match multiplayer.
  5. Unifica la tua pipeline di valuta virtuale: Non creare "Google Coins" e "Stripe Coins" separati nel tuo database. Mappa tutte le transazioni fiat in entrata su un unico ID valuta virtuale unificato sul tuo backend per evitare enormi grattacapi nella logica della UI del tuo gioco.

Il confronto tra Build vs. Buy Infrastructure

L'accordo Epic vs. Google è una vittoria enorme per i ricavi degli sviluppatori, ma sposta l'onere dell'infrastruttura direttamente sulle tue spalle.

Costruire un backend di billing ad alta disponibilità e indipendente dallo store richiede la configurazione di database PostgreSQL, la configurazione di Redis per il caching dell'idempotenza, la gestione dei certificati SSL per webhook sicuri e il mantenimento di server WebSocket per gli aggiornamenti dei client in tempo reale. Per un piccolo team indie, si tratta facilmente di 4-6 settimane di ingegneria backend dedicata, tempo che dovrebbe essere speso per rendere il gioco divertente.

Questa è esattamente la frizione architetturale che eliminiamo. Con horizOn, questi complessi servizi backend sono pre-configurati. La nostra piattaforma fornisce un sistema di entitlement indipendente dallo store pronto all'uso che gestisce in modo sicuro la validazione dei webhook server-to-server, previene le transazioni duplicate e sincronizza automaticamente gli inventari dei giocatori in tempo reale. Ottieni i vantaggi finanziari del billing di terze parti senza dover diventare un ingegnere DevOps.

Guardando al futuro

L'ecosistema del gaming mobile sta subendo il cambiamento strutturale più significativo degli ultimi dieci anni. I "walled garden" stanno finalmente crollando e gli sviluppatori che adattano le loro architetture backend per essere indipendenti dalla piattaforma raccoglieranno enormi ricompense finanziarie evitando la tradizionale tassa del 30% della piattaforma.

Tuttavia, questa libertà richiede responsabilità tecnica. L'autorità lato client non è più praticabile. Se vuoi sopravvivere in un mondo multi-store e multi-gateway, devi trattare il tuo backend come l'assoluta fonte di verità.

Pronto a scalare il tuo backend multiplayer e implementare entitlement cross-platform sicuri senza scrivere migliaia di righe di codice infrastrutturale boilerplate? Prova horizOn gratuitamente e lasciaci gestire l'architettura del tuo server così potrai concentrarti sulla pubblicazione del tuo gioco.


Fonte: Major Google Play Changes as Epic v Google Ends