Библиотека для совершения покупок внутри приложений (Android In-App Billing v.3)
Checkout («касса», «кассовый аппарат») — это библиотека для совершения покупок внутри приложений на базе Android In-App Billing v. 3. Основная цель — уменьшить время разработчика, затрачиваемое на внедрение платежей в Андроид приложения. Проект был вдохновлён библиотекой Volley, и проектировался для того, чтобы быть максимально простым в использовании, быстрым и гибким.Существует несколько способов подключить библиотеку в проект: Загрузить исходный код из github репозитория и скопировать его в свой проект
Для пользователей Maven использовать следующую зависимость:
Библиотека содержит 3 основных класса: Billing, Checkout и Inventory.Класс Billing обрабатывает запросы на покупку (см. методы IInAppBillingService.aidl) и управляет подкючением к сервису Google Play. Этот класс лучше всего использовать как синглтон, для того чтобы все запросы выстраивались в одну очередь и использовали один кеш. Например, класс приложения может выглядеть следующим образом:
public class MyApplication extends Application { /** * For better performance billing class should be used as singleton */ @Nonnull private final Billing billing = new Billing (this, new Billing.Configuration () { @Nonnull @Override public String getPublicKey () { return «Your public key, don’t forget to encrypt it somehow»; }
@Nullable @Override public Cache getCache () { return Billing.newCache (); } });
/** * Application wide {@link org.solovyev.android.checkout.Checkout} instance (can be used anywhere in the app). * This instance contains all available products in the app. */ @Nonnull private final Checkout checkout = Checkout.forApplication (billing, Products.create ().add (IN_APP, asList («product»)));
@Nonnull private static MyApplication instance;
public MyApplication () { instance = this; }
@Override public void onCreate () { super.onCreate (); billing.connect (); }
public static MyApplication get () { return instance; }
@Nonnull public Checkout getCheckout () { return checkout; }
//… } Класс Billing можно использовать для выполнения запросов напрямую, но чаще удобнее использовать посредника — класс Checkout. Последний добавляет к каждому запросу тег, по которому запрос может быть отменён, что может быть полезным, например, в Activity. Checkout позволяет загрузить текущее состояние покупок через метод Checkout#loadInventory (). Также Checkout, а точнее его наследник ActivityCheckout, предоставляет доступ к PurchaseFlow, который в свою очередь осуществляет действия, нужные для покупки. Код класса Activity, в котором отображается список покупок, и который позволяет совершать покупки, представлен ниже: public class MyActivity extends Activity { @Nonnull private final ActivityCheckout checkout = Checkout.forActivity (this, MyApplication.get ().getCheckout ());
@Nonnull private Inventory inventory;
@Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); checkout.start (); // you only need this if this activity starts purchase process checkout.createPurchaseFlow (new PurchaseListener ()); // you only need this if this activity needs information about purchases/SKUs inventory = checkout.loadInventory (); inventory.whenLoaded (new InventoryLoadedListener ()) }
@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { super.onActivityResult (requestCode, resultCode, data); checkout.onActivityResult (requestCode, resultCode, data); }
@Override protected void onDestroy () { checkout.stop (); super.onDestroy (); }
//… }
Исходный код доступен в моём репозитории на github. Там же вы найдёте исходный код тестового приложения (само приложение может быть установлено из Google Play). Всё под лицензией Apache License, Version 2.0. В библиотеке есть над чем работать (например, не хватает покрытия тестами, и было бы неплохо иметь процедуру миграции из одной популярной библиотеки). Но в целом, ей уже можно пользоваться в продакшене, что я и делаю в своём приложении Say it right!.Вопросы и пожелания приветствуются в комментариях к статье, а также в багтрекере на гитхабе.
