Beberapa opsi pembelian dan penawaran untuk produk sekali beli

Dokumen ini menjelaskan secara mendetail integrasi produk sekali beli (OTPs) Anda dengan Play Billing Library. Dokumen ini juga menjelaskan cara mengintegrasikan berbagai opsi pembelian dan penawaran terkait produk sekali beli Anda.

Anda dapat mengonfigurasi beberapa opsi pembelian dan penawaran untuk produk sekali beli Anda. Misalnya, Anda dapat mengonfigurasi opsi pembelian beli dan penawaran praorder untuk produk sekali beli yang sama.

Prasyarat

Untuk mengonfigurasi beberapa penawaran untuk produk sekali beli, Anda harus menggunakan queryProductDetailsAsync() API. querySkuDetailsAsync() API yang tidak digunakan lagi tidak didukung. Untuk mengetahui informasi tentang cara menggunakan queryProductDetailsAsync() dan versi launchBillingFlow() yang menggunakan ProductDetailsParams sebagai input, lihat langkah-langkah migrasi.

Mengirim kueri detail produk

Jika Anda telah mengonfigurasi beberapa penawaran atau opsi pembelian untuk produk sekali beli, objek ProductDetails yang ditampilkan oleh metode queryProductDetailsAsync() dapat memiliki lebih dari satu opsi pembelian beli dan (atau) sewa yang tersedia per produk sekali beli. Untuk mendapatkan daftar semua penawaran yang memenuhi syarat untuk setiap ProductDetails objek, gunakan metode getOneTimePurchaseOfferDetailsList(). Hanya penawaran dan opsi pembelian yang memenuhi syarat bagi pengguna yang akan ditampilkan sebagai bagian dari daftar ini. Kode Anda dalam metode onProductDetailsResponse() harus menangani penawaran yang ditampilkan.

Meluncurkan alur penagihan

Untuk memulai permintaan pembelian dari aplikasi Anda, panggil launchBillingFlow() metode dari thread utama aplikasi Anda. Metode ini mengambil referensi ke objek BillingFlowParams yang berisi objek ProductDetails yang relevan dan diperoleh dari panggilan queryProductDetailsAsync(). Untuk membuat objek BillingFlowParams, gunakan classBillingFlowParams.Builder. Perhatikan bahwa Anda harus menetapkan token penawaran yang sesuai dengan penawaran yang dipilih oleh pengguna saat membuat objek BillingFlowParams.

Contoh berikut menunjukkan cara meluncurkan alur pembelian untuk produk sekali beli dengan beberapa penawaran:

Java

    
// An activity reference from which the billing flow will launch.
Activity activity = ...;
ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
    
    

offerToken dapat ditemukan sebagai bagian dari OneTimePurchaseOfferDetails. Saat Anda menampilkan penawaran kepada pengguna, pastikan Anda mengonfigurasi parameter alur penagihan dengan token penawaran yang benar, yang dapat Anda peroleh dari metode oneTimePurchaseOfferDetails.getOfferToken().

Penawaran dan opsi pembelian

Opsi pembelian memungkinkan Anda menentukan cara pemberian hak kepada pengguna, harganya, dan di wilayah mana produk tersedia. Satu produk dapat memiliki beberapa opsi pembelian, yang dapat menunjukkan tempat dan cara Anda menjual produk.

Google Play mendukung opsi pembelian berikut untuk produk sekali beli:

  • Opsi pembelian beli
  • Opsi pembelian sewa

Penawaran mengacu pada skema harga yang dapat Anda buat untuk produk sekali beli Anda. Misalnya, Anda dapat membuat penawaran diskon untuk produk sekali beli Anda.

Google Play mendukung penawaran pembelian berikut untuk produk sekali beli:

  • Penawaran praorder (hanya didukung untuk opsi pembelian beli)
  • Penawaran diskon (didukung untuk opsi pembelian beli dan sewa)

Opsi pembelian beli

