Библиотека для совершения покупок внутри приложений (Android In-App Billing v.3)

от автора


Checkout («касса», «кассовый аппарат») — это библиотека для совершения покупок внутри приложений на базе Android In-App Billing v.3. Основная цель — уменьшить время разработчика, затрачиваемое на внедрение платежей в Андроид приложения. Проект был вдохновлён библиотекой Volley, и проектировался для того, чтобы быть максимально простым в использовании, быстрым и гибким.

Подготовка

Существует несколько способов подключить библиотеку в проект:

  • Загрузить исходный код из github репозитория и скопировать его в свой проект
  • Для пользователей Maven использовать следующую зависимость:
    <dependency>     <groupId>org.solovyev.android</groupId>     <artifactId>checkout</artifactId>     <version>x.x.x</version> </dependency> 
  • Для пользователей Gradle использовать следующую зависимость:
    compile 'org.solovyev.android:checkout:x.x.x@aar' 
  • Загрузить нужный архив из репозитория

Библиотека требует com.android.vending.BILLING разрешение (permission).
Если вы подключили библиотеку как зависимость (например, в Maven или Gradle), то дополнительно делать ничего не надо. В противном случае, нужно добавить следующую строчку в AndroidManifest.xml:

<uses-permission android:name="com.android.vending.BILLING" />

Использование

Библиотека содержит 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!.
Вопросы и пожелания приветствуются в комментариях к статье, а также в багтрекере на гитхабе.

ссылка на оригинал статьи http://habrahabr.ru/post/233265/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *