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