Android In-app Billing (Uygulama İçi Satın Alma)

Merhaba arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız / yayınladığımız Android Ders’lerine bu dersimizde android geliştiricilerinin çok fazla ihtiyaç duyduğu Uygulama İçi Satın Alma in-app billing konusunu anlatacağız.

Bu dersi bizler için hazırlayan Gökhan Musapasaoğlu arkadaşımıza teşekkür ediyorum. Gerçekten hazırlaması çok zahmetli bir ders. Emeği için teşekkürler..

ÖNEMLİ:Derse başlamadan önce şu uyarıda bulunmak istiyorum.  Uygulama içi satın alımları yapmanız ve test edebilmeniz için uygulamanızı GoogleStore’a Alpha ya da Beta olarak publish etmiş olmanız gerekiyor.

In-app Billing Google Play Ayarları

Burada başta dediğim gibi Google Play’e uygulamamızı beta yada alpha olarak publish etmemiz gerekiyor. Aksi taktirde satın alma işlemi gerçekleştirirken ekrandaki gibi hata alacaksınız.

Google Play’e uygulamamızı beta yada alpha olarak publish ettikten sonra InAppProducts’un altına

Manage Poducts tabı altında Create Managed Product’u (tek seferlik satın alma)  ve ya Subscriptions tabı altında Cretae Subscrption‘ı (haftalık,aylık,yıllık satın alma) seçiyoruz.

Açılan sayfada id ,başlık ve ücret kısımlarını istediğimiz şekilde doldurup unique bir id vermemiz gerekiyor ki bu şekilde Google Play uygulama içinde hangi ürünün satıldığını bilsin.

Product ID: Uygulama içinde hangi ürünün satın alınmaya çalışıldığını anlamak için verilen unique id (her ürün için farklı olmalı)

Title: Ürün Adı

Description: Ürün Açıklaması

Price : Ne kadar Ücret isteyeceğimiz

Billing Period : Ne kadar sürede bir satın almanın otomatik tekrarlanacağı (Subscription) (haftalık,aylık,3 aylık,6 aylık,yıllık)

Free Trial Period: Kaç gün ücretsiz deneyebileceği (Subscription)

Biz bu dersimiz için ,

3 adet tekli satın almak için ürün ve

 

 

 

 

 

1 adet haftalık periyotla satılacak ürün tanımlıyoruz.

 

In-app Billing Android Uygulama’ya Entegre Etmek

Uygulama içi satın alım için Google Play ayarlarımızı tamamladık. Yukarıdaki id’leri artık uygulamamız içinde kullanabiliriz.

Şimdi yapmamız gereken işlemleri sırasıyla anlatalım.

Projemizi oluşturup Manifest dosyasına gerekli izinleri eklememiz gerekiyor.

Manifest Ayarı

Gradle Ayarı

Daha sonra build.gradle’ın içine billing kütüphanesini eklememiz gerekiyor.

PurchasesUpdatedListener

Daha sonra Uygulama içi alımları yapacağımız Activity’e PurchasesUpdatedListener interface’ini  aşağıdaki gibi implement etmemiz gerekiyor.

PurchasesUpdatedListener interface’ni implement ettiğimiz zaman onPurchasesUpdated() methodunu override etmemiz gerekiyor. Bu method bize kullanıcının satın aldığını yada iptal ettiğini söylüyor, yada başka bir sorun varsa buradan takip etmemiz gerekiyor.Biz şimdilik kullanıcının satın alıp almadığı ile ilgileniyoruz.

BillingClientStateListener

onCreate methodumuzda BillingClient sınıfından bir obje yaratarak , kendi class’ımızı parametre olarak geçiyoruz. Böylelikle onPurchasesUpdated() methodumuz BillingClient tarafından çağrılıcak ve bize gerekli bilgileri verecek. Oluşturduğumuz BillingClient objesinin startConnection() methoduna BillingClientStateListener interface’ni ekleyerek satın alma işlemini hazır olunup olunmadğı kontrolü yapılır.

