Tek seferlik ürünler için birden fazla satın alma seçeneği ve fırsat

Bu belgede, tek seferlik ürünlerinizin (OTP'ler) Play Faturalandırma Kitaplığı ile entegrasyonu ayrıntılı olarak açıklanmaktadır. Ayrıca, tek seferlik ürünlerinizle ilgili çeşitli satın alma seçeneklerini ve teklifleri nasıl entegre edeceğiniz de açıklanmaktadır.

Tek seferlik ürünleriniz için birden fazla satın alma seçeneği ve fırsat yapılandırabilirsiniz. Örneğin, aynı tek seferlik ürün için satın alma seçeneği ve ön sipariş fırsatı yapılandırabilirsiniz.

Ön koşullar

Tek seferlik ürünler için birden fazla fırsat yapılandırmak istiyorsanız queryProductDetailsAsync() API'yi kullanmanız gerekir. Kullanımdan kaldırılan querySkuDetailsAsync() API'si desteklenmiyor. queryProductDetailsAsync() ve ProductDetailsParams girişini alan launchBillingFlow() sürümünü kullanma hakkında bilgi edinmek için taşıma adımları başlıklı makaleyi inceleyin.

Ürün ayrıntılarını sorgulama

Tek seferlik ürününüz için birden fazla fırsat veya satın alma seçeneği yapılandırdıysanız queryProductDetailsAsync() yöntemi tarafından döndürülen ProductDetails nesnesi, tek seferlik ürün başına birden fazla satın alma ve (veya) kiralama seçeneği içerebilir. Her ProductDetails nesnesi için uygun tüm tekliflerin listesini almak üzere getOneTimePurchaseOfferDetailsList() yöntemini kullanın. Bu liste kapsamında yalnızca kullanıcının uygun olduğu teklifler ve satın alma seçenekleri döndürülür. onProductDetailsResponse() yöntemindeki kodunuz, döndürülen teklifleri işlemelidir.

Faturalandırma akışını başlatma

Uygulamanızdan satın alma isteği başlatmak için uygulamanızın ana iş parçacığından launchBillingFlow() yöntemini çağırın. Bu yöntem, queryProductDetailsAsync() çağrısından elde edilen ilgili ProductDetails nesnesini içeren bir BillingFlowParams nesnesine referans alır. BillingFlowParams nesnesi oluşturmak için BillingFlowParams.Builder sınıfını kullanın. BillingFlowParams nesnesini oluştururken kullanıcı tarafından seçilen teklife karşılık gelen teklif jetonunu ayarlamanız gerektiğini unutmayın.

Aşağıdaki örnekte, birden fazla teklif içeren tek seferlik bir ürün için satın alma akışının nasıl başlatılacağı gösterilmektedir:

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, OneTimePurchaseOfferDetails kapsamında bulunabilir. Teklifi kullanıcıya gösterdiğinizde, faturalandırma akışı parametrelerini oneTimePurchaseOfferDetails.getOfferToken() yönteminden alabileceğiniz doğru teklif jetonuyla yapılandırdığınızdan emin olun.

Satın alma seçenekleri ve teklifler

Satın alma seçeneği, yetkilerin kullanıcıya nasıl verileceğini, fiyatını ve ürünün hangi bölgede erişilebilir olacağını tanımlamanıza olanak tanır. Tek bir ürünün birden fazla satın alma seçeneği olabilir. Bu seçenekler, ürününüzü nerede ve nasıl sattığınızı gösterebilir.

Google Play, tek seferlik ürünler için aşağıdaki satın alma seçeneklerini destekler:

  • Satın alma seçeneği
  • Kiralama seçeneği

Fırsatlar, tek seferlik ürünleriniz için oluşturabileceğiniz bir fiyatlandırma planını ifade eder. Örneğin, tek seferlik ürününüz için indirim fırsatı oluşturabilirsiniz.

Google Play, tek seferlik ürünler için aşağıdaki satın alma tekliflerini destekler:

  • Ön sipariş fırsatı (yalnızca satın alma seçeneği için desteklenir)
  • İndirim fırsatı (hem satın alma hem de kiralama seçenekleri için desteklenir)

Satın alma seçeneği

Satın alma seçeneği, tek seferlik ürünün standart ve doğrudan satın alma işlemini ifade eder. Bu satın alma seçeneğinin, yeni modeli desteklemeyen eski Play Faturalandırma Kitaplığı (7. sürüm veya daha eski) akışlarında kullanılabilir olup olmadığını belirten isteğe bağlı bir legacyCompatible alanı vardır. Geriye dönük uyumluluk için en az bir satın alma seçeneği eski sürümle uyumlu olarak işaretlenmelidir.

Hem satın alma hem de kiralama satın alma seçeneklerini PBL ile entegre etme adımları aynıdır. Satın alma seçeneğini PBL ile nasıl entegre edeceğinizi öğrenmek için Kiralama satın alma seçeneğini PBL ile entegre etme başlıklı makaleyi inceleyin.

Kiralama seçeneği

Kiralama satın alma seçeneği, kullanıcıların tek seferlik ürünlere belirli bir süre boyunca erişmesine olanak tanır. Kiralama süresini ve son kullanma tarihini belirtebilirsiniz. Bu belgede, kiralama satın alma seçeneğini Play Faturalandırma Kitaplığı (PBL) ile entegre etme adımları açıklanmaktadır.

Kiralama seçeneğini PBL ile entegre etme

Bu bölümde, kiralama satın alma seçeneğinin Play Faturalandırma Kitaplığı (PBL) ile nasıl entegre edileceği açıklanmaktadır. Bu dokümanda, PBL bağımlılığını uygulamanıza ekleme, BillingClient'ı başlatma ve Google Play'e bağlanma gibi ilk PBL entegrasyonu adımlarını bildiğiniz varsayılır. Bu bölümde, PBL entegrasyonunun kiralama/satın alma seçeneğine özgü yönleri ele alınmaktadır.

Kiralanabilen ürünleri yapılandırmak için Play Developer API'nin yeni monetization.onetimeproducts hizmetini veya Play Developer Console kullanıcı arayüzünü kullanmanız gerekir. Hizmeti kullanmak için REST API'yi doğrudan çağırabilir veya Java istemci kitaplığını kullanabilirsiniz.

Kiralama seçeneği için satın alma akışı başlatma

Kiralama teklifi için satın alma sürecini başlatmak üzere aşağıdaki adımları uygulayın:

  1. ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() yöntemini kullanarak kiralama satın alma seçeneği meta verilerini getirin.

    Aşağıdaki örnekte, kiralama satın alma meta verilerinin nasıl alınacağı gösterilmektedir:

    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. Faturalandırma akışını başlatın.

    Uygulamanızdan satın alma isteği başlatmak için uygulamanızın ana iş parçacığından launchBillingFlow() yöntemini çağırın. Bu yöntem, queryProductDetailsAsync() çağrısından elde edilen ilgili ProductDetails nesneyi içeren bir BillingFlowParams nesnesine referans alır. BillingFlowParams nesnesi oluşturmak için BillingFlowParams.Builder sınıfını kullanın. BillingFlowParams nesnesini oluştururken kullanıcının seçtiği teklife karşılık gelen teklif jetonunu ayarlamanız gerektiğini unutmayın. Kiralama satın alma seçeneğine uygun olan kullanıcılar, queryProductDetailsAsync() içinde RentalDetails ve offerId içeren bir teklif alır.

    Aşağıdaki örnekte faturalandırma akışının nasıl başlatılacağı gösterilmektedir:

    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.subscriptionOfferDetails()
            // 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<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            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.subscriptionOfferDetails()
                // 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, OneTimePurchaseOfferDetails kapsamında bulunabilir. Teklifi kullanıcıya gösterdiğinizde, faturalandırma akışı parametrelerini oneTimePurchaseOfferDetails.getOfferToken() yönteminden alabileceğiniz doğru teklif jetonuyla yapılandırdığınızdan emin olun.

Ön sipariş fırsatı

Ön sipariş, yayınlanmadan önce satın alınabilecek tek seferlik ürünler oluşturmanıza olanak tanır. Bir kullanıcı ürününüze ön sipariş verdiğinde, ürünün yayın tarihinden önce ön siparişi iptal etmediği sürece ürün yayınlandığında öğenin ödemesini yapmayı kabul eder. Yayın tarihinde alıcıdan ödeme alınır ve Google Play, öğenin yayınlandığını e-postayla bildirir.

Bu belgede, ön sipariş satın alma teklifini Play Faturalandırma Kitaplığı (PBL) ile entegre etme adımları açıklanmaktadır.

Ön sipariş fırsatını PBL ile entegre etme

Bu bölümde, ön sipariş fırsatının Play Faturalandırma Kitaplığı (PBL) ile nasıl entegre edileceği açıklanmaktadır. Bu dokümanda, PBL bağımlılığını uygulamanıza ekleme, BillingClient'ı başlatma ve Google Play'e bağlanma gibi ilk PBL entegrasyonu adımlarını bildiğiniz varsayılır. Bu bölümde, ön sipariş teklifine özgü PBL entegrasyonuyla ilgili konulara odaklanılmaktadır.

Ön sipariş fırsatı için satın alma süreci başlatma

Ön sipariş fırsatı için satın alma süreci başlatmak üzere aşağıdaki adımları uygulayın:

  1. ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() yöntemini kullanarak ön sipariş teklifi meta verilerini getirin. Aşağıdaki örnekte, ön sipariş fırsatı meta verilerinin nasıl alınacağı gösterilmektedir:

    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. Faturalandırma akışını başlatın.

    Uygulamanızdan satın alma isteği başlatmak için uygulamanızın ana iş parçacığından launchBillingFlow() yöntemini çağırın. Bu yöntem, queryProductDetailsAsync() çağrısından elde edilen ilgili ProductDetails nesnesini içeren bir BillingFlowParams nesnesine referans alır. BillingFlowParams nesnesi oluşturmak için BillingFlowParams.Builder class kullanın. BillingFlowParams nesnesi oluşturulurken kullanıcı tarafından seçilen teklife karşılık gelen teklif jetonunu ayarlamanız gerektiğini unutmayın. Ön sipariş teklifinden yararlanmaya uygun olan kullanıcılar, queryProductDetailsAsync() yönteminde PreorderDetails ve offerId içeren bir teklif alır.

    Aşağıdaki örnekte faturalandırma akışının nasıl başlatılacağı gösterilmektedir:

    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, OneTimePurchaseOfferDetails kapsamında bulunabilir. Teklifi kullanıcıya gösterdiğinizde, faturalandırma akışı parametrelerini oneTimePurchaseOfferDetails.getOfferToken() yönteminden alabileceğiniz doğru teklif jetonuyla yapılandırdığınızdan emin olun.

İndirim fırsatı

Bu bölümde, tek seferlik ürünleriniz için indirim tekliflerini nasıl yapılandırabileceğiniz açıklanmaktadır.

Tek seferlik ürün indirim teklifinde yapılandırabileceğiniz dört farklı parametre vardır:

  • İndirimli teklif fiyatı: Orijinal fiyattan düşülen yüzde indirim veya mutlak fiyat indirimiyle ilgili ayrıntıları belirtir.

  • Ülke veya bölge uygunluğu: Tek seferlik ürün tekliflerinin bir ülkede veya bölgede kullanılabilirliğini belirtir.

  • Satın alma sınırı (isteğe bağlı): Bir kullanıcının aynı tekliften kaç kez yararlanabileceğini belirlemenizi sağlar. Satın alma sınırını aşan kullanıcılar tekliften yararlanamaz.

  • Sınırlı süre (isteğe bağlı): Teklifin geçerli olduğu süreyi belirtir. Teklif, belirtilen süre dışında satın alınamaz.

İndirimli teklif fiyatı bilgilerini alma

İndirimli bir teklif için indirim yüzdesini veya sunulan mutlak indirimi alabilirsiniz.

1. örnek: İndirimli teklifin indirim yüzdesini alma

Aşağıdaki örnekte, indirimli teklifin orijinal tam fiyatının ve indirim yüzdesinin nasıl alınacağı gösterilmektedir. Yüzde indirim bilgisinin yalnızca indirimli teklifler için döndürüldüğünü unutmayın.

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();
            }
            // …
          }
        }
      }
    });
    
