Retour au Blog

Changements Google Play et Accord Epic : Architecturer le Third-Party Mobile Billing

Publié le 6 mars 2026
Changements Google Play et Accord Epic : Architecturer le Third-Party Mobile Billing

Tout développeur de jeux mobiles a déjà consulté son tableau de bord de revenus mensuels en grimaçant face aux 30 % de frais de plateforme vaporisant instantanément ses marges. Pendant des années, les développeurs Android ont été enfermés dans un écosystème rigide : pour proposer votre jeu sur le plus grand store mobile au monde, vous deviez utiliser leur système de facturation propriétaire, abandonner une part massive de vos microtransactions et construire toute votre architecture d'entitlements autour de leurs APIs spécifiques.

Cette ère touche officiellement à sa fin. Pour tirer pleinement parti des conditions introduites par les google play changes epic settlement, les développeurs doivent fondamentalement repenser leur infrastructure backend.

La conclusion récente de la saga juridique Epic Games vs. Google a entraîné des changements imposés par la justice qui ouvrent grand l'écosystème Android. Les développeurs peuvent désormais orienter les joueurs vers des passerelles de paiement externes, contourner la taxe obligatoire de 30 % et même distribuer leurs jeux via des app stores alternatifs hébergés directement au sein de Google Play.

Mais cette nouvelle liberté financière s'accompagne d'un coût technique important. Si vous abandonnez Google Play Billing, vous perdez la validation automatique des reçus, le caching hors ligne et le suivi centralisé des entitlements qu'il fournissait. Vous êtes désormais entièrement responsable de la gestion sécurisée des achats de vos joueurs sur plusieurs passerelles de paiement.

Voici une analyse approfondie de l'impact technique de ces changements et de la manière d'architecturer un backend de facturation sécurisé et indépendant du store qui prévient la fraude et maintient vos world states synchronisés.

L'impact technique de l'accord Epic vs. Google

Avant de plonger dans le code, nous devons comprendre exactement ce que l'injonction du tribunal (effective de novembre 2024 à novembre 2027) change pour l'architecture de votre jeu.

1. Le routage des paiements externes est désormais légal

Google ne peut plus bannir votre jeu s'il inclut des liens dirigeant les joueurs vers un navigateur web pour finaliser un achat. Cela signifie que vous pouvez intégrer des prestataires de paiement comme Stripe, Xsolla ou PayPal, qui facturent généralement environ 2,9 % à 5 % plus des frais fixes minimes par transaction. Pour un jeu indie mid-core générant 50 000 $ par mois en microtransactions, s'affranchir des 30 % de frais de plateforme permet d'économiser environ 12 500 $ chaque mois.

2. Sideloading et stores tiers

Des app stores alternatifs peuvent désormais être distribués directement via le Google Play Store, et il est interdit à Google de payer les fabricants d'appareils pour préinstaller Google Play de manière exclusive. Vos joueurs pourraient télécharger votre jeu depuis l'Epic Games Store, l'Amazon Appstore ou un launcher d'éditeur personnalisé, tout en jouant sur le même appareil Android.

3. La fin des Entitlements à source unique

Historiquement, votre client de jeu pouvait simplement interroger la Google Play Billing Library pour demander : « Cet utilisateur possède-t-il le battle pass premium ? ». Si la réponse était oui, vous débloquiez le contenu.

Désormais, un joueur peut acheter le battle pass via un lien Stripe sur son PC, se connecter à votre jeu téléchargé depuis un store Android alternatif, et s'attendre à ce que son contenu soit présent. La validation côté client (client-side validation) est officiellement morte. Vous devez passer à une architecture server-authoritative où votre backend est l'unique source de vérité pour tous les inventaires des joueurs.

Architecturer un Backend d'Entitlements indépendant du Store

Pour supporter plusieurs passerelles de paiement, votre backend a besoin d'un schéma de base de données robuste qui découple la transaction financière de l'entitlement en jeu.

