Kotlin Multiplatform SDK ile mobil uygulamada satın alma yapma

Mobil uygulamanızda paywall’ları görüntülemek, kullanıcılara premium içerik veya hizmetlere erişim sunmanın temel adımlarından biridir. Ancak, yalnızca Adapty’nin ekranı oluşturduğu durumlarda — yani bir flow ya da eski Paywall Builder’dan bir paywall kullanıldığında — paywall, satın almaları kendi başına destekler.

Ekranı kendi kodunuzda oluşturuyorsanız, satın alma işlemini tamamlamak ve istenen içeriğin kilidini açmak için .makePurchase() adlı ayrı bir metot kullanmanız gerekir. Bu metot, kullanıcıların paywall’larla etkileşime geçmesi ve istedikleri işlemleri gerçekleştirmesi için bir kapı görevi görür.

Paywall’ınızda, kullanıcının satın almaya çalıştığı ürün için aktif bir promosyon teklifi varsa, Adapty bunu satın alma sırasında otomatik olarak uygular.

Warning

Başlangıç teklifinin otomatik olarak uygulanabilmesi için ekranın Adapty tarafından render edilmesi gerektiğini unutmayın.

Diğer durumlarda, iOS’ta kullanıcının başlangıç teklifi için uygunluğunu doğrulamanız gerekir. Bu adımı atlarsanız uygulamanız yayın sırasında reddedilebilir. Üstelik başlangıç teklifine hak kazanan kullanıcılara tam fiyat uygulanmasına yol açabilir.

Başlangıç yapılandırmasını tek bir adım atlamadan tamamladığınızdan emin olun. Aksi takdirde satın almaları doğrulayamayız.

Satın alma işlemi

Note

Ekranınızı Adapty mi oluşturuyor? Bir flow veya Paywall Builder paywall için satın almalar otomatik olarak işlenir—bu adımı atlayabilirsiniz.

Adım adım rehber mi arıyorsunuz? Tam bağlamla uçtan uca uygulama talimatları için hızlı başlangıç kılavuzuna göz atın.


Adapty.makePurchase(product = product).onSuccess { purchaseResult ->
    when (purchaseResult) {
        is AdaptyPurchaseResult.Success -> {
            val profile = purchaseResult.profile
            if (profile.accessLevels["YOUR_ACCESS_LEVEL"]?.isActive == true) {
                // Grant access to the paid features
            }
        }
        is AdaptyPurchaseResult.UserCanceled -> {
            // Handle the case where the user canceled the purchase
        }
        is AdaptyPurchaseResult.Pending -> {
            // Handle deferred purchases (e.g., the user will pay offline with cash)
        }
    }
}.onError { error ->
    // Handle the error
}

İstek parametreleri:

ParametreZorunlulukAçıklama
ProductzorunluPaywall’dan alınan bir AdaptyPaywallProduct nesnesi.

Yanıt parametreleri:

ParametreAçıklama
Profile

İstek başarılı olursa yanıt bu nesneyi içerir. Bir AdaptyProfile nesnesi, kullanıcının uygulama içindeki access level’ları, abonelikleri ve abonelik dışı satın almaları hakkında kapsamlı bilgi sağlar.

Kullanıcının uygulamaya gerekli erişime sahip olup olmadığını belirlemek için access level durumunu kontrol edin.

Warning

Not: Hâlâ Apple’ın StoreKit v2.0’ın altındaki bir sürümünü ve Adapty SDK v2.9.0’ın altındaki bir sürümünü kullanıyorsanız, bunun yerine Apple App Store paylaşılan sırrını sağlamanız gerekir. Bu yöntem Apple tarafından kullanımdan kaldırılmıştır.

Satın alma sırasında abonelik değiştirme

Kullanıcı mevcut aboneliğini yenilemek yerine yeni bir abonelik seçtiğinde, bu sürecin işleyişi uygulama mağazasına göre değişir. Google Play’de abonelik otomatik olarak güncellenmez. Aşağıda açıklandığı gibi geçişi mobil uygulama kodunuzda yönetmeniz gerekir.

Android’de aboneliği başka biriyle değiştirmek için .makePurchase() metodunu ek parametre ile çağırın:


val subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters(
    oldSubVendorProductId = "old_subscription_product_id",
    replacementMode = AdaptyAndroidSubscriptionUpdateReplacementMode.CHARGE_FULL_PRICE
)

val purchaseParams = AdaptyPurchaseParameters.Builder()
    .setSubscriptionUpdateParams(subscriptionUpdateParams)
    .build()