2. örnek: İndirimli teklifin net indirimini alma

Aşağıdaki örnekte, indirimli teklifin orijinal tam fiyatının ve mikrolardaki mutlak indiriminin nasıl alınacağı gösterilmektedir. Mikro cinsinden mutlak indirim bilgisinin yalnızca indirimli teklifler için döndürüldüğünü unutmayın. İndirim teklifi için mutlak indirim veya yüzdelik indirim belirtilmelidir.

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();
            }
            // …
          }
        }
      }
    });
    

Bir teklifin geçerli zaman aralığını alma

Bir teklifin geçerli zaman aralığını almak için OneTimePurchaseOfferDetails.getValidTimeWindow() yöntemini kullanabilirsiniz. Bu nesne, milisaniye cinsinden zaman aralığı başlangıç ve bitiş zamanını içerir.

Aşağıdaki örnekte, bir teklifin geçerli zaman aralığının nasıl alınacağı gösterilmektedir:

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();
              // …
            }
          }
        }
      }
    });
    

İndirimli teklif düzeyinde sınırlı miktar

Maksimum miktar sınırını indirim teklifi düzeyinde belirleyebilirsiniz. Bu sınır yalnızca teklif düzeyinde uygulanır. Aşağıda açıklayıcı bir örnek verilmiştir:

  1. Süper ekran koruyucular, ekran koruyucu ürünü için 2 teklif sunar: satın alma seçeneği ekran koruyucu ve indirimli ekran koruyucu.
    1. Satın alma seçeneği ekran koruyucusunda sınırlı miktar ayarlanmamış.
    2. İndirimli ekran koruyucunun teklif düzeyinde izin verilen maksimum miktarı 3 olarak ayarlanmış.
  2. Ekran koruyucu üründe ürün düzeyinde izin verilen maksimum miktar sınırı yoktur. Bu nedenle kullanıcılar bu üründen sınırsız miktarda satın alabilir.
  3. Kullanıcının 1 indirimli ekran koruyucusu var ve indirimli ekran koruyucusuyla başka bir ekran koruyucu satın almayı planlıyor.
  4. Mevcut teklifler alınırken satın alma seçeneği ekran koruyucusu için LimitedQuantityInfo değeri null, indirimli ekran koruyucusu için kalan miktar değeri ise 2'dir.

Aşağıdaki örnekte, sınırlı miktarın indirimli teklif düzeyinde nasıl alınacağı gösterilmektedir:

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();
              // …
            }
          }
        }
      }
    });
    

Kullanıcılar bir teklif için maksimum kullanım sayısına ulaştığında teklif, getOneTimePurchaseOfferDetailsList() yöntemiyle döndürülmez.

Kullanım sınırını hesaplama

Aşağıdaki örnekte, belirli bir indirim teklifindeki sınırlı miktar bilgisinin nasıl alınacağı gösterilmektedir. İzin verilen maksimum miktarı ve mevcut kullanıcının kalan miktarını alabilirsiniz. Sınırlı sayıda özelliği hem tüketilebilir hem de tüketilemeyen tek seferlik ürün teklifleri için geçerlidir. Bu özellik yalnızca teklif düzeyinde desteklenir.

Google Play, kullanıcının sahip olduğu miktarı ayarladığınız izin verilen maksimum miktardan çıkararak kalan miktarı hesaplar. Google Play, kullanıcının sahip olduğu miktarı sayarken tüketilen veya bekleyen satın alma işlemlerini dikkate alır. İptal edilen, geri ödenen veya ters ibraz edilen satın alma işlemleri, kullanıcının sahip olduğu miktar olarak sayılmaz. Örneğin:

  1. Süper ekran koruyucular, izin verilen maksimum miktar olan bir adet indirimli ekran koruyucu teklifi oluşturur. Böylece kullanıcılar en fazla bir indirimli ekran koruyucu satın alabilir.

  2. Kullanıcı, indirimli ekran koruyuculardan birini satın alır. Kullanıcı daha sonra indirimli ikinci ekran koruyucuyu satın almaya çalışırsa hata oluşur ve PurchasesUpdatedListener, ITEM_UNAVAILABLE yanıt kodunu alır.

  3. Kullanıcı, ilk satın aldığı indirimli ekran koruyucu için geri ödeme isteğinde bulunuyor ve geri ödeme alıyor. Kullanıcı, indirimli ekran koruyuculardan birini satın almaya çalıştığında satın alma işlemi başarılı olur.

