Bu dokümanda, 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çeneklerinin ve tekliflerin nasıl entegre edileceği 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 teklif yapılandırmak istiyorsanız queryProductDetailsAsync()
API'sini kullanmanız gerekir. Desteği sonlandırılan querySkuDetailsAsync()
API desteklenmiyor. queryProductDetailsAsync()
ve launchBillingFlow()
'in ProductDetailsParams
değerini giriş olarak alan sürümü hakkında bilgi edinmek için taşıma adımları bölümüne bakın.
Ürün ayrıntılarını sorgulayın
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 satın alma seçeneğine sahip olabilir. Her ProductDetails
nesnesi için uygun tekliflerin tümünün 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ığında launchBillingFlow()
yöntemini çağırın. Bu yöntem, queryProductDetailsAsync()
çağrıldıktan sonra elde edilen alakalı 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 teklif jetonunu kullanıcı tarafından seçilen teklife göre 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, kullanıcıya nasıl hak 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 şeması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 satın alma seçeneği için desteklenir)
- İndirim teklifi (hem satın alma hem de kiralama satın alma seçenekleri için desteklenir)
Satın alma seçeneği
Satın alma satın alma seçeneği, tek seferlik ürünün standart, doğrudan satın alınmasını temsil eder. Bu satın alma seçeneğinin yeni modeli desteklemeyen eski Play Faturalandırma Kitaplığı (7 veya daha eski sürüm) akışlarında kullanılıp kullanılamayacağı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 Kiralık 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 süresinin son tarihini belirtebilirsiniz. Bu dokümanda, 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. PBL bağımlılığını uygulamanıza ekleme, BillingClient sınıfını başlatma ve Google Play'e bağlanma gibi ilk PBL entegrasyon adımlarını bildiğiniz varsayılır. Bu bölümde, kiralama satın alma seçeneğine özgü PBL entegrasyon yönleri ele alınmaktadır.
Kiraya verilebilecek ü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 akışı başlatmak üzere aşağıdaki adımları uygulayın:
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(); } } } } } });
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ığında
launchBillingFlow()
yöntemini çağırın. Bu yöntem,queryProductDetailsAsync()
çağrılmasından elde edilen ilgiliProductDetails
nesnesini içeren birBillingFlowParams
nesnesine referans alır.BillingFlowParams
nesnesi oluşturmak içinBillingFlowParams.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. Kiralama satın alma seçeneğine uygun olan kullanıcılaraqueryProductDetailsAsync()
içinde RentalDetails ve offerId içeren bir teklif gönderilir.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ünlerin henüz yayınlanmadan önce satın alınmasını ayarlamanızı sağlar. Kullanıcılar, ürününüzün ön siparişini verirken, ön siparişi yayın tarihinden önce iptal etmediği sürece ürün yayınlandığında ödeme yapmayı kabul eder. Satın alma işleminin ödemesi, yayın tarihinde alınır ve Play, öğenin kullanıma sunulduğuna dair bir e-posta gönderir.
Bu belgede, ön sipariş satın alma teklifinin Play Faturalandırma Kitaplığı (PBL) ile entegrasyon adımları açıklanmaktadır.
Ön sipariş fırsatını PBL ile entegre etme
Bu bölümde, ön sipariş teklifinin Play Billing Library (PBL) ile nasıl entegre edileceği açıklanmaktadır. PBL bağımlılığını uygulamanıza ekleme, BillingClient sınıfını başlatma ve Google Play'e bağlanma gibi ilk PBL entegrasyon adımlarını bildiğiniz varsayılır. Bu bölümde, ön sipariş teklifine özgü PBL entegrasyon yönleri ele alınmaktadır.
Ön sipariş fırsatı için satın alma akışı başlatma
Ön sipariş teklifi için satın alma akışı başlatmak üzere aşağıdaki adımları uygulayın:
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
yöntemini kullanarak ön sipariş fırsatı meta verilerini alın. 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(); } } } } } });
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ığında
launchBillingFlow()
yöntemini çağırın. Bu yöntem, queryProductDetailsAsync() çağrıldıktan sonra elde edilen ilgiliProductDetails
nesnesini içeren birBillingFlowParams
nesnesine referans alır.BillingFlowParams
nesnesi oluşturmak içinBillingFlowParams.Builder class
öğesini 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. Bir kullanıcı ön sipariş teklifi için uygunsaqueryProductDetailsAsync()
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 yapılan indirimin yüzdesi veya mutlak fiyatla 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 teklif için uygun olmaz.
Sınırlı süre (isteğe bağlı): Teklifin geçerli olduğu dönemi belirtir. Fırsat, belirtilen sürenin 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ı ve indirim yüzdesi nasıl alınacağı gösterilmektedir. Yüzde indirim bilgilerinin 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 indirim tutarını alma
Aşağıdaki örnekte, indirimli teklifin orijinal tam fiyatı ve mutlak indiriminin mikro saniye cinsinden nasıl alınacağı gösterilmektedir. Mikro bilgilerdeki mutlak indirimin 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, 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(); // … } } } } });
İndirim teklifi düzeyinde sınırlı miktar
İndirim teklifi düzeyinde maksimum miktar sınırını belirtebilirsiniz. Bu sınır yalnızca teklif düzeyinde uygulanır. Aşağıda açıklayıcı bir örnek verilmiştir:
- Süper ekran koruyucular, ekran koruyucu ürünü için 2 teklif sunar: ekran koruyucu satın alma seçeneği ve indirimli ekran koruyucu.
- Satın alma seçeneği ekran koruyucusunda sınırlı miktar ayarlanmamış.
- İndirim ekran koruyucusunda, teklif düzeyinde izin verilen maksimum miktar 3 olarak ayarlanmıştır.
- Ekran koruyucu ürünü için ürün düzeyinde izin verilen maksimum miktar olmadığından kullanıcılar bu ürünü sınırsız miktarda satın alabilir.
- Kullanıcının 1 indirimli ekran koruyucusu var ve indirimli ekran koruyucu içeren başka bir ekran koruyucusu satın almayı planlıyor.
- Mevcut teklifler alınırken satın alma seçeneği ekran koruyucusunun LimitedQuantityInfo özelliği null olur ve indirimli ekran koruyucusunun kalan miktar değeri 2 olur.
Aşağıdaki örnekte, indirim teklifi seviyesinde 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 miktarda kullanım hakkı kullandığında teklif, getOneTimePurchaseOfferDetailsList()
yöntemi tarafından döndürülmez.
Kullanım sınırını hesaplama
Aşağıdaki örnekte, belirli bir indirim teklifiyle ilgili sınırlı miktar bilgilerinin nasıl alınacağı gösterilmektedir. İzin verilen maksimum miktarı ve mevcut kullanıcı için kalan miktarı alabilirsiniz. Sınırlı miktar özelliğinin hem tüketim amaçlı hem de tüketim amaçlı olmayan tek seferlik ürün teklifleri için geçerli olduğunu unutmayın. Bu özellik yalnızca teklif düzeyinde desteklenir.
Google Play, kullanıcının sahip olduğu miktarı belirlediğiniz maksimum miktardan çıkararak kalan miktarı hesaplar. Google Play, kullanıcının sahip olduğu miktarı hesaplarken tüketilen satın alma işlemlerini 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 miktara dahil edilmez. Örneğin:
Süper ekran koruyucularda, izin verilen maksimum miktar olan bir adetle indirim fırsatı oluşturulur. Böylece kullanıcılar indirimli bir ekran koruyucusunu en fazla bir kez satın alabilir.
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 kodu alır.Kullanıcı, ilk satın aldığı indirimli ekran koruyucu için geri ödeme isteğinde bulunur ve geri ödemeyi başarıyla alır. Kullanıcı, indirimli ekran koruyuculardan birini satın almaya çalışır ve 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ı uygunluğunu Play ülkesine göre değerlendirir. Bir teklifin bölgesel stok durumunu yapılandırdığınızda, bu durum 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.
Teklif 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(); // … } } } });
Teklif 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 teklifinden 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, ekran koruyucu ürünü için satın alma seçeneği ekran koruyucu ve indirimli ekran koruyucu olmak üzere iki teklif sunmaktadır.
- Süper ekran koruyucu,
SSProductTag
ürün teklifi etiketine sahiptir. - Satın alma seçeneği ekran koruyucusunda
SSPurchaseOptionTag
teklif etiketi vardır. - İndirim ekran koruyucusunda
SSDiscountOfferTag
teklif etiketi bulunur.
Bu örnekte, satın alma seçeneği teklifi için oneTimePurchaseOfferDetails.getOfferTagsList()
yöntemi SSProductTag
ve SSPurchaseOptionTag
döndürür. Yöntem, indirim teklifi için SSProductTag
, SSPurchaseOptionTag
ve SSDiscountOfferTag
değerlerini döndürür.