• 22-11-2020, 14:06:06
    #1
    Uzun süredir abonelik sistemi eklemeyle uğraşıyodum r10 dan da bazı arkadaşlar yardımcı oldu çok sağolsunlar, sonuç olarak sistemi bitirdim ve hem isteyen erişebilsin hem de ilerde ihtiyacım olursa daha kolay bulup daha kolay anlayabiliyim diye kendi siteme de ekledim Farklı günlerde eklemeler yapıp tamamladığım için konu da gözümden kaçan şeyler olabilir, bir hata görürseniz söylerseniz sevinirim.

    Kaynak: ANDROİD UYGULAMAYA ABONELİK SİSTEMİ EKLEME

    Gelir elde etme açısından abonelik sistemi eklemek oldukça önemlidir. Bu yüzden bir çoğumuz uygulamamıza reklam ekledikten sonra premium üyelik gibi abonelik sistemleri ekleyerek reklam kaldırma imkanı sunar ve daha çok gelir elde etmeye çalışırız. Ancak Google'ın ödeme kütüphanesi bir çoğumuza karmaşık geldiği için alternatif ve çok kullanılan ButterKnife kütüphanesi çıkmıştır. Şimdi geçelim nasıl abonelik sistemi ekleyebileceğimize.

    Android JAVA Uygulamaya Abonelik Sistemi Ekleme:

    Öncelikle kullanacağımız kütüphaneleri build.gradle(:app) dosyasına ekleyelim. Bu dosyada dependencies kısmında en alta aşağıdaki kodları ekleyin:

    implementation 'com.android.billingclient:billing:3.0.0'
    implementation 'com.jakewharton:butterknife:10.2.3'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
    Ardından bir Java Fragment'i oluşturun. Oluştururken Fragment => Blank Fragment seçeneklerini seçin ve FragmentPremium adını verin.

    Ardından aşağıya eklediğim kodu bu sayfaya ekleyin: (Paket adı kısımlarını değiştirmeyi unutmayın)
    package com.paketadi.fragment;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.Toast;
    import com.android.billingclient.api.AcknowledgePurchaseParams;
    import com.android.billingclient.api.AcknowledgePurchaseResponseListener;
    import com.android.billingclient.api.BillingClient;
    import com.android.billingclient.api.BillingClientStateListener;
    import com.android.billingclient.api.BillingFlowParams;
    import com.android.billingclient.api.BillingResult;
    import com.android.billingclient.api.Purchase;
    import com.android.billingclient.api.PurchasesUpdatedListener;
    import com.android.billingclient.api.SkuDetails;
    import com.android.billingclient.api.SkuDetailsParams;
    
    import com.android.billingclient.api.SkuDetailsResponseListener;
    import com.paketadi.app.R;
    import com.paketadi.asyncTask.LoadPremium;
    import com.paketadi.interfaces.SuccessListener;
    import com.paketadi.utils.Constant;
    import com.paketadi.utils.Methods;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import butterknife.ButterKnife;
    import butterknife.OnClick;
    
    public class FragmentPremium extends Fragment implements PurchasesUpdatedListener {
        private Button buttonbuy;
        private View view;
        private BillingClient mBillingClient;
        private List<SkuDetails> abonelik = new ArrayList<>();
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.fragment_premium, container, false);
            buttonbuy = (Button) view.findViewById(R.id.btn_buy_premium);
            return view;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ButterKnife.bind(getActivity());
            mBillingClient = BillingClient.newBuilder(getActivity()).enablePendingPurchases().setListener(this).build();
            mBillingClient.startConnection(new BillingClientStateListener() {
                @Override
                public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
                    {
                        List<String> skuListInAPP = new ArrayList<>();
                        skuListInAPP.add("premium");
     // play console'da oluşturduğunuz aboneliğin ürün kimliği
                        SkuDetailsParams.Builder paramsINAPP = SkuDetailsParams.newBuilder();
                        paramsINAPP.setSkusList(skuListInAPP).setType(BillingClient.SkuType.SUBS);
                        mBillingClient.querySkuDetailsAsync(paramsINAPP.build(), new SkuDetailsResponseListener() {
    
                            @Override
                            public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                                    for (Object skuDetailsObject : list) {
                                        SkuDetails skuDetails = (SkuDetails) skuDetailsObject;
    
                                        if(skuDetails.getSku().equals("premium")) {
                                            buttonbuy.setOnClickListener(new View.OnClickListener() {
                                                @Override
                                                public void onClick(View view) {
    
                                                        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                                                .setSkuDetails(skuDetails)
                                                                .build();
                                                        mBillingClient.launchBillingFlow(getActivity(),flowParams);
                                                }
                                            });
                                        }
                                    }
    
                                }
                            }
                        });
                    }
                    else
                    {
                        Toast.makeText(getActivity(),"satın alma başarısız!",Toast.LENGTH_LONG).show();
                    }
                }
                @Override
                public void onBillingServiceDisconnected() {
                    Toast.makeText(getActivity(),"satın alma başarısız!",Toast.LENGTH_LONG).show();
                }
            });
        }
    
        @Override
        public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null)
            {
                for (Purchase purchase: list)
                {
                    if (!purchase.isAcknowledged())
                    {
                       AcknowledgePurchaseParams acknowledgePurchaseParams=  AcknowledgePurchaseParams.newBuilder()
                                .setPurchaseToken(purchase.getPurchaseToken())
                                .build();
                        mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
                            @Override
                            public void onAcknowledgePurchaseResponse(@NonNull BillingResult billingResult) {
                                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                                    if (purchase.getSku().equals("premium"))
                                    {
                                        try {
                                           //Satın alma başarılıysa yapılacak işlemler
                                        }
                                        catch (Exception e)
                                        {
                                            System.out.println("Değer: "+e);
                                        }
                                    }
                                }
                            }
                        });
                    }
    
    
                }
    
            }
    
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED)
            {
                Toast.makeText(getActivity(),getResources().getString(R.string.premium_error),Toast.LENGTH_SHORT).show();
            }
        }
    }
    Umarım işinize yarar
    Edit: @Yigith4n; hocamın yardımlarıyla bazı düzenlemeler yapıldı konuyu hem buradan hem sitemden güncelledim.
  • 22-11-2020, 18:31:29
    #2
    Hocam Acknowledgeyi oluşturup çağırmamışsınız bilginiz olsun 3'gün sonra iade olur sipariş
  • 22-11-2020, 18:32:11
    #3
    Yigith4n adlı üyeden alıntı: mesajı görüntüle
    Hocam Acknowledgeyi oluşturup çağırmamışsınız bilginiz olsun 3'gün sonra iade olur sipariş
    bu sorunu bi arkadaşım yaşıyodu bende daha abone olan olmadığı için bilmiyorum özelden yazıyorum
  • 22-11-2020, 23:53:49
    #4
    Bu işlerle profesyonel olarak ilgilenmiyorsanız Anjlab kütüphanesini kullanın. Google'nin kendi billing kütüphanesi yeni başlayan biri için oldukça karışık. https://github.com/anjlab/android-inapp-billing-v3
  • 23-11-2020, 13:18:44
    #5
    Backend tarafında satın almaları doğrulama için kullandığınız yöntem var mı
  • 23-11-2020, 14:00:19
    #6
    mdeniz33 adlı üyeden alıntı: mesajı görüntüle
    Backend tarafında satın almaları doğrulama için kullandığınız yöntem var mı
    play üzerinden işlem dönüyor o yüzden
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null)
    şeklinde bir kod var sanırım, onun dışında site veritabanına kaydediyorum son kullanım tarihi kaydediyorum ona göre işlem yaptırıyorum
  • 23-11-2020, 15:23:01
    #7
    Kodlama hatalı.
    private List<SkuDetails> abonelik = new ArrayList<>();
    Burada "SkuDetails" ile ArrayList oluşturmuşsunuz.

    Ancak SKU eklemeyi
    List<String> skuListInAPP = new ArrayList<>();
    skuListInAPP.add("premium");
    "String" ArrayList yapmışsınız ve add veya addAll kullanmamışsınız. Zaten kullansanızda hata verir. Dolayısıyla, abonelik.get(0) olarak çağırdığınızda boş olduğu için hata verecektir.
  • 23-11-2020, 15:24:14
    #8
    WebilisimNET adlı üyeden alıntı: mesajı görüntüle
    Kodlama hatalı.
    private List<SkuDetails> abonelik = new ArrayList<>();
    Burada "SkuDetails" ile ArrayList oluşturmuşsunuz.

    Ancak SKU eklemeyi
    List<String> skuListInAPP = new ArrayList<>();
    skuListInAPP.add("premium");
    "String" ArrayList yapmışsınız ve add veya addAll kullanmamışsınız. Zaten kullansanızda hata verir. Dolayısıyla, abonelik.get(0) olarak çağırdığınızda boş olduğu için hata verecektir.
    Test kartla denedik hocam çalıştı şu an bi hata vermiyo
  • 23-11-2020, 15:25:01
    #9
    Aeknasd145 adlı üyeden alıntı: mesajı görüntüle
    Test kartla denedik hocam çalıştı şu an bi hata vermiyo
    Verir eminim.

    mBillingClient.querySkuDetailsAsync(paramsINAPP.build(), (billingResult1, list) -> abonelik.addAll(list));
    olarak değiştirin.