Opsi pembelian beli mewakili pembelian standar dan langsung produk sekali beli. Opsi ini memiliki kolom legacyCompatible opsional, yang menunjukkan apakah opsi pembelian ini akan tersedia dalam alur Play Billing Library lama (versi 7 atau yang lebih lama) yang tidak mendukung model baru. Untuk kompatibilitas mundur, setidaknya satu opsi pembelian harus ditandai sebagai kompatibel dengan versi sebelumnya.

Langkah-langkah untuk mengintegrasikan opsi pembelian beli dan sewa dengan PBL sama. Untuk memahami cara mengintegrasikan opsi pembelian beli dengan PBL, lihat Mengintegrasikan opsi pembelian sewa dengan PBL.

Opsi pembelian sewa

Opsi pembelian sewa memungkinkan pengguna mengakses produk sekali beli selama jangka waktu tertentu. Anda dapat menentukan periode sewa dan masa berlakunya. Dokumen ini menjelaskan langkah-langkah untuk mengintegrasikan opsi pembelian sewa dengan Play Billing Library (PBL).

Mengintegrasikan opsi pembelian sewa dengan PBL

Bagian ini menjelaskan cara mengintegrasikan opsi pembelian sewa dengan Play Billing Library (PBL). Bagian ini mengasumsikan bahwa Anda memahami langkah-langkah integrasi PBL awal seperti, menambahkan dependensi PBL ke aplikasi Anda, melakukan inisialisasi BillingClient, dan menghubungkan ke Google Play. Bagian ini berfokus pada aspek integrasi PBL yang khusus untuk opsi pembelian sewa.

Untuk mengonfigurasi produk yang tersedia untuk disewa, Anda harus menggunakan layanan monetization.onetimeproducts baru dari Play Developer API atau UI Konsol Play. Untuk menggunakan layanan ini, Anda dapat memanggil REST API secara langsung, atau menggunakan library klien Java.

Meluncurkan alur pembelian untuk opsi sewa

Untuk meluncurkan alur pembelian untuk penawaran sewa, lakukan langkah-langkah berikut:

  1. Ambil metadata opsi pembelian sewa menggunakan metode ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Contoh berikut menunjukkan cara mendapatkan metadata pembelian sewa:

    Java

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a rent purchase option.
            if (oneTimePurchaseOfferDetails.getRentalDetails() != null) {
              // process the returned RentalDetails
              OneTimePurchaseOfferDetails.RentalDetails rentalDetails =
                  oneTimePurchaseOfferDetails.getRentalDetails();
              // Get rental period in ISO 8601 format.
              String rentalPeriod = rentalDetails.getRentalPeriod();
              // Get rental expiration period in ISO 8601 format, if present.
              if (rentalDetails.getRentalExpirationPeriod() != null) {
                String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod();
              }
              // Get offer token
                String offerToken = oneTimePurchaseOfferDetails.getOfferToken();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });
  2. Luncurkan alur penagihan.

    Untuk memulai permintaan pembelian dari aplikasi Anda, panggil metode launchBillingFlow() dari thread utama aplikasi Anda. Metode ini mengambil referensi ke objek BillingFlowParams yang berisi objek ProductDetails yang relevan dan diperoleh dari panggilan queryProductDetailsAsync(). Untuk membuat BillingFlowParams objek, gunakan class BillingFlowParams.Builder. Perhatikan bahwa Anda harus menetapkan token penawaran yang sesuai dengan penawaran yang dipilih oleh pengguna saat membuat objek BillingFlowParams. Jika pengguna memenuhi syarat untuk opsi pembelian sewa, mereka akan menerima penawaran dengan RentalDetails dan offerId di queryProductDetailsAsync().

    Contoh berikut menunjukkan cara meluncurkan alur penagihan:

    Kotlin

    // An activity reference from which the billing flow will be launched.
    val activity : Activity = ...
    
    val productDetailsParamsList = listOf(
        BillingFlowParams.ProductDetailsParams.newBuilder()
            // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // Get the offer token:
            // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
            // for a list of offers that are available to the user.
            // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails()
            // for a list of offers that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    )
    
    val billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build()
    
    // Launch the billing flow
    val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

    Java

    // An activity reference from which the billing flow will be launched.
    Activity activity = ...;
    
    ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            BillingFlowParams.ProductDetailsParams.newBuilder()
                 // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
                .setProductDetails(productDetails)
                // Get the offer token:
                // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
                // for a list of offers that are available to the user.
                // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails()
                // for a list of offers that are available to the user.
                .setOfferToken(selectedOfferToken)
                .build()
        );
    
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build();
    
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken dapat ditemukan sebagai bagian dari OneTimePurchaseOfferDetails. Saat Anda menampilkan penawaran kepada pengguna, pastikan Anda mengonfigurasi parameter alur penagihan dengan token penawaran yang benar, yang dapat Anda peroleh dari metode oneTimePurchaseOfferDetails.getOfferToken().

