Memaksimalkan Integrasi Layanan Penagihan Play

1. Ringkasan

Optimalkan aliran pendapatan dan luncurkan aplikasi Anda dengan percaya diri menggunakan codelab integrasi Library Layanan Penagihan Play ini dari Google Play. Codelab terstruktur ini memandu Anda menyiapkan, menguji, dan menerapkan pemrosesan pembelian yang andal, sehingga Anda dapat mendukung sasaran monetisasi dan memberikan pengalaman pengguna yang lebih lancar.

Kami akan membantu Anda menyiapkan Notifikasi developer real-time (RTDN) dan Play Billing Lab untuk langganan dan produk sekali beli untuk aplikasi dan game Anda. Anda akan mempelajari cara mengurangi churn pelanggan; melindungi dari penipuan dan penyalahgunaan; menguji kasus ekstrem; menyimulasikan, mereproduksi, dan mengatasi potensi masalah; serta bereksperimen dengan penawaran dan perubahan harga tanpa memengaruhi pengguna.

Pada akhirnya, Anda akan siap menerapkan strategi untuk mendapatkan kembali pengguna, dengan cepat mengatasi tantangan integrasi, meningkatkan ROI, memberikan pengalaman premium, serta meluncurkan aplikasi dan update dengan percaya diri.

Prasyarat

Yang akan Anda pelajari

  • Cara mengelola siklus proses pembelian dengan benar untuk membantu mengoptimalkan pertumbuhan dengan teknik untuk meningkatkan konversi pembelian dan retensi pelanggan
  • Cara menyiapkan Notifikasi developer real-time (RTDN) menggunakan Google Cloud Pub/Sub, yang kemudian dapat dimanfaatkan untuk menerapkan kampanye untuk mendapatkan kembali pengguna dan strategi pengelolaan siklus proses lainnya
  • Cara menyiapkan penerima di server backend untuk menangani notifikasi dengan aman menggunakan pelacakan dan hak yang akurat untuk mengurangi risiko penipuan dan penyalahgunaan atau pengembalian dana yang tidak diinginkan
  • Cara menguji integrasi dan menyimulasikan error menggunakan Lab Layanan Penagihan Play untuk meningkatkan pengalaman pengguna sekaligus mengurangi biaya pengembangan

Yang Anda butuhkan

2. Strategi monetisasi untuk langganan dan pembelian satu kali

Saat menjual produk digital melalui aplikasi, strategi monetisasi yang berhasil harus mempertimbangkan seluruh pengalaman pengguna, baik untuk pembelian satu kali maupun langganan. Pengalaman yang lancar dapat meningkatkan kesiapan pembelian dan mengurangi churn.

Alur pembelian umum untuk pembelian satu kali atau langganan akan melibatkan beberapa tahap:

  1. Pengguna menjelajahi item untuk dibeli.
  2. Meluncurkan alur pembelian bagi pengguna untuk menyelesaikan pembelian dan pembayaran.
  3. Memberi tahu server Anda tentang pembelian yang telah selesai
  4. Memverifikasi pembelian di server Anda.
  5. Memberikan konten kepada pengguna.
  6. Mengonfirmasi pengiriman konten. Untuk produk habis pakai, habiskan pembelian pada waktu yang tepat agar pengguna dapat membeli item itu lagi.

Integrasi dalam aplikasi memungkinkan Anda meluncurkan alur pembelian dan mengelola pengalaman pengguna ini, tetapi Anda harus terus memperbarui backend terkait hak yang dibeli pengguna. Hal ini penting untuk melacak pembelian dan mengelola aspek lain dari pengalaman pengguna, seperti hak lintas platform.

Notifikasi developer real-time (RTDN) adalah cara yang bagus untuk mengenali berbagai tahap ini dalam siklus proses pembelian dan dapat digunakan secara efektif sebagai alat pelacakan performa real-time, dan sebagai alat untuk mengaktifkan strategi perolehan kembali pelanggan.

Misalnya: Pengguna Anda baru saja membeli item baru atau baru saja melewatkan pembayaran sehingga langganannya telah memasuki masa tenggang. Dengan RTDN yang tepat, Anda dapat mengenali, hampir secara real time, bahwa status pengguna telah berubah dan bertindak sesuai dengan itu dengan membuat pengguna lebih berinteraksi dengan item yang baru saja mereka beli atau, dengan mengirimkan email pengingat untuk memperbarui detail pembayaran mereka agar dapat melanjutkan langganan.

