Помогите разобраться с in app billing

162
08 декабря 2019, 14:30

Пытаюсь встроить внутреннюю покупку в приложение. В общем по нажатии пункта меню из главного активити открывается DialogFragment в котором есть кнопка купить. Нажимаю эту кнопку первый раз - появляется платежное окно, в нем нажимаю купить, далее пишет что все отлично и ничего не происходит. Выхожу из приложения, захожу обратно – оно все равно в состоянии бесплатного, плюс к тому же когда пытаюсь нажать еще раз кнопку купить, то уже ничего не происходит и окно покупки не показывается. Что я делаю не так? Купить пытаюсь со своих двух аккаунтов на телефоне, вместо номера карты при покупке пишет "тестовая карта". Проблема из-за этого? Но почему на телефоне не сохраняется покупка? В гугл консоли она отмечается. Использую эту библиотеку https://github.com/serso/android-checkout

Код BuyFragment

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.solovyev.android.checkout.ActivityCheckout;
import org.solovyev.android.checkout.Billing;
import org.solovyev.android.checkout.Checkout;
import org.solovyev.android.checkout.EmptyRequestListener;
import org.solovyev.android.checkout.Inventory;
import org.solovyev.android.checkout.ProductTypes;
import org.solovyev.android.checkout.Purchase;
import javax.annotation.Nonnull;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import butterknife.BindView;
public class BuyFragment extends DialogFragment implements View.OnClickListener {
    private Button btnBuy;
    private TextView tvTitle, tvInfo;
    private ActivityCheckout mCheckout;

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_buy, container, false);
        tvTitle = view.findViewById(R.id.tvTitle);
        tvInfo = view.findViewById(R.id.tvInfo);
        btnBuy = view.findViewById(R.id.btnBuy);
        btnBuy.setOnClickListener(this);
        final Billing billing = DoNotForgetApplication.get(getActivity()).getBilling();
        mCheckout = Checkout.forActivity(getActivity(), billing);
        mCheckout.start();
        mCheckout.loadInventory(Inventory.Request.create().loadAllPurchases(), new BuyFragment.InventoryCallback());
        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnBuy:
                Log.i(Constants.INFO.TAG, "Нажата кнопка купить");
                mCheckout.startPurchaseFlow(ProductTypes.IN_APP, Constants.INFO.SKUS_NAME, null, new PurchaseListener());
                break;
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        mCheckout.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onDestroy() {
        mCheckout.stop();
        super.onDestroy();
    }

    private void refreshFragment() {
        Log.i(Constants.INFO.TAG, "Обновление интерфейса");
        btnBuy.setVisibility(View.GONE);
        tvTitle.setVisibility(View.GONE);
        tvInfo.setText("Отлично! Теперь перезагрузите приложение.");
    }

    private class PurchaseListener extends EmptyRequestListener<Purchase> {
        @Override
        public void onSuccess(@Nonnull Purchase purchase) {
            Log.i(Constants.INFO.TAG, "Приложение куплено");
            Toast.makeText(getContext(), "Приложение куплено", Toast.LENGTH_SHORT).show();
            refreshFragment();
        }
    }

    // проверка покупки
    private class InventoryCallback implements Inventory.Callback {
        @Override
        public void onLoaded(@Nonnull Inventory.Products products) {
            final Inventory.Product product = products.get(ProductTypes.IN_APP);
            if (!product.supported) {
                Log.i(Constants.INFO.TAG, "Магазин поддерживается");
                // billing is not supported, user can't purchase anything. Don't show ads in this case
                return;
            }
            if (product.isPurchased(Constants.INFO.SKUS_NAME)) {
                Log.i(Constants.INFO.TAG, "Приложение куплено");
            } else
                Log.i(Constants.INFO.TAG, "Приложение не куплено");
        }
    }

    public void onDismiss(@NonNull DialogInterface dialog) {
        super.onDismiss(dialog);
    }
    public void onCancel(@NonNull DialogInterface dialog) {
        super.onCancel(dialog);
    }
}

Код Application

public class DoNotForgetApplication extends Application {
    @Nonnull
    private final Billing mBilling = new Billing(this, new Billing.DefaultConfiguration() {
        @Nonnull
        @Override
        public String getPublicKey() {
            final String s = "здесь вставлен код с консоли";
            return Encryption.decrypt(s, "world");
        }
    });

    /**
     * Returns an instance of {@link DoNotForgetApplication} attached to the passed activity.
     */
    public static DoNotForgetApplication get(Activity activity) {
        return (DoNotForgetApplication) activity.getApplication();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mBilling.addPlayStoreListener(new PlayStoreListener() {
            @Override
            public void onPurchasesChanged() {
                Toast.makeText(DoNotForgetApplication.this, "Play Store: purchases have changed!", Toast.LENGTH_LONG).show();
            }
        });
    }

    @Nonnull
    public Billing getBilling() {
        return mBilling;
    }
}
READ ALSO
Как работает аннотация @Inject?

Как работает аннотация @Inject?

Я новичок только учу @InjectЯ не очень понимаю, как он работает

116
Права доступа к папке в Android

Права доступа к папке в Android

В ходе работы приложения создаю папку и помещаю туда фото с камеры

137
Hibernate. NoClassDefFoundError

Hibernate. NoClassDefFoundError

У меня есть Maven проект на 2 модуляВо втором модуле я поставил Hibernate

140
Как создавать папку в папке

Как создавать папку в папке

Хотел бы узнать, как можно создать папку в папке, вызывая одну функцию

136