Penawaran praorder

Praorder memungkinkan Anda menyiapkan produk sekali beli untuk dibeli sebelum item dirilis. Saat pengguna melakukan praorder produk Anda, mereka setuju untuk membayar item saat produk dirilis, kecuali jika pengguna membatalkan praorder sebelum tanggal rilis. Pada tanggal rilis, pembeli akan ditagih dan Google Play akan memberi tahu mereka melalui email bahwa item telah dirilis.

Dokumen ini menjelaskan langkah-langkah untuk mengintegrasikan penawaran pembelian praorder dengan Play Billing Library (PBL).

Mengintegrasikan penawaran praorder dengan PBL

Bagian ini menjelaskan cara mengintegrasikan penawaran praorder dengan Play Billing Library (PBL). Bagian ini mengasumsikan bahwa Anda memahami langkah-langkah integrasi PBL awal seperti, menambahkan dependensi PBL ke aplikasi Anda, melakukan inisialisasi BillingClient, dan menghubungkan ke Google Play. Bagian ini berfokus pada aspek integrasi PBL yang khusus untuk penawaran praorder.

Meluncurkan alur pembelian untuk penawaran praorder

Untuk meluncurkan alur pembelian untuk penawaran praorder, lakukan langkah-langkah berikut:

  1. Ambil metadata penawaran praorder menggunakan metode ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). Contoh berikut menunjukkan cara mendapatkan metadata penawaran praorder:

    Java

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a preorder offer.
            if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) {
              // process the returned PreorderDetails
              OneTimePurchaseOfferDetails.PreorderDetails preorderDetails =
                  oneTimePurchaseOfferDetails.getPreorderDetails();
              // Get preorder release time in millis.
              long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis();
              // Get preorder presale end time in millis.
              long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis();
              // Get offer ID
                String offerId = oneTimePurchaseOfferDetails.getOfferId();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });

  2. Luncurkan alur penagihan.

    Untuk memulai permintaan pembelian dari aplikasi Anda, panggil metode launchBillingFlow() dari thread utama aplikasi Anda. Metode ini mengambil referensi ke objek BillingFlowParams yang berisi objek ProductDetails yang relevan dan diperoleh dari panggilan queryProductDetailsAsync(). Untuk membuat objek BillingFlowParams, gunakan the BillingFlowParams.Builder class. Perhatikan bahwa Anda harus menetapkan token penawaran yang sesuai dengan penawaran yang dipilih oleh pengguna saat membuat objek.BillingFlowParams Jika pengguna memenuhi syarat untuk penawaran praorder, mereka akan menerima penawaran dengan PreorderDetails dan offerId di metode queryProductDetailsAsync().

    Contoh berikut menunjukkan cara meluncurkan alur penagihan:

    Java

    // An activity reference from which the billing flow will launch.
    Activity activity = ...;
    ImmutableList productDetailsParamsList =
        ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken dapat ditemukan sebagai bagian dari OneTimePurchaseOfferDetails. Saat Anda menampilkan penawaran kepada pengguna, pastikan Anda mengonfigurasi parameter alur penagihan dengan token penawaran yang benar, yang dapat Anda peroleh dari metode oneTimePurchaseOfferDetails.getOfferToken().

Penawaran diskon

Bagian ini menjelaskan cara mengonfigurasi penawaran diskon untuk produk sekali beli Anda.