RTDN juga merupakan cara yang bagus untuk menambahkan kontrol sisi server tambahan guna membantu Anda mengelola pembelian meskipun klien pengguna mengalami masalah. Misalnya, pengguna melakukan pembelian yang berhasil dan menerima konfirmasi dari Google, tetapi perangkat mereka kehilangan konektivitas jaringan sebelum perangkat mereka dan aplikasi Anda menerima notifikasi pembelian melalui pemroses pembelian. Dengan RTDN, Anda akan menerima notifikasi independen melalui server, yang memungkinkan Anda mengenali pembelian dan memberikan hak kepada pengguna secara terpisah dari masalah klien, sehingga memastikan proses pembelian yang andal.

Anda dapat mempelajari lebih lanjut semua jenis RTDN yang saat ini didukung di sini. Setiap jenis RTDN menandakan status pembelian yang berbeda. Sangat penting untuk menerapkan mekanisme penanganan yang sesuai untuk memastikan pemrosesan yang tepat sesuai kebutuhan dalam kasus penggunaan Anda. Codelab ini akan memandu Anda melalui contoh yang menangani pesan RTDN di server backend aman, termasuk menerima pesan, memvalidasi pembelian, dan memberikan hak kepada pengguna yang benar, saat pengguna berhasil menyelesaikan pembelian di aplikasi Anda. Selanjutnya, kami akan menunjukkan cara mengonfigurasi RTDN untuk aplikasi Anda.

3. Mengonfigurasi notifikasi developer real-time (RTDN)

Notifikasi developer real-time (RTDN) memanfaatkan Google Cloud Pub/Sub untuk memungkinkan Anda langsung merespons perubahan status pembelian. Cloud Pub/Sub adalah layanan pesan real-time terkelola sepenuhnya yang dapat Anda gunakan untuk mengirim dan menerima pesan antar-aplikasi secara independen. Google Play menggunakan Cloud Pub/Sub untuk memublikasikan notifikasi push terkait topik yang menjadi langganan Anda.

Untuk mengaktifkan RTDN, Anda harus menyiapkan Cloud Pub/Sub terlebih dahulu menggunakan project Google Cloud Platform (GCP) milik Anda sendiri, lalu mengaktifkan notifikasi untuk aplikasi Anda. Jika Anda belum terbiasa menggunakan GCP dan Cloud Pub/Sub, lihat Panduan memulai.

Membuat topik

Untuk mulai menerima notifikasi, Anda harus membuat topik yang akan menjadi tujuan publikasi notifikasi Google Play. Untuk membuat topik, ikuti petunjuk dalam Membuat topik.

Membuat langganan Pub/Sub

Untuk menerima pesan yang dipublikasikan ke suatu topik, Anda harus membuat langganan Pub/Sub ke topik tersebut. Untuk membuat langganan Pub/Sub, lakukan hal berikut:

  1. Baca Panduan Pelanggan Cloud Pub/Sub untuk memahami cara mengonfigurasi langganan sebagai langganan push atau langganan pull. Dalam codelab ini, kita akan menggunakan langganan pull yang mengharuskan server backend aman Anda untuk memulai permintaan ke server Cloud Pub/Sub guna mengambil pesan.
  1. Ikuti petunjuk dalam Menambahkan langganan untuk membuat langganan.

Memberikan hak publikasi atas topik Anda

Cloud Pub/Sub mengharuskan Anda memberikan hak istimewa kepada Google Play untuk memublikasikan notifikasi ke topik Anda.

  1. Buka Konsol Google Cloud.
  2. Pilih project Anda, lalu telusuri "Pub/Sub" di kotak penelusuran dan buka halaman konfigurasi Pub/Sub. Menelusuri dan membuka halaman konfigurasi Pub/Sub
  3. Temukan topik Anda, lalu buka setelan izin. Buka setelan izin
  4. Klik TAMBAHKAN PRINCIPAL untuk menambahkan akun layanan google-play-developer-notifications@system.gserviceaccount.com, lalu berikan peran Pub/Sub Publisher. Tambahkan akun layanan google-play-developer-notifications@system.gserviceaccount.com, dan berikan peran Pub/Sub Publisher
  5. Klik Simpan untuk menyelesaikan penyiapan topik. Klik Simpan untuk menyelesaikan penyiapan topik.

