Kembali ke Blog

Perubahan Google Play & Kesepakatan Epic: Merancang Arsitektur Third-Party Mobile Billing

Diterbitkan pada 6 Maret 2026
Perubahan Google Play & Kesepakatan Epic: Merancang Arsitektur Third-Party Mobile Billing

Setiap pengembang game mobile pasti pernah melihat dashboard pendapatan bulanan mereka dan meringis melihat biaya platform 30% yang seketika melenyapkan margin mereka. Selama bertahun-tahun, pengembang Android terkunci dalam ekosistem yang kaku: jika Anda ingin game Anda ada di toko aplikasi mobile terbesar di dunia, Anda harus menggunakan sistem billing milik mereka, menyerahkan potongan besar dari microtransactions Anda, dan membangun seluruh arsitektur entitlement Anda di sekitar API spesifik mereka.

Era itu secara resmi berakhir. Untuk memanfaatkan sepenuhnya ketentuan yang diperkenalkan oleh google play changes epic settlement, pengembang harus secara mendasar memikirkan kembali infrastruktur backend mereka.

Kesimpulan baru-baru ini dari saga hukum Epic Games vs. Google telah menghasilkan perubahan mandat pengadilan yang membuka lebar ekosistem Android. Pengembang sekarang dapat mengarahkan pemain ke payment gateway eksternal, melewati pajak wajib 30%, dan bahkan mendistribusikan melalui toko aplikasi alternatif yang dihosting langsung di dalam Google Play.

Namun kebebasan finansial yang baru ditemukan ini datang dengan biaya teknis yang berat. Jika Anda meninggalkan Google Play Billing, Anda kehilangan receipt validation otomatis, offline caching, dan pelacakan entitlement terpusat yang disediakannya. Anda sekarang bertanggung jawab sepenuhnya untuk mengelola pembelian pemain Anda dengan aman di berbagai payment gateway.

Berikut adalah pembahasan mendalam tentang dampak teknis dari perubahan ini, dan cara merancang billing backend yang aman dan store-agnostic yang mencegah penipuan dan menjaga sinkronisasi world states Anda.

Dampak Teknis dari Kesepakatan Epic vs. Google

Sebelum mendalami kode, kita perlu memahami apa yang diubah oleh perintah pengadilan (berlaku dari November 2024 hingga November 2027) bagi arsitektur game Anda.

1. Perutean Pembayaran Eksternal Sekarang Legal

Google tidak lagi dapat memblokir game Anda karena menyertakan tautan yang mengarahkan pemain ke browser web untuk menyelesaikan pembelian. Ini berarti Anda dapat mengintegrasikan penyedia pembayaran seperti Stripe, Xsolla, atau PayPal, yang biasanya mengenakan biaya sekitar 2,9% hingga 5% ditambah biaya tetap kecil per transaksi. Untuk game indie mid-core yang menghasilkan $50.000 sebulan dari microtransactions, beralih dari biaya platform 30% menghemat sekitar $12.500 setiap bulannya.

2. Sideloading dan Toko Pihak Ketiga

Toko aplikasi alternatif sekarang dapat didistribusikan langsung melalui Google Play Store, dan Google dilarang membayar produsen perangkat untuk menginstal Google Play secara eksklusif. Pemain Anda mungkin mengunduh game Anda dari Epic Games Store, Amazon Appstore, atau launcher penerbit kustom, semuanya sambil bermain di perangkat Android yang sama.

3. Matinya Entitlement Sumber Tunggal

Secara historis, game client Anda cukup melakukan query ke Google Play Billing Library untuk bertanya, "Apakah pengguna ini memiliki battle pass premium?" Jika jawabannya ya, Anda membuka konten tersebut.

Sekarang, seorang pemain mungkin membeli battle pass melalui tautan checkout Stripe di PC mereka, masuk ke game Anda yang diunduh dari toko Android alternatif, dan mengharapkan konten mereka ada di sana. Validasi sisi klien (client-side validation) secara resmi telah mati. Anda harus pindah ke arsitektur server-authoritative di mana backend Anda adalah satu-satunya sumber kebenaran (single source of truth) untuk semua inventaris pemain.

Merancang Backend Entitlement yang Store-Agnostic

Untuk mendukung beberapa payment gateway, backend Anda memerlukan skema database yang kuat yang memisahkan transaksi finansial dari entitlement dalam game.