Adapty.makePurchase(
    product = product,
    parameters = purchaseParams
).onSuccess { purchaseResult ->
    when (purchaseResult) {
        is AdaptyPurchaseResult.Success -> {
            val profile = purchaseResult.profile
            // successful cross-grade
        }
        is AdaptyPurchaseResult.UserCanceled -> {
            // user canceled the purchase flow
        }
        is AdaptyPurchaseResult.Pending -> {
            // the purchase has not been finished yet, e.g. user will pay offline by cash
        }
    }
}.onError { error ->
    // Handle the error
}

Ek istek parametresi:

ParametreZorunlulukAçıklama
parametersisteğe bağlıAdaptyPurchaseParameters aracılığıyla iletilen bir AdaptyAndroidSubscriptionUpdateParameters nesnesi.

Abonelikler ve değiştirme modları hakkında daha fazla bilgi için Google Geliştirici belgelerine bakabilirsiniz:

iOS’ta teklif kodlarını kullanma

Teklif kodları hakkında

Teklif kodları, belirli kullanıcılara indirim veya ücretsiz deneme sunmanızı sağlar. Otomatik olarak uygulanan normal tekliflerin aksine, teklif kodları uygulama dışında — e-posta kampanyaları, sosyal medya veya basılı materyaller aracılığıyla — dağıtılır. Kullanıcılar bu kodları App Store’a girerek, bir kullanım URL’si aracılığıyla veya uygulama içi bir diyalog üzerinden kullanabilir.

Teklif kodlarını ayarlamak için App Store Connect’te bir aboneliği açın ve Offer Codes bölümüne gidin. Üç tür teklif kodu oluşturabilirsiniz:

  • Free — abonelik belirli bir süre boyunca ücretsizdir; sonraki yenilemede tam fiyat uygulanır.
  • Pay as you go — kullanıcı, belirli bir süre boyunca her fatura döngüsünde indirimli fiyat öder; ardından abonelik tam fiyatla yenilenir.
  • Pay up front — kullanıcı, tüm teklif süresi için tek seferlik indirimli bir fiyat öder; ardından abonelik tam fiyatla yenilenir.

Teklif kodlarını Adapty’ye eklemenize gerek yoktur. Apple, teklif süresi boyunca gerçekleşen her işlemi teklif kodu kategorisiyle etiketler. Bu, ilk kullanımı ve sonraki tüm indirimli yenilemeleri kapsar. Adapty bu etiketi algılar ve her işlemi offer_code teklif kategorisiyle kaydeder. Teklif süresi sona erip abonelik tam fiyatla yenilendiğinde etiket artık mevcut olmaz. Adapty Kontrol Paneli’nde Offer Code teklif türüne göre analizleri filtreleyebilirsiniz.

Gelir tutarsızlığı sorun giderme

Bir teklif kodu işleminin Adapty’de indirimli teklif fiyatı yerine tam ürün fiyatıyla göründüğünü fark ederseniz App Store Connect’te aşağıdakileri doğrulayın:

  • Teklif kodunun, kullanıcıların kullanabileceği tüm bölgeler için doğru fiyatlandırmanın yapılandırıldığından emin olun.
  • Teklif fiyatının, kullanıcının bulunduğu ülke veya bölge için ayarlandığından emin olun. Apple, işlemde bölgesel fiyatı gönderir. Teklif için bölgesel bir fiyat yapılandırılmamışsa Apple tam ürün fiyatını gönderebilir.

Adapty Kontrol Paneli’nde Offer Code teklif türü ve Offer Discount Type filtreleriyle teklif kodu işlemlerini filtreleyip doğrulayabilirsiniz.

Eski promosyon kodları (kullanımdan kaldırıldı)

Warning

Apple, Mart 2026’da uygulama içi satın almalar için promosyon kodlarını kullanımdan kaldırdı. Teklif kodları, yapılandırılabilir uygunluk koşulları, son kullanma tarihleri ve çeyrek başına 1 milyona kadar kod gibi daha fazla özellikle bunların yerini alıyor. Uygulama içi satın almalar için daha önce promosyon kodu kullandıysanız App Store Connect’te teklif kodlarına geçiş yapın.

Eski promosyon kodları (uygulama başına sürüm başına 100 ile sınırlı), bir aboneliğe ücretsiz erişim sağlıyordu. Teklif kodlarının aksine, Apple promosyon kodu işlemlerine indirim bilgisi eklemiyordu — makbuzda tam ürün fiyatını gönderiyordu. Sonuç olarak Adapty bu işlemleri tam fiyat üzerinden kaydetti ve bu durum Adapty analizleri ile App Store Connect arasında gelir tutarsızlıklarına yol açtı.