Mengaktifkan RTDN untuk aplikasi Anda

Pelajari cara menyiapkan Notifikasi developer real-time (RTDN) untuk meningkatkan integrasi Layanan Penagihan Play secara signifikan. Anda dapat meningkatkan keandalan pembelian dengan pesan yang dipersonalisasi dan juga mencegah penipuan dan penyalahgunaan untuk meningkatkan ROI secara keseluruhan.

RTDN memberikan update server ke server langsung dari Google Play untuk peristiwa utama, seperti perpanjangan langganan, pembelian baru, dan masalah pembayaran. Fitur ini membantu sistem backend Anda disinkronkan secara otomatis dengan status sebenarnya dari hak pengguna, sehingga melampaui batasan sisi klien dan memungkinkan Anda bereaksi secara instan dan sesuai.

Cara mengaktifkan Notifikasi developer real-time untuk aplikasi Anda:

  1. Buka Konsol Google Play.
  2. Pilih aplikasi Anda.
  3. Buka Monetisasi dengan Play > Penyiapan monetisasi.
  4. Scroll ke bagian Notifikasi developer real-time.
  5. Centang Aktifkan notifikasi real-time.
  6. Di kolom Nama topik, masukkan nama topik Cloud Pub/Sub lengkap yang Anda konfigurasikan sebelumnya. Nama topik harus menggunakan format projects/{project_id}/topics/{topic_name} dengan project_id adalah ID unik untuk project Anda, dan topic_name adalah nama topik yang dibuat sebelumnya.
  7. Klik Kirim Pesan Pengujian untuk mengirim pesan pengujian. Menjalankan uji publikasi membantu memastikan bahwa semuanya telah disiapkan dan dikonfigurasi dengan benar. Jika uji publikasi berhasil, akan muncul pesan yang menyatakan bahwa uji publikasi berhasil. Jika Anda telah melampirkan langganan untuk topik ini, Anda akan menerima pesan pengujian. Untuk langganan pull, buka langganan di Cloud Console, klik View Messages, dan lanjutkan untuk menarik pesan. Anda harus mengonfirmasi setiap pesan yang telah ditarik untuk menghindari pengiriman berulang oleh Cloud Pub/Sub. Untuk langganan push, periksa apakah pesan pengujian dikirimkan ke endpoint push Anda. Kode respons yang berhasil akan berfungsi sebagai pesan konfirmasi. Jika publikasi gagal, pesan error akan ditampilkan. Pastikan nama topik sudah benar dan akun layanan google-play-developer-notifications@system.gserviceaccount.com memiliki akses Pub/Sub Publisher ke topik tersebut.
  8. Pilih jenis notifikasi yang ingin Anda terima.
  • Dapatkan notifikasi untuk langganan dan semua pembelian yang dibatalkan - terima notifikasi developer real-time terkait langganan dan pembelian yang dibatalkan. Anda tidak akan menerima notifikasi untuk pembelian produk sekali beli.
  • Dapatkan semua notifikasi untuk langganan dan produk sekali beli - terima notifikasi untuk semua peristiwa langganan dan pembelian yang dibatalkan. Anda juga akan menerima peristiwa pembelian produk satu kali, seperti ONE_TIME_PRODUCT_PURCHASED dan ONE_TIME_PRODUCT_CANCELED. Lihat Siklus proses pembelian satu kali untuk mempelajari peristiwa pembelian ini lebih lanjut.

a266e5dec5c93cd8.png

  1. Klik Simpan perubahan.

Sekarang Anda telah menyelesaikan notifikasi developer real-time untuk aplikasi Anda, yang memberi Anda alat untuk mengatasi tantangan umum, seperti churn pengguna melalui pesan untuk menarik kembali, atau penipuan dan penyalahgunaan. Di bagian berikutnya, kita akan membuat subscriber di server backend aman Anda untuk menggunakan pesan yang dikirim ke topik Cloud Pub/Sub Anda.

4. Terima notifikasi

