Saturday , October 19 2019
Home / Android / Android In-app Billing Entegrasyonu ve Kullanımı

Android In-app Billing Entegrasyonu ve Kullanımı

In-app billing, android uygulamalarınız  içerisindeki ürünlerinizin satılmasını sağlayan, Google Play tarafından sunulan uygulama içi satın alma servisidir. Bu servisi kullanarak, uygulamanızdaki indirilebilir öğeler, müzikler, oyun kredileri veya karşılığında maddi kazanç elde etmenizi gerektiren durumlarda bu servis işinizi görecektir. In-app billing içerisinde hem tekil ürün alma hem de aylık abonelik olarak 2 seçenek bulunmaktadır. Google In-app Billing dokümanına bu linkten ulaşabilirsiniz.

Google In-app Billing için birkaç önemli nokta var.

  • Kod içerisinden ürün fiyatı belirleme olmuyor. Bu yüzden her değişik fiyatlı ürün için yeni bir consumer key tanımalamak gerekiyor.
  • Yaptığınız uygulama (test uygulaması bile olsa) emulatörde çalışmıyor. Eğer gerçek ürün testi yapacaksanız Alpha veya Beta sürümüne uygulamayı yükleyip oradan bir test linki alıp google play’den uygulamayı indirip test etmek gerekiyor. Direk telefona derlenen debug modda satın alma testi yapılmıyor.
  • In-app billing aynı ürünü 2 kere almaya izin vermiyor, satın aldığınız ürünü daha sonra consume etmek gerekiyor. Bu yüzden her ürün satın alma işleminden sonra consume olayı olmalıdır.
  • Eğer herhangi bir test ürününü test edeceksek  Sku keyimiz “android.test.purchased” olmalı. Test ürününü telefona derleyip test edebilirsiniz. Alpha veya Beta apk yüklemeye gerek yoktur.

 

Şimdi In-app billing entegrasyonuna geçebiliriz.

Öncelikle Android Sdk Manager’dan Google Play Billing Library’i yüklemek gerekiyor.

app billing library

2- Daha sonra android manifest dosyasına App Billing iznini eklememiz gerekiyor

3- Şimdi App Billing kütüphanesini projemize import edeceğiz. Bunun için öncelikle yapmamız gereken şey App billing aidl file’ı projemize eklemek.

4- Proje menusunden App – Src- Main yolunda Main klasörüne sağ tıklayarak new – directory seçerek isim alanını “aidl” olarak giriyoruz.

5- Oluşan aidl klasörüne sağ tıklayıp new – package seçeneğini seçiyoruz ve package name alanını “com.android.vending.billing” olarak giriyoruz.

6- Android Sdk managerden yüklediğimiz library bir aidl file üretiyor. Bunu projemize ekleyeceğiz. Aidl file’ın yolu ise /extras/google/play_billing/ altında IInAppBillingService.aidl isimli bir dosyadır. Bu dosyayı kopyalayıp oluşturduğumuz “com.android.vending.billing” altına kopyalıyoruz. Kopyalama işleminden sonra projemizi build ederek aidl file’ı derliyoruz.

7- Build işleminden sonra Extras altındaki sample project içerisinden utility classlarını projemize ekleyeceğiz. Bu classlar için ben bir package oluşturdum. Projemin ismi “com.burakiren.appbilling” olarak geçiyor. Ben com.burakiren dizinine giidp bir de appbilling diye bir package ekledim. Classları da bunun altına attım.

Aidl file’ı aldığımız yerde bir sample dosyası var. Bunun içerisinde google tarafından oluşturulmuş TrivialDrive projesi bulunmaktadır. “/Users/mac/Library/Android/sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/Util ” altındaki classları kopyalayıp dediğim şekilde bir package oluşturup içine atabilirsiniz.

Yani klasörlerin son hali aşağıdaki resim gibi oluyor.

app_billinh_klasör

Bu aşamada kadar In-app Billing kütüphanesini projemize entegre etmiş oluyoruz. Şimdi kod tarafındaki işlemlere geçiyoruz. Öncelikle activity_main.xml içerisine bir adet buton ekledim.