Ücretsiz olması gereken ancak geçmişte tam fiyatla kaydedilmiş işlemler görüyorsanız bunlar büyük olasılıkla eski promosyon kodlarından kaynaklanmaktadır. Bu kodlar artık kullanımdan kaldırıldığından, doğru gelir takibi için teklif kodlarına geçiş yapın.

Uygulamanızda kod kullanma sayfasını görüntülemek için:

Adapty.presentCodeRedemptionSheet()
    .onSuccess {
        // code redemption sheet presented successfully
    }
    .onError { error ->
        // handle the error
    }
Danger

Gözlemlerimize göre bazı uygulamalarda Teklif Kodu Kullanma sayfası güvenilir çalışmayabilir. Kullanıcıyı doğrudan App Store’a yönlendirmenizi öneririz.

Bunu yapmak için aşağıdaki formatta bir URL açmanız gerekir: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

Ön ödemeli planları yönetme (Android)

Uygulama kullanıcılarınız ön ödemeli planlar satın alabiliyorsa (örneğin birkaç aylık yenilenemez abonelik), ön ödemeli planlar için bekleyen işlemleri etkinleştirebilirsiniz.


Adapty.activate(
    AdaptyConfig.Builder("PUBLIC_SDK_KEY")
        .withGoogleEnablePendingPrepaidPlans(true)
        .build()
).onSuccess {
    // successful activation
}.onError { error ->
    // handle the error
}

App Store’dan tanıtılan uygulama içi satın almalar

Info

Uygulamanız, tanıtılan uygulama içi satın almaları SDK sürüm 4.1’den itibaren iOS 16.4 veya sonrasında alır. iOS 16.4’ün altında listener hiçbir zaman tetiklenmez ve tanıtılan satın almalar kendi kendine tamamlanır. Bu yalnızca iOS’a özgü bir özelliktir: Android’de listener hiçbir zaman tetiklenmez ve makePromotedPurchase bir AdaptyErrorCode.DEVELOPER_ERROR döndürür.

Bir kullanıcı, App Store ürün sayfanızdan satın alma işlemi başlattığında ve bu işlem uygulamanıza aktarıldığında, SDK ürünü OnPromotedPurchaseListener aracılığıyla size iletir. Satın alma işlemini tamamlamak uygulamanıza kalmıştır: ürünü makePromotedPurchase fonksiyonuna geçirin. Bu adımı ne zaman gerçekleştireceğinizi siz kontrol ettiğinizden, satın alma başlamadan önce kendi ekranınızı gösterebilirsiniz.

Promosyon satın almalarını desteklemek için dinleyiciyi kaydedin ve satın alma işlemini dinleyici içinden tamamlayın:


Adapty.setOnPromotedPurchaseListener(OnPromotedPurchaseListener { product ->
    scope.launch {
        Adapty.makePromotedPurchase(product)
            .onSuccess { result -> /* process the purchase result */ }
            .onError { error -> /* handle the error */ }
    }
})
Warning

Kayıtlı bir listener olmadan, promosyon satın alma işlemi hiçbir zaman tamamlanmaz: App Store ürünü uygulamanıza teslim eder ve bekler. setOnPromotedPurchaseListener’a null değeri geçmek de promosyon satın almalarının çalışmasını engeller.

Listener’ı uygulama başlangıcında, Adapty.activate’ten hemen sonra kaydedin. Promosyon satın alma işlemi genellikle uygulamayı soğuk başlatır, bu nedenle kaydınız çalışmadan önce SDK’ya ulaşabilir. SDK bu tür bir satın almayı bekletir ve siz kayıt olur olmaz iletir; yalnızca en son olanı saklar ve her seferinde konsolda bir uyarı yazar.

Tanıtılan ürün bir abonelik teklifi içeriyorsa, SDK bunu satın alma sırasında otomatik olarak uygular. Teklif, iOS 18.0 ve sonrasında bunu sunan App Store satın alma niyetinden okunur. iOS 16.4–17.x sürümlerinde ise satın alma temel fiyat üzerinden gerçekleşir.

makePromotedPurchase hiçbir satın alma parametresi almaz — tanıtılan bir ürün, bir paywall’dan değil App Store’dan geldiğinden paywall bağlamı taşımaz. makePurchase ile aynı AdaptyPurchaseResult değerini döndürür.

AdaptyPromotedProduct, vendorProductId, localizedTitle, localizedDescription, price, regionCode, isFamilyShareable ve AdaptyProductSubscription türünde bir subscription içerir.