- PVSM.RU - https://www.pvsm.ru -

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

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

Подготовка

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

  • Загрузить исходный код из 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'
    
  • Загрузить нужный архив из репозитория [3]

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

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

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

Библиотека содержит 3 основных класса: Billing [4], Checkout [5] и Inventory [6].

Класс Billing обрабатывает запросы на покупку (см. методы IInAppBillingService.aidl [7]) и управляет подкючением к сервису 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 [8]. Там же вы найдёте исходный код тестового приложения (само приложение может быть установлено из Google Play [9]). Всё под лицензией Apache License, Version 2.0 [10].

Заключение

В библиотеке есть над чем работать (например, не хватает покрытия тестами, и было бы неплохо иметь процедуру миграции из одной популярной библиотеки [11]). Но в целом, ей уже можно пользоваться в продакшене, что я и делаю в своём приложении Say it right! [12].
Вопросы и пожелания приветствуются в комментариях к статье, а также в багтрекере [13] на гитхабе.

Автор: serso

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/67810

Ссылки в тексте:

[1] Android In-App Billing v.3: http://developer.android.com/google/play/billing/api.html

[2] Volley: https://android.googlesource.com/platform/frameworks/volley/

[3] репозитория: https://oss.sonatype.org/content/repositories/releases/org/solovyev/android/checkout/

[4] Billing: https://github.com/serso/android-checkout/blob/master/lib/src/main/java/org/solovyev/android/checkout/Billing.java

[5] Checkout: https://github.com/serso/android-checkout/blob/master/lib/src/main/java/org/solovyev/android/checkout/Checkout.java

[6] Inventory: https://github.com/serso/android-checkout/blob/master/lib/src/main/java/org/solovyev/android/checkout/Inventory.java

[7] IInAppBillingService.aidl: https://github.com/serso/android-checkout/blob/master/lib/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl

[8] github: https://github.com/serso/android-checkout

[9] Google Play: https://play.google.com/store/apps/details?id=org.solovyev.android.checkout.app

[10] Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0

[11] одной популярной библиотеки: https://github.com/robotmedia/AndroidBillingLibrary

[12] Say it right!: https://play.google.com/store/apps/details?id=org.solovyev.android.dictionary.forvo

[13] багтрекере: https://github.com/serso/android-checkout/issues

[14] Источник: http://habrahabr.ru/post/233265/