Daha sonra Main Activity classımız 2 adet class değişkeni ekliyorum.

App Billing kütüphanesinin aktif olması için “https://play.google.com/apps/publish” hesabına yeni bir uygulama ekleyip oradan bir api key almak gerekiyor. Api Key’imiz eklediğimiz uygulamanın api’ler menusunde bulunuyor. Ben bu key’i string.xml içerisine ekleyip activity içerisinde

olarak kullandım. Siz de böyle kullanabilirsiniz.

 

Daha sonra onCreate metodu içerisinde App billing’i yüklüyoruz.

 

Şimdi buton click olduğunda satın alma işlemine başlamamız gerek. Click fonksiyonum ve tıklandıktan sonra onActivityResult durumu ise şu şekilde

Daha sonra satın aldıktan sonra consume işlemi başlıyor. Eğer consume etmezsek kullanıcı ürünü 1 kere satın aldıktan sonra 2.ye satın alamaz. Biz consume ederek ürünü serbest bırakıyoruz ve tekrar satın alınmasını sağlıyoruz.

Consume işlemi için gerekli kodlar,

Eğer satın almanın başarılı olmasına bağlı olarak bir işlem yapılacaksa veya herhangi bir istek atılacaksa bu işlemi “OnConsumeFinishedListener” eventinde yapabiliriz.

Son olarak onDestroy’da mHelper instance’ımızı dispose etmemiz gerekiyor. Ben projeyi canlıya attığımda dispose ederken uygulamanın crash olduğunu gördüm. Henüz işlem bitmeden onDestroy’a düştüğü için dispose edemiyor. AppBilling’in bir bugıymış. Bu yüzden dispose ederken try catch içine alıyorum. Başka çözümleri de vardı ama bu da çözümler arasında.

Yapacağımız işlemler bu kadar. Eğer telefona derlediğinizde IabHelper fonksiyonunda hata alırsanız o da In-app billing tarafında bulunan bir bugmış. IabHelper classını aşağıdaki gibi güncelleyince sorunu aşabildim. Siz de kodlarınızı bu dokümandaki kodlarla değiştirerek çözüme ulaşabilirsiniz.

Uygulamamız çalışıp butona tıkladığımızda satın alma ekranının açıldığını ve başarılı bir şekilde test ürünün alabildiğimizi görüyoruz.

25af0abe-7a19-4b19-88de-85553c12e0c3

 

MainActivity classımızın son hali ise bu şekildedir.

 

Her türlü sorularınız, yanlış bilgi veya ekleme için mail atabilir veya yorum bırakabilirsiniz.

Sağlıcakla kalın.

About Burak