Ada empat parameter berbeda yang dapat Anda konfigurasi dalam penawaran diskon produk sekali beli:

  • Harga penawaran diskon: Menentukan detail tentang persentase diskon atau harga absolut dari harga asli.

  • Kelayakan Negara atau Wilayah: Menentukan ketersediaan penawaran produk sekali beli di negara atau wilayah.

  • Batas pembelian (opsional): Memungkinkan Anda menentukan berapa kali pengguna dapat menukarkan penawaran yang sama. Jika pengguna melebihi batas pembelian, pengguna tidak akan memenuhi syarat untuk penawaran tersebut.

  • Waktu terbatas (opsional): Menentukan jangka waktu penawaran tersedia. Di luar jangka waktu tersebut, penawaran tidak memenuhi syarat untuk pembelian.

Mengambil informasi harga penawaran diskon

Untuk penawaran diskon, Anda dapat mengambil persentase diskon atau diskon mutlak yang ditawarkan.

Contoh 1: Mengambil persentase diskon penawaran diskon

Contoh berikut menunjukkan cara mendapatkan harga penuh asli penawaran diskon dan persentase diskonnya. Perhatikan bahwa informasi persentase diskon hanya ditampilkan untuk penawaran diskon.

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult){
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and percentageDiscount.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long percentageDiscount =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getPercentageDiscount();
            }
            // …
          }
        }
      }
    });
    
Contoh 2: Mengambil diskon mutlak penawaran diskon

Contoh berikut menunjukkan cara mendapatkan harga penuh asli penawaran diskon dan diskon absolutnya dalam mikro. Perhatikan bahwa informasi diskon absolut dalam mikro hanya ditampilkan untuk penawaran diskon. Diskon absolut atau persentase diskon harus ditentukan untuk penawaran diskon.

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and absolute DiscountAmountMicros.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long discountAmountMicros =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getDiscountAmount()
                      .getDiscountAmountMicros();
            }
            // …
          }
        }
      }
    });
    

Mendapatkan jangka waktu penawaran yang valid

Anda dapat menggunakan metode OneTimePurchaseOfferDetails.getValidTimeWindow() untuk mendapatkan jangka waktu penawaran yang valid. Objek ini berisi waktu mulai dan waktu berakhir jangka waktu dalam milidetik.

Contoh berikut menunjukkan cara mendapatkan jangka waktu penawaran yang valid:

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) {
              // process the returned startTimeMillis and endTimeMillis.
              ValidTimeWindow validTimeWindow =
                  oneTimePurchaseOfferDetails.getValidTimeWindow();
              long startTimeMillis = validTimeWindow.getStartTimeMillis();
              long endTimeMillis = validTimeWindow.getEndTimeMillis();
              // …
            }
          }
        }
      }
    });
    

Jumlah terbatas di tingkat penawaran diskon

Anda dapat menentukan batas jumlah maksimum di tingkat penawaran diskon, yang hanya diterapkan di tingkat penawaran. Berikut contoh untuk mengilustrasikan:

  1. Super screensavers memiliki 2 penawaran untuk produk screensaver: screensaver opsi pembelian dan screensaver diskon.
    1. Screensaver opsi pembelian tidak memiliki jumlah terbatas yang disiapkan.
    2. Screensaver diskon memiliki jumlah maksimum yang diizinkan di tingkat penawaran yang ditetapkan ke 3.
  2. Produk screensaver tidak memiliki jumlah maksimum yang diizinkan di tingkat produk, sehingga pengguna dapat membeli produk ini dalam jumlah tidak terbatas.
  3. Pengguna memiliki 1 screensaver diskon, dan mereka berencana membeli satu lagi dengan screensaver diskon.
  4. Saat mengambil penawaran yang tersedia, LimitedQuantityInfo untuk screensaver opsi pembelian adalah null dan nilai jumlah yang tersisa untuk screensaver diskon adalah 2.

Contoh berikut menunjukkan cara mendapatkan jumlah terbatas di tingkat penawaran diskon:

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) {
              // process the returned maximumQuantity and remainingQuantity.
              LimitedQuantityInfo limitedQuantityInfo =
                  oneTimePurchaseOfferDetails.getLimitedQuantityInfo();
              int maximumQuantity = limitedQuantityInfo.getMaximumQuantity();
              int remainingQuantity = limitedQuantityInfo.getRemainingQuantity();
              // …
            }
          }
        }
      }
    });
    