Ülke ve bölge uygunluğu

Satın alma seçeneği teklifinin veya indirim teklifinin kullanıcılara sunulacağı ülkeleri ya da bölgeleri seçebilirsiniz. Google Play, kullanıcıların uygunluğunu Play ülkesine göre değerlendirir. Bir teklif için bölgesel kullanılabilirliği yapılandırdığınızda, yalnızca kullanıcı hedeflenen bir ülkede veya bölgedeyse getOneTimePurchaseOfferDetailsList() kapsamında döndürülür. Aksi takdirde, queryProductDetailsAsync() işlevini çağırdığınızda döndürülen teklifler listesinde yer almaz.

Fırsat etiketleri

Aşağıdaki örnekte, bir fırsatla ilişkili fırsat etiketlerinin nasıl alınacağı gösterilmektedir.

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();
            // …
          }
        }
      }
    });
    
    

Fırsat etiketlerinin devralınması

Ürün, satın alma seçeneği veya indirim teklifi için teklif etiketleri ayarlayabilirsiniz. İndirim teklifleri, satın alma seçeneği teklifindeki teklif etiketlerini devralır. Benzer şekilde, teklif etiketleri ürün düzeyinde belirtilirse hem satın alma seçeneği teklifi hem de indirim teklifleri, ürün teklifi etiketlerini devralır.

Örneğin, Süper Ekran Koruyucular'ın ekran koruyucu ürünü için iki teklifi vardır: satın alma seçeneği ekran koruyucu ve indirimli ekran koruyucu.

  • Süper ekran koruyucuda ürün teklifi etiketi SSProductTag bulunur.
  • Satın alma seçeneği ekran koruyucusunda fırsat etiketi SSPurchaseOptionTag var.
  • İndirimli ekran koruyucuda SSDiscountOfferTag teklif etiketi bulunur.

Bu örnekte, satın alma seçeneği teklifi için oneTimePurchaseOfferDetails.getOfferTagsList() yöntemi SSProductTag ve SSPurchaseOptionTag değerlerini döndürür. İndirim teklifi için yöntem SSProductTag, SSPurchaseOptionTag ve SSDiscountOfferTag değerlerini döndürür.