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 teklif yapılandırabilirsiniz. Örneğin, aynı tek seferlik ürün için bir satın alma seçeneği ve bir ön sipariş teklifi 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 teklif 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 &quot;productDetails&quot; 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, hakların kullanıcılara nasıl verileceğini, fiyatını ve ürünün hangi bölgede kullanılabileceğini 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 satın alma seçeneği

Teklifler, 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 teklifi 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 teklifi (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 alınmasını ifade eder. Bu satın alma seçeneğinin, yeni modeli desteklemeyen eski Play Faturalandırma Kitaplığı (sürüm 7 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 Satın alma seçeneğini PBL ile entegre etme başlıklı makaleyi inceleyin.

Kiralama satın alma 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 satın alma 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, satın alma seçeneğiyle ilgili olan PBL entegrasyonu yönlerine odaklanılmaktadır.

Kiralama için sunulan ürünleri yapılandırmak üzere Play Developer API'nin veya Play Developer Console kullanıcı arayüzünün yeni monetization.onetimeproducts hizmetini 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üreci 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 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ının seçtiği teklife karşılık gelen teklif jetonunu ayarlamanız gerektiğini unutmayın. Kullanıcı kiralama satın alma seçeneğine uygunsa 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ş, tek seferlik ürünleri yayınlanmadan önce satın alınacak şekilde ayarlamanıza olanak tanır. Bir kullanıcı ürününüze ön sipariş verdiğinde, ürün yayınlanmadan önce ön siparişi iptal etmediği sürece ürün yayınlandığında ürünün ödemesini yapmayı kabul eder. Yayın tarihinde alıcıdan ödeme alınır ve 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ş teklifinin 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 hususlara odaklanılmaktadır.

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

Ön sipariş teklifi 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ş teklifi 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 teklifi

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 indirimi teklifinde yapılandırabileceğiniz dört farklı parametre vardır:

  • İndirimli teklif fiyatı: Orijinal fiyattan düşülen yüzde indirim veya mutlak fiyat indirimi ile 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 dönem 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();
            }
            // …
          }
        }
      }
    });
    

Teklifin geçerli olduğu zaman aralığını alma

Bir fırsat için geçerli zaman aralığını almak üzere OneTimePurchaseOfferDetails.getValidTimeWindow() yöntemini kullanabilirsiniz. Bu nesne, zaman aralığının başlangıç ve bitiş zamanını milisaniye cinsinden 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ış olmalıdır.
    2. İndirimli ekran koruyucuda, 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, indirim teklifi düzeyinde sınırlı miktarı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.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ı için kalan miktarı 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 adetle indirim 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, teklif yalnızca kullanıcı hedeflenen bir ülkede veya bölgedeyse getOneTimePurchaseOfferDetailsList() kapsamında döndürülür. Aksi takdirde, queryProductDetailsAsync() çağrısı yaptığınızda döndürülen teklifler listesinde yer almaz.

Fırsat etiketleri

Aşağıdaki örnekte, bir teklifle ilişkili teklif 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 teklif etiketi SSPurchaseOptionTag bulunur.
  • İ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.