Saat pengguna menggunakan penukaran jumlah maksimum untuk penawaran, penawaran tersebut tidak akan ditampilkan oleh metode getOneTimePurchaseOfferDetailsList().

Menghitung batas penukaran

Contoh berikut menunjukkan cara mendapatkan informasi jumlah terbatas pada penawaran diskon tertentu. Anda dapat memperoleh jumlah maksimum yang diizinkan dan jumlah yang tersisa untuk pengguna saat ini. Perhatikan bahwa fitur jumlah terbatas berlaku untuk penawaran produk sekali beli yang dapat digunakan dan tidak dapat digunakan. Fitur ini hanya didukung di tingkat penawaran.

Google Play menghitung jumlah yang tersisa dengan mengurangi jumlah yang dimiliki pengguna dari jumlah maksimum yang diizinkan yang telah Anda siapkan. Saat menghitung jumlah yang dimiliki pengguna, Google Play mempertimbangkan pembelian yang digunakan atau pembelian yang tertunda. Pembelian yang dibatalkan, dikembalikan dananya, atau ditagih balik tidak dihitung dalam jumlah yang dimiliki pengguna. Contoh:

  1. Super screensavers menyiapkan penawaran diskon dengan jumlah maksimum yang diizinkan adalah satu, sehingga pengguna dapat membeli hingga satu screensaver diskon.

  2. Pengguna membeli salah satu screensaver diskon. Jika pengguna kemudian mencoba membeli screensaver diskon kedua, error akan terjadi dan PurchasesUpdatedListener akan mendapatkan kode respons ITEM_UNAVAILABLE.

  3. Pengguna meminta pengembalian dana untuk screensaver diskon yang awalnya dibeli, dan berhasil menerima pengembalian dana. Pengguna mencoba membeli salah satu screensaver diskon, dan pembelian akan berhasil.

Kelayakan negara dan wilayah

Anda dapat memilih negara atau wilayah tempat penawaran opsi pembelian atau penawaran diskon akan tersedia bagi pengguna. Google Play akan mengevaluasi kelayakan pengguna berdasarkan negara Play. Saat Anda mengonfigurasi ketersediaan regional untuk penawaran, penawaran tersebut hanya akan ditampilkan sebagai bagian dari getOneTimePurchaseOfferDetailsList() jika pengguna berada di negara atau wilayah target. Jika tidak, penawaran tersebut tidak akan menjadi bagian dari daftar penawaran yang ditampilkan saat Anda memanggil queryProductDetailsAsync().

Tag penawaran

Contoh berikut menunjukkan cara mengambil tag penawaran yang terkait dengan penawaran.

Java

    
billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // process the returned offer tags.
            ImmutableList<String> offerTags =
                oneTimePurchaseOfferDetails.getOfferTagsList();
            // …
          }
        }
      }
    });
    
    

Pewarisan tag penawaran

Anda dapat menetapkan tag penawaran untuk produk, opsi pembelian, atau penawaran diskon. Penawaran diskon mewarisi tag penawaran dari penawaran opsi pembeliannya. Demikian pula, jika tag penawaran ditentukan di tingkat produk, penawaran opsi pembelian dan penawaran diskon akan mewarisi tag penawaran produk.

Misalnya, Super screensavers memiliki dua penawaran untuk produk screensaver; screensaver opsi pembelian dan screensaver diskon.

  • Super screensaver memiliki tag penawaran produk SSProductTag.
  • Screensaver opsi pembelian memiliki tag penawaran SSPurchaseOptionTag.
  • Screensaver diskon memiliki tag penawaran SSDiscountOfferTag.

Dalam contoh ini, metode oneTimePurchaseOfferDetails.getOfferTagsList() untuk penawaran opsi pembelian menampilkan SSProductTag dan SSPurchaseOptionTag. Untuk penawaran diskon, metode ini menampilkan SSProductTag, SSPurchaseOptionTag, dan SSDiscountOfferTag.