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ı
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.vending.BILLING" />
Gradle Ayarı
Daha sonra build.gradle’ın içine billing kütüphanesini eklememiz gerekiyor.
dependencies { ... compile 'com.android.billingclient:billing:1.0' }
PurchasesUpdatedListener
Daha sonra Uygulama içi alımları yapacağımız Activity’e PurchasesUpdatedListener interface’ini aşağıdaki gibi implement etmemiz gerekiyor.
public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { } }
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.
private BillingClient mBillingClient; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBillingClient = BillingClient.newBuilder(this).setListener(this).build(); //BillingClient objemizi oluşturduk mBillingClient.startConnection(new BillingClientStateListener() { //satın almaya hazır mı kontrolü @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { // Satın almaya hazır // BUTONLARI AKTIF ET enableOrDisableButtons(true); //butonları aktif et } else { //TODO Kullanıcıya uyarı ver // Satın almaya hazır değil Toast.makeText(MainActivity.this, "Ödeme sistemi için google play hesabını kontrol ediniz", Toast.LENGTH_SHORT).show(); enableOrDisableButtons(false);//butonları pasif et } } @Override public void onBillingServiceDisconnected() { // Servise Bağlanamadı //TODO Kullanıcıya uyarı ver enableOrDisableButtons(false);//butonları pasif et Toast.makeText(MainActivity.this, "Ödeme sistemi şuanda geçerli değil", Toast.LENGTH_SHORT).show(); } }); }
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ı
package com.pasaoglu.mobilhanem.inappbilling; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.ConsumeResponseListener; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesUpdatedListener; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Optional; public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener { private BillingClient mBillingClient; @BindView(R.id.btn_three_buy_health) Button btn_three_buy_health; @BindView(R.id.btn_ten_buy_health) Button btn_ten_buy_health; @BindView(R.id.btn_twenty_buy_health) Button btn_twenty_buy_health; @BindView(R.id.btn_fifty_buy_health) Button btn_fifty_buy_health; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mBillingClient = BillingClient.newBuilder(this).setListener(this).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { // The billing client is ready. You can query purchases here. // BUTONLARI AKTIF ET enableOrDisableButtons(true); } else { //TODO Kullanıcıya uyarı ver Toast.makeText(MainActivity.this, "Ödeme sistemi için google play hesabını kontrol ediniz", Toast.LENGTH_SHORT).show(); enableOrDisableButtons(false); } } @Override public void onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. //TODO Kullanıcıya uyarı ver enableOrDisableButtons(false); Toast.makeText(MainActivity.this, "Ödeme sistemi şuanda geçerli değil", Toast.LENGTH_SHORT).show(); } }); } private void enableOrDisableButtons(boolean isEnabled) { btn_three_buy_health.setEnabled(isEnabled); btn_ten_buy_health.setEnabled(isEnabled); btn_twenty_buy_health.setEnabled(isEnabled); btn_fifty_buy_health.setEnabled(isEnabled); } @Optional @OnClick(R.id.btn_three_buy_health) void buyThreeHealth(View view) { buyProduct("3_buy_health");//Buradaki id Google Play'de tanımlanan id } @Optional @OnClick(R.id.btn_ten_buy_health) void buyTenHealth(View view) { buyProduct("10_buy_health"); //Buradaki id Google Play'de tanımlanan id } @Optional @OnClick(R.id.btn_twenty_buy_health) void buyTwentyHealth(View view) { buyProduct("20_buy_health");//Buradaki id Google Play'de tanımlanan id } @Optional @OnClick(R.id.btn_fifty_buy_health) void buyFiftyHealth(View view) { buySubscription("50_buy_health");//Buradaki id Google Play'de tanımlanan id } private void buyProduct(String skuId) { //Bir defa satın almak için //Buradaki skuId , google playde tanımladığımız id'ler olmalı BillingFlowParams flowParams = BillingFlowParams.newBuilder() .setSku(skuId) .setType(BillingClient.SkuType.INAPP) .build(); mBillingClient.launchBillingFlow(this, flowParams); } private void buySubscription(String skuId) { //haftalık,aylık,3 aylık,6 aylık ,yıllık üyelik için //Buradaki skuId , google playde tanımladığımız id'ler olmalı BillingFlowParams flowParams = BillingFlowParams.newBuilder() .setSku(skuId) .setType(BillingClient.SkuType.SUBS) .build(); mBillingClient.launchBillingFlow(this, flowParams); } @Override public void onPurchasesUpdated(int responseCode, @Nullable List purchases) { //satın alma işlemi bittikten sonra bu method otomatik çağırılır if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //satın alma başarılı for (final Purchase purchase : purchases) { mBillingClient.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() { @Override public void onConsumeResponse(int responseCode, String purchaseToken) { if (responseCode == BillingClient.BillingResponse.OK) { //satın alma tamamlandı yapacağınız işlemler } } }); } } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {//kullanıcı iptal etti // Handle an error caused by a user canceling the purchase flow. billingCanceled(); //kullanıcı iptal etti } else { billingCanceled(); //bir sorun var } } private void billingCanceled() { //Kullanıcı iptal ettiğinde yapılacak işlemler } }
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.
47