Zurück zum Blog

Google Play Änderungen & Epic Settlement: Architektur für Third-Party Mobile Billing

Veröffentlicht am 6. März 2026
Google Play Änderungen & Epic Settlement: Architektur für Third-Party Mobile Billing

Jeder Mobile Game Developer hat schon einmal auf sein monatliches Revenue-Dashboard geschaut und zusammengezuckt, als die 30 % Plattformgebühr die Margen sofort verdampfen ließ. Jahrelang waren Android-Entwickler in einem starren Ökosystem gefangen: Wer sein Spiel im weltweit größten Mobile Store anbieten wollte, musste dessen proprietäres Billing-System nutzen, einen massiven Anteil seiner Mikrotransaktionen abgeben und die gesamte Entitlement-Architektur um dessen spezifische APIs herum aufbauen.

Diese Ära geht offiziell zu Ende. Um die Vorteile der google play changes epic settlement Bedingungen voll auszuschöpfen, müssen Entwickler ihre Backend-Infrastruktur grundlegend überdenken.

Der jüngste Abschluss der Rechtssaga Epic Games vs. Google hat zu gerichtlich angeordneten Änderungen geführt, die das Android-Ökosystem weit öffnen. Entwickler können Spieler nun zu externen Payment Gateways leiten, die obligatorische 30 %-Steuer umgehen und sogar über alternative App-Stores vertreiben, die direkt in Google Play gehostet werden.

Doch diese neu gewonnene finanzielle Freiheit hat einen hohen technischen Preis. Wenn Sie auf Google Play Billing verzichten, verlieren Sie die automatisierte Receipt Validation, das Offline-Caching und das zentralisierte Entitlement-Tracking, das es bot. Sie sind nun allein dafür verantwortlich, die Käufe Ihrer Spieler über mehrere Payment Gateways hinweg sicher zu verwalten.

Hier ist ein Deep Dive in die technischen Auswirkungen dieser Änderungen und wie man ein sicheres, Store-agnostisches Billing-Backend entwirft, das Betrug verhindert und Ihre World States synchron hält.

Die technischen Auswirkungen des Epic vs. Google Settlements

Bevor wir in den Code eintauchen, müssen wir verstehen, was genau die gerichtliche Verfügung (gültig von November 2024 bis November 2027) für Ihre Game-Architektur ändert.

1. Externes Payment Routing ist jetzt legal

Google darf Ihr Spiel nicht mehr sperren, weil es Links enthält, die Spieler zu einem Webbrowser leiten, um einen Kauf abzuschließen. Das bedeutet, dass Sie Zahlungsanbieter wie Stripe, Xsolla oder PayPal integrieren können, die in der Regel etwa 2,9 % bis 5 % plus eine kleine feste Gebühr pro Transaktion verlangen. Für ein Mid-Core-Indie-Spiel, das monatlich 50.000 $ an Mikrotransaktionen generiert, spart der Verzicht auf die 30 % Plattformgebühr jeden Monat etwa 12.500 $.

2. Sideloading und Third-Party Stores

Alternative App-Stores können nun direkt über den Google Play Store vertrieben werden, und Google ist es untersagt, Gerätehersteller dafür zu bezahlen, Google Play exklusiv vorinstallieren zu lassen. Ihre Spieler könnten Ihr Spiel aus dem Epic Games Store, dem Amazon Appstore oder einem benutzerdefinierten Publisher-Launcher herunterladen, während sie auf demselben Android-Gerät spielen.

3. Das Ende von Single-Source Entitlements

Früher konnte Ihr Game Client einfach die Google Play Billing Library abfragen: „Besitzt dieser Nutzer den Premium Battle Pass?“ Wenn die Antwort ja lautete, wurde der Inhalt freigeschaltet.

Jetzt kauft ein Spieler den Battle Pass vielleicht über einen Stripe-Checkout-Link auf seinem PC, loggt sich in Ihr Spiel ein, das aus einem alternativen Android-Store heruntergeladen wurde, und erwartet, dass seine Inhalte vorhanden sind. Client-side Validation ist offiziell tot. Sie müssen zu einer Server-authoritative Architektur übergehen, bei der Ihr Backend die Single Source of Truth für alle Spieler-Inventare ist.

Architektur eines Store-agnostischen Entitlement-Backends

Um mehrere Payment Gateways zu unterstützen, benötigt Ihr Backend ein robustes Datenbank-Schema, das die finanzielle Transaktion vom In-Game Entitlement entkoppelt.

Verknüpfen Sie das Inventar eines Spielers niemals direkt mit der Receipt ID eines bestimmten Stores. Verwenden Sie stattdessen eine zwischengeschaltete Transaktionstabelle.