Anda harus terus memperbarui status pembelian di server backend untuk memberikan pengalaman pengguna terbaik di aplikasi. Misalnya, saat pengguna berhasil menyelesaikan pembelian dengan pembayaran di aplikasi, mereka harus mendapatkan konten yang dikirim ke akun mereka sesegera mungkin.

Hal ini memerlukan penyelesaian pembelian untuk dideteksi dan diproses secara tepat waktu. Play Billing Library menyediakan beberapa cara untuk mendeteksi pembelian di aplikasi Anda. Setelah mendeteksi pembelian yang telah selesai, aplikasi Anda harus memberi tahu server backend untuk memverifikasi pembelian, memberikan konten kepada pengguna yang benar, lalu memberi tahu Google bahwa pembelian telah diproses. Namun, aplikasi Anda mungkin tidak mendeteksi pembelian secara tepat waktu karena berbagai alasan. Misalnya, pengguna dapat melakukan pembelian yang berhasil dan menerima konfirmasi dari Google, tetapi perangkat mereka kehilangan konektivitas jaringan sebelum perangkat mereka dan aplikasi Anda menerima notifikasi melalui antarmuka Library Layanan Penagihan Play. RTDN menyediakan kontrol sisi server tambahan untuk membantu Anda mengelola pembelian meskipun klien pengguna mengalami masalah. RTDN menjamin notifikasi independen ke server Anda setelah perubahan status pembelian, sehingga Anda dapat mengenali perubahan status pembelian hampir seketika melalui jalur kedua secara independen dari potensi masalah klien, sehingga memastikan proses pembelian yang lebih andal.

Di bagian ini, Anda akan membuat subscriber untuk menggunakan pesan yang dikirim ke topik Cloud Pub/Sub menggunakan Library Klien Cloud Pub/Sub. Library ini tersedia dalam berbagai bahasa. Di bagian berikut, kita akan menambahkan ke pelanggan untuk memverifikasi pembelian, memberikan hak kepada pengguna yang benar, dan mengonfirmasi/menggunakan pembelian di server. Untuk codelab ini, kita menggunakan Java.

Setiap publikasi yang dibuat pada topik Cloud Pub/Sub berisi kolom data tunggal yang dienkode dengan base64.

{
 "message": {
   "attributes": {
     "key": "value"
   },
   "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
   "messageId": "136969346945"
 },
 "subscription": "projects/myproject/subscriptions/mysubscription"
}

Setelah Anda mendekode kolom data yang dienkode dengan base64, DeveloperNotification akan berisi kolom berikut:

{
 "version": string,
 "packageName": string,
 "eventTimeMillis": long,
 "oneTimeProductNotification": OneTimeProductNotification,
 "subscriptionNotification": SubscriptionNotification,
 "voidedPurchaseNotification": VoidedPurchaseNotification,
 "testNotification": TestNotification
}

Silakan baca Referensi notifikasi developer real-time untuk mengetahui informasi selengkapnya.

Berikut adalah contoh kode NotificationReceiver untuk server backend aman Anda guna memproses pesan Pub/Sub. Untuk melakukan autentikasi ke Security Command Center, siapkan Kredensial Default Aplikasi, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.Base64;
import org.json.JSONObject;

/** Real-time developer notifications receiver. */
public class NotificationReceiver {

 private NotificationReceiver() {}

 /*
  * Receive notification messages from the subscription.
  *
  * @param projectId The project ID of your Google Cloud Project.
  * @param subscriptionId The subscription ID of the subscriber to the pub/sub topic.
  */
 public static void receiveNotificationMessages(String projectId, String subscriptionId) {
   ProjectSubscriptionName subscriptionName =
       ProjectSubscriptionName.of(projectId, subscriptionId);

   try {
     Subscriber subscriber =
         Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
     // Start the subscriber.
     subscriber.startAsync().awaitRunning();

     subscriber.awaitTerminated();
   } catch (IllegalStateException e) {
     System.out.println("Subscriber stopped: " + e);
   }
 }

 static class NotificationMessageReceiver implements MessageReceiver {

   @Override
   public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
     // Decode the data into a String from the message data field.
     String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
     // Parse the String into a JSON object.
     JSONObject messageJson = new JSONObject(jsonString);

     // Fetch the value for certain fields.
     String version = messageJson.getString("version");
     String packageName = messageJson.getString("packageName");
     System.out.println("version: " + version);
     System.out.println("packageName: " + packageName);

