Site icon Mobilhanem

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

android dersleri

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
Exit mobile version