• 10-01-2019, 00:39:50
    #1
    Uygulamamda anjlabın uygulama içi satın alma kütüphanesini kullanıyorum. Bir üründen birden fazla satın alma gerçekleştirmek istiyorum. Kullanıcı kredi satın alabiliyor, kredi aldıktan sonra tekrar satın al butonuna tıklandığında tekrar ödeme ekranı gelmesini istiyorum fakat ödeme alınmadan tekrar kredi veriyor. Ürünü tüketmek için consume metodunu kullandım fakat ürün bir türlü tükenmiyor. Github sayfasından da baktığım çözümler fayda etmedi. Consumeyi her yere yazdım fakat bir türlü ürün tükenmiyor. işin tuhaf yanı ürünü tüketmek için ilk başta onProductPurchased metoduna yazdım ve ürün tükenip tekrar in app oluyordu fakat onda da satın alma olduktan sonra tekrar kredi ala tıklamadan kredi alınamıyordu. onu çözeyim derken şimdi hiç çalışmıyor.

    Kodlar şu şekilde
    public class PurchaseActivity extends Activity implements BillingProcessor.IBillingHandler {
    
    
    
        BillingProcessor bp;
    
    
    
        @Override
        public void onDestroy() {
            /*Destroy billing proc.*/
            if (bp != null) {
                bp.release();
            }
            super.onDestroy();
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            /*handle billing proc. on activity result*/
            if (!bp.handleActivityResult(requestCode, resultCode, data)) {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
    
    
        Button btn_Purchase,btn_restore_purchase,btnUnlimited;
        TextView tvCoin;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.purchase_activity);
    
            /*Initialize billing proc.*/
            /*definitions*/
            btn_Purchase = findViewById(R.id.btn_Purchase);
            btn_restore_purchase= findViewById(R.id.btn_restore_purchase);
            btnUnlimited= findViewById(R.id.btnUnlimited);
            tvCoin= findViewById(R.id.tvTotalCredi);
    
    
    
    
            /*Billing Control*/
            if (BillingControl.ReadIntPreferences(PurchaseActivity.this))
            {
                tvCoin.setText(getResources().getString(R.string.coin_unlimited));
                btn_Purchase.setEnabled(false);
                btn_restore_purchase.setEnabled(false);
                btnUnlimited.setEnabled(false);
    
            } else
            {
                tvCoin.setText("Mevcut Kredi: "+String.valueOf(SharedMemory.ReadIntPreferences(PurchaseActivity.this,KEY_AMOUNT)));
                bp = new BillingProcessor(this, LICENSE_KEY, this);
                bp.initialize();
    
            }
    
    
    
    
            /*Purchase button*/
            btn_Purchase.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    bp.consumePurchase(PRODUCT_ID_20);
                    bp.purchase(PurchaseActivity.this, PRODUCT_ID_20);
                }
            });
    
    
    
            /*Restore purchase*/
            btn_restore_purchase.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    bp.consumePurchase(PRODUCT_ID_100);
                    bp.purchase(PurchaseActivity.this, PRODUCT_ID_100);
    
        }
    });
    
            btnUnlimited.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                 //   bp.consumePurchase(PRODUCT_ID_100);
                    bp.purchase(PurchaseActivity.this, PRODUCT_ID_UN_LIMITED);
                }
            });
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        }
    
        @Override
        public void onBillingInitialized() {
            /*
             * Called when BillingProcessor was initialized and it's ready to purchase
             */
            btn_Purchase.setEnabled(true);
            btn_restore_purchase.setEnabled(true);
            btnUnlimited.setEnabled(true);
    
            bp.consumePurchase(PRODUCT_ID_100);
            bp.consumePurchase(PRODUCT_ID_20);
    
    
        }
    
        @Override
        public void onProductPurchased(String productId, TransactionDetails details) {
            /*
             * Called when requested PRODUCT ID was successfully purchased
             */
    
           if(productId==PRODUCT_ID_100)
           { SharedMemory.WritePrefernces(PurchaseActivity.this,KEY_AMOUNT,SharedMemory.ReadIntPreferences(PurchaseActivity.this,MyConstants.KEY_AMOUNT)+100);
               tvCoin.setText("Mevcut Kredi: "+String.valueOf(SharedMemory.ReadIntPreferences(PurchaseActivity.this,KEY_AMOUNT)));
            bp.consumePurchase(PRODUCT_ID_100);
    
           }  else if (productId==PRODUCT_ID_20)
           {
               SharedMemory.WritePrefernces(PurchaseActivity.this,KEY_AMOUNT, SharedMemory.ReadIntPreferences(PurchaseActivity.this,MyConstants.KEY_AMOUNT)+ 20);
               tvCoin.setText("Mevcut Kredi: "+String.valueOf(SharedMemory.ReadIntPreferences(PurchaseActivity.this,KEY_AMOUNT)));
    //           bp.consumePurchase(productId);
    //           bp.purchase(PurchaseActivity.this,productId);
               bp.consumePurchase(PRODUCT_ID_20);
    
           }
    
    
           else if (productId==PRODUCT_ID_UN_LIMITED) {
              BillingControl.WritePrefernces(PurchaseActivity.this,true);
               tvCoin.setText("Mevcut Kredi: Sınırsız");
           }
    
          //  btn_Purchase.setEnabled(false);
    
        }
    
        @Override
        public void onBillingError(int errorCode, Throwable error) {
            /*
             * Called when some error occurred. See Constants class for more details
             *
             * Note - this includes handling the case where the user canceled the buy dialog:
             * errorCode = Constants.BILLING_RESPONSE_RESULT_USER_CANCELED
             */
            if (errorCode==Constants.BILLING_RESPONSE_RESULT_USER_CANCELED)
            {
                Toast.makeText(this, getResources().getString(R.string.purchase_cancel), Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onPurchaseHistoryRestored() {
            /*
             * Called when purchase history was restored and the list of all owned PRODUCT ID's
             * was loaded from Google Play
             */
            Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
    
            bp.consumePurchase(PRODUCT_ID_100);
            bp.consumePurchase(PRODUCT_ID_20);
        }
    
    }
  • 10-01-2019, 01:51:43
    #2
    bp.consume...(......);
    bp.purschase...(....);

    Consume ilk, purchase 2. olarak alt alta ekleyin.

    OnCreate en basa (R.layout'tan sonra) billingproccesor initialize edin.
  • 10-01-2019, 01:55:55
    #3
    WebilisimNET adlı üyeden alıntı: mesajı görüntüle
    bp.consume...(......);
    bp.purschase...(....);

    Consume ilk, purchase 2. olarak alt alta ekleyin.

    OnCreate en basa (R.layout'tan sonra) billingproccesor initialize edin.
    O şekilde de denedim hocam çalışmıyor. Consumeyi yazmadigim kombinasyonu kalmadı. Billingpyi En başa da yazdım yine olmadı.
  • 10-01-2019, 01:59:57
    #4
    AwoApp adlı üyeden alıntı: mesajı görüntüle
    O şekilde de denedim hocam çalışmıyor. Consumeyi yazmadigim kombinasyonu kalmadı. Billingpyi En başa da yazdım yine olmadı.
    Initialize etmemissiniz.

    bp = BillingProcessor.newBillingProcessor(this, "YOUR LICENSE KEY FROM GOOGLE PLAY CONSOLE HERE", this);
    bp.initialize();

    Ardından tıklanacak butona soyle girin:

    bp.consumePurchase("YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");

    altına

    bp.purchase(YOUR_ACTIVITY, "YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");

    Bu şekilde çalışır.
  • 10-01-2019, 11:13:17
    #5
    Evet initialize ettikten sonra hocamın dediği gibi önce consume sonra purchase yaparsanız tam sizin istediğiniz şekilde çalışıyor
  • 10-01-2019, 12:51:31
    #6
    Mustafaayaz32 adlı üyeden alıntı: mesajı görüntüle
    Evet initialize ettikten sonra hocamın dediği gibi önce consume sonra purchase yaparsanız tam sizin istediğiniz şekilde çalışıyor
    WebilisimNET adlı üyeden alıntı: mesajı görüntüle
    Initialize etmemissiniz.

    bp = BillingProcessor.newBillingProcessor(this, "YOUR LICENSE KEY FROM GOOGLE PLAY CONSOLE HERE", this);
    bp.initialize();

    Ardından tıklanacak butona soyle girin:

    bp.consumePurchase("YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");

    altına

    bp.purchase(YOUR_ACTIVITY, "YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");

    Bu şekilde çalışır.
    Bu şekilde de denedim hocam çalışmıyor. Github sayfasında gördüm bu çözümü birkaç sorunda. Consumede sürekli false dönüyor. Test etmek için yeni bir proje açıp in app ekledim onda çalışıyor. Uygulamayı başkasına da test ettirince çalışıyor fakat ben de çalışmıyor
  • 10-01-2019, 13:14:26
    #7
    Üyeliği durduruldu
    Apk'nızı test ederken release modda çalıştırıyorsunuz değil mi ? "how to work on release mode android" diye Google'da aratarak gradleda gerekli değişiklikleri uygulayabilirsiniz.

    Bunun dışında Console'dan aldığınız purchase_id uygulama teste sunulduktan bir süre sonra aktif oluyor. Bir süre beklemeniz gerekebilir.

    Edit: Bu arada satın alma işlemi için release mode gerektiğinden eminim ancak consume için gerektiğinden emin değilim, yalnızca denemeniz için önerdim.