     // Validate the purchase and grant the entitlement as needed.
     // More details in the following sections.
     // ......

     // Acknowledge the message to avoid repeated delivery.
     consumer.ack();
   }
 }
}

Sekarang, Anda memiliki penerima notifikasi yang menggunakan pesan yang dikirim ke topik Cloud Pub/Sub di server backend aman. Di bagian berikut, kami akan membahas praktik terbaik untuk memproses pesan RTDN di server backend Anda.

5. Melampirkan ID pengguna dalam alur pembelian di aplikasi Anda

Saat server menerima pesan RTDN tentang pembaruan status pembelian, server Anda perlu mengetahui pengguna mana yang melakukan pembelian untuk memprosesnya, seperti mengirimkan konten kepada pengguna yang benar. Anda dapat melakukannya dengan melampirkan ID pengguna yang Anda miliki untuk pengguna yang melakukan pembelian menggunakan obfuscatedAccountId saat meluncurkan alur pembelian di aplikasi Anda. Contoh ID dapat berupa versi login pengguna yang di-obfuscate di sistem Anda. Menetapkan parameter ini dapat membantu Google mendeteksi penipuan. Selain itu, hal ini dapat membantu Anda memastikan pembelian diatribusikan ke pengguna yang tepat seperti yang dibahas dalam memberikan hak kepada pengguna.

Berikut adalah contoh kode untuk melampirkan ID pengguna saat meluncurkan alur pembelian di aplikasi dengan menetapkan obfuscatedAccountId.

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// A user identifier, e.g. an obfuscated user id in your system.
String obfuscatedAccountId = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // set the offer token to specify the offer to purchase when applicable, e.g., subscription products
            // .setOfferToken(offerToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .setObfuscatedAccountId(obfuscatedAccountId)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Seperti yang akan Anda lihat di bagian berikutnya, ID pengguna yang ditetapkan dalam alur pembelian akan disertakan dalam pembelian dan dapat digunakan untuk memberikan hak kepada pengguna yang benar.

6. Memverifikasi pembelian sebelum memberikan hak

Di bagian ini, kita akan membahas praktik terbaik untuk memverifikasi pembelian sebelum memberikan hak di server backend yang aman.

Setelah pengguna melakukan pembelian produk sekali beli, pelanggan Pub/Sub di server backend aman Anda akan menerima pesan Pub/Sub. Anda harus melakukan hal berikut di server backend:

  1. Mengurai purchaseToken dari pesan Pub/Sub. Anda harus menyimpan catatan semua nilai purchaseToken untuk semua pembelian.
  2. Verifikasi bahwa nilai purchaseToken untuk pembelian saat ini tidak cocok dengan nilai purchaseToken sebelumnya. purchaseToken bersifat unik secara global, sehingga Anda dapat menggunakan nilai ini dengan aman sebagai kunci utama dalam database.
  3. Gunakan endpoint purchases.products:get di Google Play Developer API untuk memverifikasi dengan Google bahwa pembelian tersebut sah.
  1. Jika pembelian sah dan belum pernah digunakan sebelumnya, Anda dapat dengan aman memberikan hak atas langganan atau item dalam aplikasi.
  2. Sebaiknya Anda memberikan hak hanya jika pembelian berstatus PURCHASED dan memastikan untuk menangani pembelian berstatus PENDING dengan benar. Anda dapat menemukan informasi selengkapnya di Menangani transaksi yang tertunda.

Contoh kode berikut membuat klien API untuk Google Play Developer API. Kita akan menggunakannya untuk melakukan panggilan API nanti.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

/** Helper class to initialize the publisher APIs client library. */
public class AndroidPublisherHelper {
 /* Your application name */
 private static final String APPLICATION_NAME = "YourApplicationName";

 /* Load credentials from a JSON key file. Replace with the actual path to your downloaded service
  * account key file.
  */
 private static final String RESOURCES_CLIENT_SECRETS_JSON =
     "/path/to/your/service_account_key.json";

 /** Global instance of the JSON factory. */
 private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

 /* The API client */
 private static final AndroidPublisher ANDROID_PUBLISHER = init();