Aşağıda kod üzerinde anlatmaya çalışayım.

Eğer Billing servisi aktif ise satın alma butonlarımızı aktif hale getirebiliriz. Değil ise kullanıcıya bilgi vermemiz ve satın alma butonlarımızı deaktif etmemiz gerekiyor.

Activity Kodumuzun Tamamı

Xml itemlerini koda tanıtmak için ButterKnife kütüphanesini kullandık. İncelemek isterseniz tıklayınız.

Özet

Yukarıda gördüğünüz gibi Google Play’de eklediğimiz ürünlerin id’lerini burada kullanıyoruz. Böylelikle hangi ürünü satın alacağımızı bildirmiş oluyoruz. Ben gerekli açıklamaları kod üzerinde yapmaya çalıştım.

Ürünü nasıl daha etkili satabiliriz, satışlarımızı nasıl arttırabiliriz ve ya satışlarımızı nasıl analiz ederiz gibi konular ise farklı bir konu başlığında işlenebilinir. Biz bu dersimiz de in-app billing‘i nasıl kullanacağımızı anlatmaya çalıştık.

Kaynak kodu indirip denemenizi şiddetle tavsiye ederim.

Bu dersimde sizlere in-app billing kullanımını anlatmaya çalıştık. Benim anlatmak istediklerim bu kadar. Umarım sizler için yararlı olmuştur. Konu hakkında soru , görüş ve yorumlarını konu altından ve ya SoruCevap sitemizden sorabilirsiniz.

Sıfırdan Android derslerimiz için tıklayınız.

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