Das empfohlene Datenbank-Schema

Um dies manuell aufzubauen, benötigen Sie drei Kerntabellen in Ihrer relationalen Datenbank (z. B. PostgreSQL):

  • Users: Das Kernprofil des Spielers.
  • Transactions: Protokolliert das finanzielle Ereignis. Enthält GatewayProvider (z. B. „Stripe“, „Google“, „Xsolla“), GatewayTransactionId, Amount, Currency und Status (Pending, Completed, Refunded).
  • Entitlements: Die tatsächlichen In-Game-Items, die der Nutzer besitzt. Enthält UserId, ItemId, AcquiredViaTransactionId und RevokedAt.

Wenn ein Kauf getätigt wird, sendet das Payment Gateway einen Webhook an Ihren Server. Ihr Server verifiziert den Webhook, erstellt einen Completed-Datensatz in der Tabelle Transactions und fügt dann die entsprechenden Items in die Tabelle Entitlements ein.

Implementierung einer sicheren Server-Side Webhook Validation

Der kritischste Teil dieser neuen Architektur ist der Webhook-Handler. Wenn Sie Spieler auf eine Checkout-Seite eines Drittanbieters leiten, sendet dieser externe Anbieter einen HTTP POST-Request an Ihr Backend, wenn die Zahlung erfolgreich war.

Betrüger scannen aktiv nach ungeschützten Webhook-Endpoints. Wenn Ihr Endpoint blind JSON-Payloads akzeptiert, ohne kryptografische Signaturen zu verifizieren, werden Angreifer „Payment Success“-Nachrichten fälschen und sich selbst unendlich viel Premium-Währung gewähren.

Hier ist ein produktionsreifes TypeScript-Beispiel mit Express.js. Dieses Snippet zeigt, wie man eine Stripe-Webhook-Signatur sicher validiert, Idempotenz sicherstellt (damit Spielern nichts doppelt berechnet wird, wenn der Webhook zweimal ausgelöst wird) und die Datenbank des Spielers aktualisiert.

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

Die Bedeutung von Payload Hardening

Beachten Sie, wie der obige Code express.raw() verwendet, um den exakten Byte-Stream des Requests zu erfassen, bevor er in JSON geparst wird. Schon ein einziges falsch platziertes Leerzeichen im JSON-Payload führt zu einem nicht übereinstimmenden HMAC-Hash.

Die Absicherung dieser Endpoints ist nicht optional. Wie wir bei großen Branchenvorfällen gesehen haben, ist das Versäumnis, Ihr Backend gegen gespoofte HTTP-Requests abzuhärten, ein garantierter Weg, die Ökonomie Ihres Spiels zu ruinieren. Für einen tieferen Einblick, wie exponierte APIs zu katastrophalen Exploits führen, lesen Sie unsere Analyse zu The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises.

Lösung des Real-Time Synchronization Problems

Wir haben die Backend-Entitlement-Logik gelöst, stehen nun aber vor einem UX-Problem.

Stellen Sie sich den Player Flow vor:

  1. Der Spieler tippt in Ihrem Android-Spiel auf „1000 Münzen kaufen“.
  2. Das Spiel öffnet den Webbrowser des Geräts mit Ihrer benutzerdefinierten Checkout-Seite.
  3. Der Spieler schließt den Kauf per Kreditkarte ab.
  4. Das Payment Gateway sendet einen Webhook an Ihren Server.
  5. Der Spieler wechselt zurück zu Ihrer Game App.

Woher weiß der Game Client, dass der Kauf erfolgreich war? Wenn Sie sich auf HTTP Polling verlassen (der Client fragt den Server alle 3 Sekunden: „Habe ich es schon gekauft?“), leeren Sie den Akku des Geräts und hämmern Ihr Backend mit nutzlosen Anfragen zu.

Stattdessen muss Ihr Backend den aktualisierten Inventarstatus in genau der Millisekunde an den Client pushen, in der die Datenbanktransaktion committet wird. Dies erfordert eine persistente bidirektionale Verbindung. Wenn Sie diese Infrastruktur von Grund auf neu aufbauen, müssen Sie einen WebSocket-Layer implementieren, der auf Ihre Datenbankereignisse hört und diese an die aktive Client-Session sendet.

Wenn Sie mit der Architektur dafür kämpfen, können Sie in unserem Guide lernen, wie Sie diese Real-Time Push-Benachrichtigungen implementieren: Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

5 Best Practices für Third-Party Mobile Billing