 /**
  * Performs all necessary setup steps for running requests against the API.
  *
  * @return the {@link AndroidPublisher} service
  */
 private static AndroidPublisher init(){
   try {
     // Authorization.
     Credential credential =
         GoogleCredential.fromStream(
                 AndroidPublisherHelper.class.getResourceAsStream(RESOURCES_CLIENT_SECRETS_JSON))
             .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

     // Set up and return API client.
     return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
         .setApplicationName(ApplicationConfig.APPLICATION_NAME)
         .build();
   } catch (GeneralSecurityException | IOException ex) {
     throw new RuntimeException("fail to initialize the publisher APIs client library", ex);
   }
 }
}

Kemudian, kita menambahkan logika untuk melakukan panggilan API dan mengubah penerima yang dibuat sebelumnya untuk memvalidasi pembelian dan memberikan hak kepada pengguna yang benar.

Di AndroidPublisherHelper, tambahkan metode berikut untuk mengambil ProductPurchase dari endpoint Purchases.products:get di Google Play Developer API.

 /* Fetch the ProductPurchase for the one-time product purchase from
  * Purchases.products.get endpoint in the Google Play Developer API
  */
 public static ProductPurchase executeProductPurchasesGet(
     String packageName, String sku, String purchaseToken) {
   try {
     ProductPurchase productPurchase =
         ANDROID_PUBLISHER.purchases().products().get(packageName, sku, purchaseToken).execute();
     return productPurchase;
   } catch (IOException ex) {
     log.error("Exception was thrown while getting a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to fetch the purchase in case of transient failures.
     return null;
   }
 }

Di NotificationMessageReceiver, validasi pembelian dan berikan hak kepada pengguna yang benar di sistem Anda berdasarkan data yang disertakan dalam notifikasi. Anda harus terus melacak purchaseToken di server untuk menghindari pemrosesan duplikat.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   // Decode the data into a String from the message data field.
   String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
   // Parse the String into a JSON object.
   JSONObject messageJson = new JSONObject(jsonString);

   // Fetch the value for certain fields.
   String version = messageJson.getString("version");
   String packageName = messageJson.getString("packageName");

   // Process notification data based on your business requirements.
   // Process oneTimeProductNotification in the message.
   JSONObject oneTimeProductNotificationJson =
       messageJson.getJSONObject("oneTimeProductNotification");
   if (oneTimeProductNotificationJson != null) {
     String purchaseToken = oneTimeProductNotificationJson.getString("purchaseToken");
     String sku = oneTimeProductNotificationJson.getString("sku");
     int notificationType = oneTimeProductNotificationJson.getInt("notificationType");

     if (notificationType == 1) {
       // ONE_TIME_PRODUCT_PURCHASED - A one-time product was successfully purchased by a user.
       // Verify that the purchaseToken value does not match any previous purchaseToken values in
       // your backend system to avoid duplicate processing.
       ......
       // Fetch the ProductPurchase from Purchases.products.get endpoint
       ProductPurchase productPurchase =
         AndroidPublisherHelper.executeProductPurchasesGet(packageName, sku, purchaseToken);
       if (productPurchase != null && productPurchase.getPurchaseState() == 0) {
         // The purchase is valid and in PURCHASED state.

         // The account Id set in the App when launching the billing flow.
         String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
         // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
         // system.
       ......
       }
     }
     // Process subscriptionNotification in the message.
     JSONObject subscriptionNotificationJson = messageJson.getJSONObject("subscriptionNotification");
     if (subscriptionNotificationJson != null) {
       ......
     }
     // Process other notification data in the message as needed.
     ......
   }

   // Acknowledge the message to avoid repeated delivery.
   consumer.ack();
 }

7. Memberi tahu Google bahwa pembelian telah diproses

Setelah memberikan hak, Anda harus memberi tahu Google bahwa pembelian telah diproses dengan memanggil titik endpoint purchases.products:consume atau purchases.products:acknowledge di Play Developer API dari server backend aman Anda untuk menggunakan produk habis pakai atau mengonfirmasi produk tidak habis pakai.

