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 "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, 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:
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ığından
launchBillingFlow()
yöntemini çağırın. Bu yöntem,queryProductDetailsAsync()
çağrısı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ı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 uygunsaqueryProductDetailsAsync()
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ışı parametrelerinioneTimePurchaseOfferDetails.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:
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(); } } } } } });
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 ilgiliProductDetails
nesnesini içeren birBillingFlowParams
nesnesine referans alır.BillingFlowParams
nesnesi oluşturmak içinBillingFlowParams.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ışı parametrelerinioneTimePurchaseOfferDetails.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:
- 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.
- Satın alma seçeneği ekran koruyucusunda sınırlı miktar ayarlanmamış olmalıdır.
- İndirimli ekran koruyucuda, teklif düzeyinde izin verilen maksimum miktar 3 olarak ayarlanmış.
- 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.
- Kullanıcının 1 indirimli ekran koruyucusu var ve indirimli ekran koruyucusuyla başka bir ekran koruyucu satın almayı planlıyor.
- 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:
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.
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.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.