14 comments

  1. Merhaba ödeme kontrolunu nasıl yapıyoruz. orasını anlamadım. oncreate de bir kontrol yapmadık.
    Database ye falan yazdırabiliriz belki ama kullanıcı verileri silerse ne olacak. nasıl anlıyacaz alıp almadığını

    • IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
      new IabHelper.OnConsumeFinishedListener() {
      public void onConsumeFinished(Purchase purchase,
      IabResult result) {

      if (result.isSuccess()) {

      // Satın alma başarılı ise burada satın alma sonrası işlemleri yapabiliriz.
      } else {
      // handle error
      }

      }
      };

      Eğer ödeme başarılı ise bu kısımda yazdığın servise falan kaydetmen gerek hocam, böyle şeyleri local veritabanında ya da prefs’te tutmak doğru olmaz. Ayrıca purchase objesinin içindeki json değişkeninde veriler geliyor bunu servise atıp ödemenin gerçekten başarılı olduğunu kontrol edebilirsin. Bu kısım Apple in-app purchase’daki receipt değerine denk geliyor.

  2. Ellerinize sağlık çok güzel bir döküman.Benim bir sorum var herşeyi yapıyorum sku key ide kendi satış panelimde girdigim satış anahtarının adını giriyorum fakat satın ala tıkladıgımda kimlik doğrulama gerekli diyor.bunun sebebi nedir?

    • Google play tarafındaki kredi kartı bilgileri falan eksik olabilir mi hocam? Sorun Google developer console’daki ayarlardan kaynaklanıyor sanırım.

    • Tekrardan merhaba hocam, şimdi aklıma bir şey geldi. Development testi yaptığın telefonda app-billing yapmaya çalışırsan izin vermiyor. Uygulamayı indirdireceğin yeni bir tel lazım.

  3. Bu yazınızı keşke daha önce görseymişim. Çünkü bu anlattıklarınızı kendim çözmek zorunda kaldım ve bayağı zorlandım. Ben level anahtarı yani tüketilebilir bir ürün satıyorum (consumable). İki seçeneğim var:

    Birincisi; ödeme yapılır yapılmaz consume edip anahtarı sharedpreferences içinde bir değişkene kaydedeceğim. Adam level geçmek istediğinden kullanacak ve değişken sıfırlanacak. (Tabi adam bu anahtarı kullanmadan uygulamayı silerse filan hakkı gidecek)

    İkincisi; ödeme yapılınca ürün tüketilene kadar (consume edilene kadar) google veri tabanında bekliyor ve bekleyecek. Adam level kilitini açmak istediğinde daha önce satın aldığı ürünü consume edeceğim. -ki o anda adamın internete bağlı olması gerekecek- Ama bu durumda, ödeme kontrolünden sonraki başka bir gün ürünün harcanıp harcanmadığını nasıl kontrol edeceğimi şu anda bilmiyorum.

    Sizce hangi yolu izlemek gerekir.

  4. Merhaba uygulamayı test olarak çalıştırdım satın alma işlemi gerceklesti fakat koşulu gerçekleştirmedi
    Acaba test versiyon oldugundanmi?

  5. Çok güzel anlatmışsın :) Şimdi geç oldu sabah uygulayıp döneceğim tekrar sana :) teşekkürler…

  6. Hocam yapıyorum ödeme başarılı bir şekilde gerçekleşiyor. Herşey anlattığınız gibi ancak ben şunu istiyorum mesela ödeme gerçekleşince veritabanına birşey yazsın veya bir text viewin yazısı değişsin falan bu tarz işlemleri nerde yapmalıyım.. Consumefinished listener da yaptım ama olmuyor??

    • Merhaba Said Hocam,

      Koşulu onIabPuchasedFinishedListener içerinde !result.isFailure() kontrolünden sonra yaparsak çalışacağını düşünüyorum.

      IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
      = new IabHelper.OnIabPurchaseFinishedListener() {
      public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
      if (result.isFailure()) {
      Log.d(TAG, "in-app-billing error " + result);
      return;
      } else {
      consumeItem();

      // işlem başarılı olduktan sonra yapılacak işlemleri buraya yazabiliriz.
      }
      }
      };

  7. mrb hocam. ben remove ads yapmak istiyorum. “işlem başarılı olduktan sonra yapılacak işlemleri buraya yazabilirsiniz.” kısmında olan görevler yapılıyor. bir tanede consume düğmesi yaptım. consume yapıyorum , satın alma boşa çıkıyor. satın alma yapıyorum. consume butonu aktif oluyor vs.. sistem çalışıyor. buraya kadar sıkıntı yok. ama uygulama tekrar açıldığında ayarlar başa dönüyor.

    benim yapmak istediğim uygulama açıldığında “satın alma olmuş mu” sorgusu. olmuşsa reklamları kaldır. olmamışsa göster. bu sorguyu nasıl yapabiliriz.?

    kolay gelsin.

  8. Merhaba,

    Subscription yapıldığında, kullanıcının ilgili ürünü aldığını nerede saklamak gerekir ?
    Örnek olarak kullanıcı haftalık olarak bir ürün aldı, otomatik yenilemeyi kapatmadığı sürece yenileme gerçekleşecek. Fakat uygulama içerisinde ilgili menüye girdiğinde, daha önce ürünü alıp almadığını nasıl kontrol etmeliyiz ?

  9. Hey Look what we be experiencing for you! an provocativeoffers
    Good click http://bit.ly/2SPqu7A

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Download Free Premium Joomla Templates • FREE High-quality Joomla! Designs BIGtheme.net