Di AndroidPublisherHelper, tambahkan metode berikut untuk memanggil purchases.products:consume atau purchases.products:acknowledge di Google Play Developer API.

 /* Consume the one-time product purchase by calling
  * Purchases.products.consume endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesConsume(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().consume(packageName, sku, purchaseToken).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while consuming a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly consumed in case of transient failures.
   }
 }

 /* Acknowledge the one-time product purchase by calling
  * Purchases.products.acknowledge endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesAcknowledge(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().acknowledge(packageName, sku, purchaseToken, new ProductPurchasesAcknowledgeRequest()).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while acknowledging a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly acknowledged in case of transient failures.
   }
 }

Di NotificationMessageReceiver, gunakan pembelian produk habis pakai atau konfirmasi pembelian produk tidak habis pakai setelah memberikan hak di server backend Anda.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   ......
       String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
       // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
       // system.
       ......
       // If the product is a consumable product, consume the purchase.
       AndroidPublisherHelper.executeProductPurchasesConsume(packageName, sku, purchaseToken);
       // Or if the product is a non-consumable product, acknowledge the purchase.
       // AndroidPublisherHelper.executeProductPurchasesAcknowledge(packageName, sku, purchaseToken);
  ......

 }

Konfirmasi diperlukan, karena notifikasi ini memberi tahu Google Play bahwa pengguna telah diberi hak atas pembelian. Anda harus mengonfirmasi pembelian segera setelah memberikan hak.

Bagus! Anda telah berhasil berintegrasi dengan Notifikasi developer real-time, sehingga memungkinkan pemrosesan pembelian yang andal seperti yang ditunjukkan dalam codelab ini. Sekarang, untuk memastikan semuanya berfungsi dengan sempurna, mari kita jelajahi Lab Layanan Penagihan Play, alat yang mudah digunakan dan dirancang untuk membantu menguji integrasi Layanan Penagihan Play Anda.

8. Menguji dengan Play Billing Lab

Untuk meluncurkan dengan percaya diri, Anda harus menguji integrasi selama pengembangan. Play Billing Lab adalah aplikasi Android gratis yang membantu developer menguji integrasi mereka dengan sistem penagihan Google Play, sehingga memberikan cara yang mudah dan nyaman bagi developer untuk menguji fitur Layanan Penagihan Play, melakukan integrasi lebih cepat, dan meluncurkan dengan keyakinan yang lebih tinggi.

Play Billing Lab menawarkan berbagai fitur pengujian untuk membantu menguji berbagai skenario, termasuk:

Kami terus menambahkan kemampuan pengujian baru ke aplikasi Play Billing Lab. Anda dapat mendownload dan menginstal Play Billing Lab dari Play Store, atau lihat Menguji integrasi Anda untuk mengetahui informasi selengkapnya tentang pengujian dengan Play Billing Lab.

Menggunakan Play Billing Lab untuk menguji BillingResponseCode

Menguji semua alur BillingResponseCode saat mengintegrasikan aplikasi dengan Library Layanan Penagihan Play adalah tantangan umum, karena Anda tidak memiliki banyak kontrol atas komunikasi antara Play Store dan backend Play. Fitur Simulator Respons di aplikasi Play Billing Lab memungkinkan Anda mengonfigurasi respons kode error untuk Play Billing Library guna menguji berbagai skenario error yang kompleks.

Misalnya, Anda menerapkan logika di aplikasi untuk menggunakan pembelian setelah aplikasi mendeteksi pembelian yang berhasil. Anda ingin menguji skenario bahwa aplikasi Anda gagal menggunakan pembelian karena kegagalan jaringan dan penerima RTDN di server backend Anda mengambil pesan dan menangani pembelian dengan benar. Anda dapat memanfaatkan Simulator Respons untuk menyimulasikan skenario pengujian. Berikut ini panduan langkah-langkah untuk melakukan pengujian dengan Simulator Respons Lab Layanan Penagihan Play.

Menguji dengan Simulator Respons

Saat menguji dengan Simulator Respons, aplikasi Anda akan berkomunikasi dengan Lab Layanan Penagihan Play untuk mendapatkan kode respons yang Anda konfigurasikan di Simulator Respons Lab Layanan Penagihan Play.

Mengaktifkan pengujian penggantian penagihan untuk Play Billing Library

Untuk mengaktifkan komunikasi antara Simulator Respons dan aplikasi Anda, Anda harus mengaktifkan pengujian penggantian penagihan untuk Library Layanan Penagihan Play terlebih dahulu dari dalam aplikasi. Untuk melakukannya, tambahkan tag metadata berikut ke file AndroidManifest.xml aplikasi Anda.

<manifest ... >
  <application ... >
    ...
     <meta-data
      android:name="com.google.android.play.largest_release_audience.NONPRODUCTION"
      android:value="" />
    <meta-data
      android:name="com.google.android.play.billingclient.enableBillingOverridesTesting"
      android:value="true" />
  </application>
</manifest>

Build aplikasi Anda dengan file AndroidManifest.xml yang telah diperbarui. Sekarang, aplikasi Anda siap untuk Simulator Respons Play Billing Lab.

Saat men-deploy aplikasi ke lingkungan produksi setelah pengujian, Anda harus menggunakan file AndroidManifest.xml terpisah yang tidak menyertakan tag metadata ini atau memastikan bahwa Anda telah menghapus tag ini dari file AndroidManifest.xml.

Simulasikan error Play Billing Library

Untuk menguji dengan simulasi error Play Billing Library, pertama-tama, konfigurasikan kode respons di aplikasi Lab Layanan Penagihan Play, lalu lakukan pengujian di aplikasi Anda.

Mengonfigurasi kode respons

  1. Login ke aplikasi Play Billing Lab dengan akun penguji lisensi untuk aplikasi Anda. Gambar berikut menampilkan Dasbor Play Billing Lab,termasuk kartu Simulator Respons.

Dasbor Play Billing Lab dengan Simulator Respons

  1. Klik Kelola pada kartu Simulator Respons untuk membuka layar Simulator Respons.
  2. Saat diminta, izinkan notifikasi dari Play Billing Lab untuk melihat status koneksi aplikasi Anda.
  3. Aktifkan tombol Simulasikan respons Play Billing Library, jika belum diaktifkan.

c841baa4c96bf306.png

  1. Pilih kode respons untuk API Play Billing Library yang ingin Anda uji. Untuk menyimulasikan error pembelian yang digunakan, pilih kode error untuk API consumeAsync. Pilihan Anda akan otomatis disimpan. Sekarang Simulator Respons siap mengirim kode respons yang dipilih ke aplikasi Anda.

Menguji aplikasi

Sekarang Anda dapat menguji aplikasi untuk memverifikasi apakah semuanya berfungsi seperti yang diharapkan dalam skenario error yang dikonfigurasi. Buka aplikasi Anda dan picu metode Play Billing Library API. Jika aplikasi Anda melakukan panggilan consumeAsync untuk menggunakan pembelian, aplikasi akan menerima kode error seperti yang baru saja Anda konfigurasi. Anda dapat memverifikasi apakah aplikasi berfungsi dengan benar berdasarkan kode error dan server backend memproses pembelian dengan benar.

Setelah selesai melakukan pengujian, cukup nonaktifkan tombol Simulasikan respons Play Billing Library untuk berhenti menyimulasikan respons.

Pelajari lebih lanjut pengujian dengan Play Billing Lab, atau buka Pusat Bantuan untuk mengetahui informasi selengkapnya tentang menguji penagihan dalam aplikasi dengan Penguji Lisensi.

9. Selamat!

Anda telah menyelesaikan codelab ini dan kini siap untuk mengoptimalkan monetisasi aplikasi secara strategis guna meningkatkan pengalaman pengguna untuk mendorong peningkatan kepuasan pengguna, konversi pembelian, dan churn pelanggan.

Dengan memanfaatkan Notifikasi Developer Real-time dan aplikasi pendamping Play Billing Lab, Anda dapat secara proaktif menangani peristiwa siklus proses pembelian untuk pembelian satu kali dan langganan.

Dengan alat ini, Anda dapat menerapkan strategi perolehan kembali yang menarik secara efektif, menyelesaikan tantangan integrasi dengan cepat, dan pada akhirnya meningkatkan pengalaman pengguna dan sumber pendapatan untuk meluncurkan aplikasi atau game dengan percaya diri.

Dengan menyelesaikan codelab ini, Anda kini memiliki keterampilan untuk mengelola seluruh perjalanan pembelian dan menguji penerapan Anda dengan Play Billing Lab secara menyeluruh, sehingga memastikan pengalaman pengguna yang lancar dan memaksimalkan potensi monetisasi Anda di Google Play.