Jangan pernah mengikat inventaris pemain secara langsung ke ID tanda terima toko tertentu. Sebaliknya, gunakan tabel transaksi perantara.

Skema Database yang Direkomendasikan

Untuk membangun ini secara manual, Anda akan memerlukan tiga tabel inti dalam database relasional Anda (misalnya, PostgreSQL):

  • Users: Profil pemain inti.
  • Transactions: Mencatat peristiwa finansial. Termasuk GatewayProvider (misalnya, "Stripe", "Google", "Xsolla"), GatewayTransactionId, Amount, Currency, dan Status (Pending, Completed, Refunded).
  • Entitlements: Item dalam game yang sebenarnya dimiliki pengguna. Termasuk UserId, ItemId, AcquiredViaTransactionId, dan RevokedAt.

Ketika pembelian terjadi, payment gateway memanggil server Anda dengan webhook. Server Anda memverifikasi webhook, membuat catatan Completed di tabel Transactions, lalu memasukkan item yang sesuai ke dalam tabel Entitlements.

Mengimplementasikan Validasi Webhook Sisi Server yang Aman

Bagian paling kritis dari arsitektur baru ini adalah webhook handler. Jika Anda mengarahkan pemain ke halaman checkout pihak ketiga, penyedia eksternal tersebut akan mengirimkan permintaan HTTP POST ke backend Anda saat pembayaran berhasil.

Penipu secara aktif memindai endpoint webhook yang tidak terlindungi. Jika endpoint Anda menerima payload JSON secara membabi buta tanpa memverifikasi tanda tangan kriptografi, penyerang akan memalsukan pesan "pembayaran berhasil" dan memberikan diri mereka mata uang premium tanpa batas.

Berikut adalah contoh TypeScript siap produksi menggunakan Express.js. Cuplikan ini menunjukkan cara memvalidasi tanda tangan Stripe webhook dengan aman, memastikan idempotency (agar pemain tidak ditagih dua kali jika webhook dipicu dua kali), dan memperbarui database pemain.

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

Pentingnya Payload Hardening

Perhatikan bagaimana kode di atas menggunakan express.raw() untuk menangkap byte stream yang tepat dari permintaan sebelum mem-parsing-nya menjadi JSON. Bahkan satu spasi yang salah tempat dalam payload JSON akan menghasilkan hash HMAC yang tidak cocok.

Mengamankan endpoint ini bukanlah pilihan. Seperti yang telah kita lihat dalam insiden industri besar, kegagalan untuk memperkuat (hardening) backend Anda terhadap permintaan HTTP palsu adalah cara yang pasti untuk merusak ekonomi game Anda. Untuk melihat lebih dalam tentang bagaimana API yang terekspos menyebabkan eksploitasi katastropik, baca analisis kami tentang The Star Citizen Data Breach Explained Architecting Game Backends To Survive Compromises.

Menyelesaikan Masalah Sinkronisasi Real-Time

Kita telah menyelesaikan logika entitlement backend, tetapi sekarang kita menghadapi masalah UX.

Bayangkan alur pemain:

  1. Pemain mengetuk "Beli 1000 Koin" di game Android Anda.
  2. Game membuka browser web perangkat ke halaman checkout kustom Anda.
  3. Pemain menyelesaikan pembelian melalui kartu kredit.
  4. Payment gateway memicu webhook ke server Anda.
  5. Pemain beralih kembali ke aplikasi game Anda.

Bagaimana game client tahu bahwa pembelian berhasil? Jika Anda mengandalkan HTTP polling (membuat klien bertanya ke server "Apakah saya sudah membelinya?" setiap 3 detik), Anda akan menguras baterai perangkat dan membombardir backend Anda dengan permintaan yang tidak berguna.

Sebaliknya, backend Anda perlu mendorong (push) status inventaris yang diperbarui ke klien pada milidetik yang tepat saat transaksi database dilakukan. Ini memerlukan koneksi dua arah yang persisten. Jika Anda membangun infrastruktur ini dari nol, Anda perlu mengimplementasikan lapisan WebSocket yang mendengarkan peristiwa database Anda dan menyiarkannya ke sesi klien yang aktif.

Jika Anda kesulitan dengan arsitektur untuk ini, Anda dapat mempelajari cara mengimplementasikan push notification real-time ini dalam panduan kami: Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

5 Praktik Terbaik untuk Third-Party Mobile Billing