Ne liez jamais l'inventaire d'un joueur directement à l'ID de reçu d'un store spécifique. Utilisez plutôt une table de transactions intermédiaire.

Le schéma de base de données recommandé

Pour construire cela manuellement, vous aurez besoin de trois tables principales dans votre base de données relationnelle (ex: PostgreSQL) :

  • Users : Le profil principal du joueur.
  • Transactions : Journalise l'événement financier. Inclut GatewayProvider (ex: "Stripe", "Google", "Xsolla"), GatewayTransactionId, Amount, Currency, et Status (Pending, Completed, Refunded).
  • Entitlements : Les objets réels en jeu possédés par l'utilisateur. Inclut UserId, ItemId, AcquiredViaTransactionId, et RevokedAt.

Lorsqu'un achat survient, la passerelle de paiement contacte votre serveur via un webhook. Votre serveur vérifie le webhook, crée un enregistrement Completed dans la table Transactions, puis insère les objets correspondants dans la table Entitlements.

Implémenter une validation sécurisée des Webhooks côté serveur

La partie la plus critique de cette nouvelle architecture est le gestionnaire de webhooks. Si vous orientez les joueurs vers une page de paiement tierce, ce fournisseur externe enverra une requête HTTP POST à votre backend lorsque le paiement réussira.

Les fraudeurs scannent activement les endpoints de webhooks non protégés. Si votre endpoint accepte aveuglément des payloads JSON sans vérifier les signatures cryptographiques, des attaquants forgeront des messages de « succès de paiement » et s'octroieront une monnaie premium infinie.

Voici un exemple TypeScript prêt pour la production utilisant Express.js. Cet extrait montre comment valider de manière sécurisée une signature de webhook Stripe, garantir l'idempotence (pour que les joueurs ne soient pas débités deux fois si le webhook se déclenche deux fois) et mettre à jour la base de données du joueur.

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'importance du durcissement du Payload

Notez comment le code ci-dessus utilise express.raw() pour capturer le flux d'octets exact de la requête avant de l'analyser en JSON. Même un seul espace mal placé dans le payload JSON entraînera un hash HMAC discordant.

Sécuriser ces endpoints n'est pas optionnel. Comme nous l'avons vu lors d'incidents majeurs dans l'industrie, ne pas durcir votre backend contre les requêtes HTTP usurpées est un moyen garanti de ruiner l'économie de votre jeu. Pour en savoir plus sur la manière dont les APIs exposées mènent à des exploits catastrophiques, lisez notre analyse sur The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises.

Résoudre le problème de synchronisation en temps réel

Nous avons résolu la logique d'entitlement backend, mais nous sommes maintenant confrontés à un problème d'UX.

Imaginez le flux du joueur :

  1. Le joueur appuie sur « Acheter 1000 pièces » dans votre jeu Android.
  2. Le jeu ouvre le navigateur web de l'appareil vers votre page de paiement personnalisée.
  3. Le joueur finalise l'achat par carte bancaire.
  4. La passerelle de paiement envoie un webhook à votre serveur.
  5. Le joueur revient sur votre application de jeu.

Comment le client de jeu sait-il que l'achat a réussi ? Si vous comptez sur le HTTP polling (le client demande au serveur « Est-ce que j'ai déjà acheté ? » toutes les 3 secondes), vous allez vider la batterie de l'appareil et saturer votre backend de requêtes inutiles.

Au lieu de cela, votre backend doit pousser l'état mis à jour de l'inventaire au client à la milliseconde exacte où la transaction en base de données est validée. Cela nécessite une connexion bidirectionnelle persistante. Si vous construisez cette infrastructure de zéro, vous devrez implémenter une couche WebSocket qui écoute les événements de votre base de données et les diffuse à la session client active.

Si vous avez des difficultés avec cette architecture, vous pouvez apprendre à implémenter ces notifications push en temps réel dans notre guide : Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

5 bonnes pratiques pour le Third-Party Mobile Billing

Si vous migrez votre jeu hors de la bibliothèque standard Google Play Billing pour profiter de ces nouveaux changements, respectez ces cinq meilleures pratiques architecturales :

  1. Appliquer une idempotence stricte : Les timeouts réseau sont fréquents sur mobile. Une passerelle de paiement peut envoyer trois fois le même webhook de « succès » si votre serveur met trop de temps à répondre. Vérifiez toujours votre base de données pour le TransactionId avant d'octroyer des objets pour éviter que les joueurs n'en reçoivent accidentellement plusieurs exemplaires.
  2. Automatiser les révocations de chargebacks : La facturation tierce signifie que vous êtes responsable de la gestion des chargebacks et des remboursements. Votre gestionnaire de webhooks doit écouter les événements payment.refunded et marquer automatiquement la ligne correspondante dans votre table Entitlements comme Revoked. Si vous oubliez cela, les joueurs comprendront vite qu'ils peuvent se faire rembourser par leur banque tout en gardant la monnaie premium.
  3. Découpler le client de la passerelle : Votre client de jeu ne devrait jamais communiquer directement avec l'API de la passerelle de paiement. Le client doit demander un jeton de session de paiement à votre backend, ouvrir la web view avec ce jeton, et laisser le backend gérer la validation réelle de la transaction.
  4. Implémenter une dégradation gracieuse : Si votre base de données tombe, votre jeu doit rester jouable. Cachez les entitlements localement sur l'appareil via un fichier de sauvegarde chiffré, mais validez toujours par rapport à la vérité côté serveur lorsque le joueur tente de dépenser de la monnaie premium ou de rejoindre un match multijugeur.
  5. Unifier votre pipeline de monnaie virtuelle : Ne créez pas de « Google Coins » et de « Stripe Coins » distincts dans votre base de données. Mappez toutes les transactions fiduciaires entrantes vers un ID de monnaie virtuelle unique et unifié sur votre backend pour éviter des complications majeures dans la logique UI de votre jeu.

Réalité de l'infrastructure : Build vs. Buy

L'accord Epic vs. Google est une victoire massive pour les revenus des développeurs, mais il déplace la charge de l'infrastructure directement sur vos épaules.

Construire un backend de facturation hautement disponible et indépendant du store nécessite de configurer des bases de données PostgreSQL, de configurer Redis pour le caching d'idempotence, de gérer des certificats SSL pour des webhooks sécurisés et de maintenir des serveurs WebSocket pour les mises à jour client en temps réel. Pour une petite équipe indie, cela représente facilement 4 à 6 semaines d'ingénierie backend dédiée — du temps qui devrait être consacré à rendre votre jeu amusant.

C'est exactement cette friction architecturale que nous éliminons. Avec horizOn, ces services backend complexes sont pré-configurés. Notre plateforme fournit un système d'entitlement indépendant du store qui gère de manière sécurisée la validation des webhooks de serveur à serveur, prévient les transactions en double et synchronise automatiquement les inventaires des joueurs en temps réel. Vous bénéficiez des avantages financiers de la facturation tierce sans avoir à devenir un ingénieur DevOps.

Perspectives

L'écosystème du jeu mobile connaît son changement structurel le plus important depuis plus d'une décennie. Les jardins clos s'effondrent enfin, et les développeurs qui adaptent leurs architectures backend pour être agnostiques vis-à-vis des plateformes récolteront des récompenses financières massives en évitant la traditionnelle taxe de 30 %.

Cependant, cette liberté exige une responsabilité technique. L'autorité côté client n'est plus viable. Si vous voulez survivre dans un monde multi-stores et multi-passerelles, vous devez traiter votre backend comme la source absolue de vérité.

Prêt à scaler votre backend multijugeur et à implémenter des entitlements cross-platform sécurisés sans écrire des milliers de lignes de code d'infrastructure ? Essayez horizOn gratuitement et laissez-nous gérer votre architecture serveur pour que vous puissiez vous concentrer sur le lancement de votre jeu.


Source : Major Google Play Changes as Epic v Google Ends