Wenn Sie Ihr Spiel von der Standard-Google Play Billing-Library migrieren, um diese neuen Änderungen im Ökosystem zu nutzen, halten Sie sich an diese fünf architektonischen Best Practices:

  1. Strikte Idempotenz erzwingen: Netzwerk-Timeouts kommen auf mobilen Geräten ständig vor. Ein Payment Gateway sendet denselben „Success“-Webhook möglicherweise dreimal, wenn Ihr Server zu lange für die Antwort braucht. Überprüfen Sie immer Ihre Datenbank auf die TransactionId, bevor Sie Items gewähren, um sicherzustellen, dass Spielern nicht versehentlich mehrere Kopien eines Items gewährt werden.
  2. Chargeback-Widerrufe automatisieren: Third-Party Billing bedeutet, dass Sie für die Abwicklung von Chargebacks und Rückerstattungen verantwortlich sind. Ihr Webhook-Handler muss auf payment.refunded-Ereignisse hören und die entsprechende Zeile in Ihrer Entitlements-Tabelle automatisch als Revoked markieren. Wenn Sie dies überspringen, werden die Spieler herausfinden, dass sie ihre Kreditkarte zurückbuchen lassen und die Premium-Währung behalten können.
  3. Entkoppeln Sie den Client vom Gateway: Ihr Game Client sollte niemals direkt mit der API des Payment Gateways kommunizieren. Der Client sollte ein Checkout-Session-Token von Ihrem Backend anfordern, die Web-View mit diesem Token öffnen und das Backend die eigentliche Transaktionsvalidierung durchführen lassen.
  4. Graceful Degradation implementieren: Wenn Ihre Datenbank ausfällt, sollte Ihr Spiel trotzdem spielbar sein. Cachen Sie Entitlements lokal auf dem Gerät mit einer verschlüsselten Save-Datei, aber validieren Sie immer gegen die Server-side Truth, wenn der Spieler versucht, Premium-Währung auszugeben oder einem Multiplayer-Match beizutreten.
  5. Vereinheitlichen Sie Ihre Virtual Currency Pipeline: Erstellen Sie keine separaten „Google Coins“ und „Stripe Coins“ in Ihrer Datenbank. Ordnen Sie alle eingehenden Fiat-Transaktionen einer einzigen, einheitlichen Virtual Currency ID in Ihrem Backend zu, um massive Kopfschmerzen in Ihrer Game-UI-Logik zu vermeiden.

Der Build vs. Buy Infrastruktur Reality Check

Das Epic vs. Google Settlement ist ein massiver Gewinn für den Umsatz der Entwickler, verlagert aber die Last der Infrastruktur direkt auf Ihre Schultern.

Der Aufbau eines hochverfügbaren, Store-agnostischen Billing-Backends erfordert das Einrichten von PostgreSQL-Datenbanken, das Konfigurieren von Redis für das Idempotency-Caching, das Verwalten von SSL-Zertifikaten für sichere Webhooks und das Warten von WebSocket-Servern für Real-Time Client-Updates. Für ein kleines Indie-Team sind das locker 4 bis 6 Wochen dediziertes Backend-Engineering – Zeit, die eigentlich darauf verwendet werden sollte, Ihr Spiel unterhaltsam zu machen.

Dies ist genau die architektonische Reibung, die wir eliminieren. Mit horizOn sind diese komplexen Backend-Services vorkonfiguriert. Unsere Plattform bietet ein Out-of-the-box, Store-agnostisches Entitlement-System, das Server-to-Server Webhook-Validierung sicher handhabt, doppelte Transaktionen verhindert und Spieler-Inventare automatisch in Echtzeit synchronisiert. Sie erhalten die finanziellen Vorteile von Third-Party Billing, ohne zum DevOps-Engineer werden zu müssen.

Ausblick

Das Mobile-Gaming-Ökosystem durchläuft seine bedeutendste strukturelle Veränderung seit über einem Jahrzehnt. Die Walled Gardens fallen endlich, und Entwickler, die ihre Backend-Architekturen plattformagnostisch anpassen, werden durch die Vermeidung der traditionellen 30 % Plattformsteuer massive finanzielle Belohnungen ernten.

Diese Freiheit erfordert jedoch technische Verantwortung. Client-side Authority ist nicht mehr tragbar. Wenn Sie in einer Welt mit mehreren Stores und mehreren Gateways überleben wollen, müssen Sie Ihr Backend als die absolute Source of Truth behandeln.

Bereit, Ihr Multiplayer-Backend zu skalieren und sichere, plattformübergreifende Entitlements zu implementieren, ohne Tausende von Zeilen Boilerplate-Infrastrukturcode zu schreiben? Testen Sie horizOn kostenlos und lassen Sie uns Ihre Server-Architektur übernehmen, damit Sie sich auf den Release Ihres Spiels konzentrieren können.


Quelle: Major Google Play Changes as Epic v Google Ends