35 Yorum

  • Merhabalar bu işlemi adapter içerisinde gerçekleştirebiliyor muyuz?
    Ayrıca Activity üzerinden gerçekleştirdikten sonra satın alma butonuna tıkladıktan sonra bp.purchase(MainActivity.this,”satın alma idsi”);
    şeklinde kod giriyorum. ama hata kodu geliyor.

      • Evet, aynı şekilde recyclerview deki herhangi bir iteme tıkladığımda ödüllü reklam çıkmasını da sağlayamamaktayım.

        • Sitedeki adapter kullanımı hakkında bilgi içeren konuyu inceledim. Tıklama özelliğini Activity’e taşıyıp işlemleri gerçekleştirdim. Teşekkür ederim.

  • Öncelikle çok teşekkür ederim paylaşım için..ben çok yeniyim ı yüzden soru biraz saçma olabilir.ama önce uygulamayı google play e yüklemek lazım gibi bir fikir oluştu bence..uygulamayi oluşturmadan nasil yükleyemez.id değerlerini uygulamayı yüklemeden alıp sonra uygulamayı yapmaya başlayacaz sanırım..yanlis mıyım.

  • merhaba, gerçekten bilgilendirici olmuş ama merak ettiğim bir konu var.
    bir üyenin aboneliğinin devam edip etmediğini nasıl sorgulayacağız?
    yani satın alma başarılı oldu ve 1 aylık abonelik alındı. peki bunu uygulama başlangıcında nasıl kontrol edeceğiz?

    • Merhaba en iyi yöntemi bu kontrolü server tarafından yapmanız olacaktır. Fakat mobil tarafta denemek isterseniz,
      getPurchases()
      getPurchaseHistory() methodları ile satın aldığınız itemların durumunu görebilrisiniz

  • Merhabalar, şöyle bir sorum olacaktı.
    Ürün içi satınalma işlemini gerçekleştirdim. benim anladığım kadarıyla şöyle bir sistem kurabiliyoruz;

    satın alma işlemini gerçekleştirdim, işlem başarılı olduğunda bana ProductId ve Token bilgisi dönüyor. herhangi bir hack durumunu engellemek adına ben bu bilgileri server tarafına gönderip,
    GET https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/products/productId/tokens/token

    apisi ile bunun gerçek bir işlem olup olmadığını kontrol edebiliyorum. Buraya kadar doğru mu anladım?

    2. sorum ise, android.test.purchased ile kontrol işlemimi sağlamaya çalıştım fakat, ürünü 1 kez aldıktan sonra, 2. ye almak istediğimde
    Error response: 7:Item Already Owned hatası dönüyor. yapmak istediğim sistem uygulama içi kredi alma sistemi olduğu için ürün 1 den fazla kez alınabilir olmasını istiyorum. burda nasıl bir adım izlemeliyim? emeğiniz için şimdiden teşekkürler

  • Merhaba ben uygulamamın içerisinde satın alma adımlarını test etmek istiyorum.
    Ücretsiz olarak bunu nasıl deneme şansım olabilir. Daha önce deneyimlediyseniz tecrübenizden yararlanmak isterim.

    • PLay Storeye yüklemeden bunu yapmak mümkün değil ne yazık ki.. Ayrıca yayıncı kendi ürününü satın alamıyor.. Satın almalar yapabilmeniz için uygulamanızın alfa veya beta olmasına dikkat edin lütfen..

  • Merhaba güzel anlatım olmuş. Uygulama içi satın alma ile uygulamadaki admob reklamlarını kaldırmak istiyorum nasıl bi mantık izlemem gerekir. Satın alma olunca reklam kalkacak bu kısımda sorun yok. ama kullanıcı uygullamayı silip tekrar yüklediğinde neler olacak pek kavrayamadım?

    • Kullanıcıları tuttuğun bir veri tabanın varsa oraya showAd diye bir bool tanımlayabilirsin. Satın alım sonucunda bu alanı false yaparsın. Reklamları gösterdiğin fonksiyon içerisinde userModel.showAd==true ise reklamı gösterirsin. Eğer kullanıcıları bi yerde tutmuyorsan cihaz id’si kullanarak basit bir veritabanı yapabilirsin. Ben firebase realtime database ya da firestore öneririm. Silip yüklerse bile cihaz id sini kullanarak açılışta firebase’e ya da kendi backend’ine bağlanıp kontrol edersin. Offline olarak external data erişimi isteyip bi yerlere yazabilirsin ama bu seferde cihaz formatlanınca silinir. Saygılar.

    • Kullanıcı uygulamayı kaldırıp yüklediğinde reklamlar çıkar.. Fakat reklamları kaldır butonuna bastığında “satın alma menüsü” çıkmadan reklamlar kaldırılır. Hali hazırdaki reklamlar görünür ama Uygulamayı tekrar çalıştırırsa reklamlar bir daha görünmez..

  • Merhaba, anlatım için teşekkürler.

    public void onConsumeResponse(int responseCode, String purchaseToken) {
    if (responseCode == BillingClient.BillingResponse.OK) {
    //satın alma tamamlandı yapacağınız işlemler
    }
    }

    Hangi ürünün satın aldığını bu fonksiyon içerisinde nasıl anlıyoruz? Mesela 10 can mı 20 can mı satın aldı?

    • if (purchase.getSku().equals(“10_healt”)){

      toast (10 can alındı) – toast işlemini bilirsin tam yazmadım
      }

    • Gerekmiyor hocam.. Fakat vergilendirme sisteminde bireysel veya şirket gibi seçenekeler var.. oradan kendinize uygun olanı seçiyorsunuz.. Türkiyede play store kazançlarından dolayı % 18 vergi veriyoruz..

  • Selam açıklamanız için teşekkür ediyorum. Sormak istediğim birşey var. Ben uygulama içi ürün satın almaya bir ürün yerleştirdim. Bir cihazdan bu ürün satın alınıldığında. Sonra tekrar aynı cihaz satın almak istediğinde satın alma işlemi gerçekleşmiyor hata veriyor. Sorun ne olabilir yardım eder misiniz?

  • Merhaba , güzel kod için teşekkürler, gerçekten yabancı kaynaklarda dahi büyük eksiklik vardı bu konuda. Benim sorum tek kullanımlık veya subscription şeklinde googleconsole’a kaydettiğimiz satınalmaları ismen çağırdık ama ne kendi license key imizi ne de merchant id mizi kullandık görebildiğim kadarıyla.. Acaba otomatik olarak mı geldi bu kontroller halihazırda store’a yüklü bir app olduğu için? Son olarak da bu kodu kendi uygulamamızda kullanabilir miyiz izniniz varmıdır ve de sizce tam bir kodmudur yani exception, güvenlik vs bakımlarından
    Tekrar çok teşekkürler

  • Satın alma işlemini yaptığımız buton bir daha çalışmıyor ve o satın alma işlemi gerçekleşmiyor bir daha.. sanki google bunu abonelik gibi anlıyor ve bir daha o işlemi yapmıyor. Farklı bir kod mu eklememiz gerekiyor acaba..

    • Çok Özür Taha Bey.. bir de şöyle bir sıkıntı var.. satın alma işlemi yapan kişi her o butona tıkladığında satın alma menusu çıkmadığı gibi kişinin hesabına satın aldığı kadar elmas(coins) ekleniyor 🙁

  • Merhaba,
    Bu şekilde uygulama içi satın alma yöntemini bir ürün (sizin örneğinizde can) satmak için değil de uygulamada yer alan reklamları kaldırmaya yönelik nasıl yapabilirim? Admob kullanıyorum. Örneğin aylık 1 lira ödesinler ve 1 ay boyunca reklam görmesinler. Bunu aylık, yıllık paketler halinde yapacağım.

  • Ciddi anlamda güzel olmuş. Elinize sağlık. Ufak bir sorum olacak. Uygulama içi dinamik ürünlerim olsa ve kendi web servisimden ürün ekleyerek vede eş zamanlı playstore-console’a da eklesem herhangi bir politika hatası yapmış olur muyum?

  • Merhabalar, Unity için Google lisans kodu yerleştirmeyi gösteren bir konu açar mısınız? Teşekkürler..

  • Anlatım için teşekkür ederim.Butona tıklayıp Satın alım/üyelik sonrası saatığımız içeriğe yani yeni activity’e nasıl yönlendiriyoruz bu konuda yardım ederseniz memnun olurum.

  • basit bir oyun ve oyun icerisinde mobil odeme satin alma sistemi yapmak istiyorum daha dogrusu yaptirmak istiyorum yardimci olabilirsejiz sevinirkm

  • Taha bey emeğinize sağlık yukarıdaki kodları uyguladım gayet güzel çalışıyor fakat bir sorunum var satın alma öncesi pasif olan butonu satın alma sonrası aktif edecek yolu bilmiyorum yardımcı olursanız memnun olurum. Sizin android dersleri çok faydalı teşekkür ederim.

  • Sunucudan bilgi alırken hata oluştu sorunu çıkıyor. Bu kadar zor olmamalı bu iş. Derin araştırmalar sonucunda da bir şey çıkmadı hala aynı durum devam ediyor. Neden böyle eksik lik yok mu sizce de napmam lazım diğer uygulamalarda çalışırken 5 aydır uğraştığım emek verdiği uygulamama entegre ettim her şey tamam fakat sunucudan bilgi almıyor.

  • Bu normal versiyon için geçerlimi sadece beta sürüm için mi geçerli normal sürüm attığımızda satın alma gene onaylanır mı ve satın aldığımız şeyi uygulamada nasıl görücez işlettircz hesaba

  • Merhaba hocam öncelikle çok teşekkürler.Kullanıcılar satın alım yaptıktan sonra iade işlemi yaptıktan sonra uyglamadan nasıl bir kontrol yapabiliriz, iade işlemi yaptığını öğrenmek için.Herhangi bir fonksiyon varmı mevcut satın alımı gösterecek.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?