Jika Anda memigrasikan game Anda dari library standar Google Play Billing untuk memanfaatkan perubahan ekosistem baru ini, patuhi lima praktik terbaik arsitektur ini:

  1. Terapkan Idempotency yang Ketat: Timeout jaringan sering terjadi pada perangkat mobile. Payment gateway mungkin mengirimkan webhook "berhasil" yang sama tiga kali jika server Anda butuh waktu terlalu lama untuk merespons. Selalu periksa database Anda untuk TransactionId sebelum memberikan item untuk memastikan pemain tidak secara tidak sengaja diberikan beberapa salinan item.
  2. Otomatisasi Pencabutan Chargeback: Billing pihak ketiga berarti Anda bertanggung jawab untuk menangani chargeback dan pengembalian dana. Webhook handler Anda harus mendengarkan peristiwa payment.refunded dan secara otomatis menandai baris yang sesuai di tabel Entitlements Anda sebagai Revoked. Jika Anda melewatkan ini, pemain akan menyadari bahwa mereka dapat melakukan refund kartu kredit dan tetap menyimpan mata uang premium.
  3. Pisahkan Klien dari Gateway: Game client Anda tidak boleh berkomunikasi langsung dengan API payment gateway. Klien harus meminta token sesi checkout dari backend Anda, membuka tampilan web dengan token tersebut, dan membiarkan backend menangani validasi transaksi yang sebenarnya.
  4. Implementasikan Graceful Degradation: Jika database Anda mati, game Anda harus tetap bisa dimainkan. Cache entitlement secara lokal di perangkat menggunakan file simpanan terenkripsi, tetapi selalu validasi terhadap kebenaran sisi server saat pemain mencoba menghabiskan mata uang premium atau bergabung dalam pertandingan multiplayer.
  5. Satukan Pipeline Mata Uang Virtual Anda: Jangan membuat "Google Coins" dan "Stripe Coins" yang terpisah di database Anda. Petakan semua transaksi fiat yang masuk ke satu ID mata uang virtual yang terpadu di backend Anda untuk mencegah masalah besar dalam logika UI game Anda.

Realitas Infrastruktur: Build vs. Buy

Kesepakatan Epic vs. Google adalah kemenangan besar bagi pendapatan pengembang, tetapi ini memindahkan beban infrastruktur langsung ke pundak Anda.

Membangun billing backend yang sangat tersedia dan store-agnostic memerlukan pengaturan database PostgreSQL, mengonfigurasi Redis untuk caching idempotency, mengelola sertifikat SSL untuk webhook yang aman, dan memelihara server WebSocket untuk pembaruan klien real-time. Untuk tim indie kecil, ini bisa memakan waktu 4 hingga 6 minggu rekayasa backend khusus—waktu yang seharusnya dihabiskan untuk membuat game Anda menyenangkan.

Inilah hambatan arsitektur yang kami hilangkan. Dengan horizOn, layanan backend yang kompleks ini sudah dikonfigurasi sebelumnya. Platform kami menyediakan sistem entitlement store-agnostic siap pakai yang menangani validasi webhook server-ke-server dengan aman, mencegah transaksi duplikat, dan secara otomatis menyinkronkan inventaris pemain secara real-time. Anda mendapatkan manfaat finansial dari billing pihak ketiga tanpa harus menjadi seorang DevOps engineer.

Menatap ke Depan

Ekosistem game mobile sedang mengalami perubahan struktural paling signifikan dalam lebih dari satu dekade. "Taman bertembok" akhirnya runtuh, dan pengembang yang mengadaptasi arsitektur backend mereka menjadi platform-agnostic akan menuai imbalan finansial yang besar dengan menghindari pajak platform tradisional 30%.

Namun, kebebasan ini menuntut tanggung jawab teknis. Otoritas sisi klien tidak lagi layak. Jika Anda ingin bertahan di dunia multi-store dan multi-gateway, Anda harus memperlakukan backend Anda sebagai sumber kebenaran mutlak.

Siap untuk menskalakan multiplayer backend Anda dan mengimplementasikan entitlement lintas platform yang aman tanpa menulis ribuan baris kode infrastruktur boilerplate? Coba horizOn secara gratis dan biarkan kami menangani arsitektur server Anda sehingga Anda dapat fokus pada perilisan game Anda.


Sumber: Major Google Play Changes as Epic v Google Ends