Покупки в приложении
Автоматическая верификация и отправка информации о покупке
Начиная с Appodeal SDK 3.7.0+, появилась возможность автоматически верефицировать и отправлять информацию о покупках/подписках в Appodeal, а также получать информацию о покупках из Appodeal SDK с помощью Appsflyer.
Чтобы активировать эту функцию, свяжитесь с нами по электронной почте [email protected] или в чате и попросите включить функцию roi360.
Автоматическая проверка покупок работает с версиями Google Play Billing Library 5-7.
Добавьте следующую зависимость в build.gradle на уровне модуля:.
- Kotlin
- Groovy
buildscript {
dependencies {
// ... остальные зависимости проекта
implementation("com.android.billingclient:billing:5.0.0")
// или
implementation("com.android.billingclient:billing-ktx:5.0.0")
}
}
buildscript {
dependencies {
// ... остальные зависимости проекта
implementation 'com.android.billingclient:billing:5.0.0'
// или
implementation 'com.android.billingclient:billing-ktx:5.0.0'
}
}
Для автоматической проверки покупок вам необходимо сгенерировать и предоставить нашей команде JSON-ключ из Google Cloud Platform, а также настроить возможность получения информации о покупках из Google Play Developer Console.
Для этого вам необходимо выполнить следующие шаги:
Шаг 1. Свяжите аккаунт разработчика Google Play с проектом Google Cloud.
- В Google Play Console перейдите к своему аккаунту разработчика Google Play.
- Свяжите аккаунт с проектом Google Cloud. Инструкции в этой справке Google.
- Включите Google Play API для разработчиков. Инструкции в этой справке Google.
Шаг 2. Настройка учетной записи службы в облачной платформе Google
Необходимые у словия: Доступ к Google Cloud Platform.
Чтобы настроить учетную запись службы:
2.1 Создайте или найдите аккаунт службы:
- В Google Cloud Platform перейдите в раздел Service accounts и нажмите Create Service Account.
- Заполните данные учетной записи сервиса.
- Скопируйте адрес электронной почты и нажмите Create and continue.
Это письмо вы должны пригласить в Google Play Console (см. ниже).
- На шаге Grant this service account access to the project выберите роль подписчика Pub/sub, после чего нажмите кнопку Done.
2.2 Загрузите json ключ сервисного аккаунта:
В Google Cloud Platform перейдите в раздел Service accounts, найдите нужный вам аккаунт (тот, который вы только что создали) в списке и нажмите на значок More actions.
- Нажмите Manage keys.
- Нажмите Add key > Create new key.
- Во всплывающем окне Create private key в разделе Key type, выберите JSON и нажмите Create.
- Нажмите Create. JSON ключ будет загружен.
Сохраните файл ключа JSON, который позже будет загружен в AppsFlyer.
:::примечание Вы должны сохранить ключ; позже его нельзя будет получить. Если вы не сохраните его, вам придется создать совершенно новый ключ. Пожалуйста, поделитесь этим JSON-файлом с командой Appodeal. Он понадобится нам для подключения Google Play Console к нашему аккаунту Appsflyer. :::
Шаг 3. Настройка разрешений доступа к API в Google Play Console
Необходимые условия: Доступ к Google Play Console.
После установки учетных данных и разрешений учетной записи службы может пройти некоторое время (иногда даже 24 часа). чтобы получить возможность их использовать. Это может привести к появлению ошибок на последующих шагах.
Чтобы предоставить доступ к API в Google Play Console:.
- В Консоли Google Play перейдите в раздел Users and permissions, найдите созданный вами аккаунт службы и нажмите Invite new users.
- Введите Email address, который вы скопировали при настройке учетной записи службы в шаге 2.1.3.
- В разделе Permissions перейдите на вкладку Account permissions и выберите следующее:
-
View app information and download bulk reports(read-only)
-
View financial data, orders, and cancellation survey responses.
-
Manage orders and subscriptions.
- Нажмите Invite user.
- В всплывающем окне нажмите Send invite.
Шаг 4. Отправка уведомлений Google Play непосредственно в AppsFlyer
Необходимые условия: Доступ к Google Play Console и пользовательскому интерфейсу AppsFlyer.
- В разделе Google Play Console > Home выберите просмотр вашего приложения. Откроется приборная панель.
- Перейдите в раздел Monetize with Play > Monetization setup и в разделе Google Play Billing section убедитесь, что Enable real-time notification.
- В поле Topic name вставьте адрес AppsFlyer: projects/appsflyer-ars/topics/subscription-events.
- Для Notification content, выберите Subscriptions, voided purchases, and all one-time products.
- Нажмите Save changes.
Для того чтобы изменения вступили в силу, может потребоваться время (иногда даже 24 часа). Поэтому подождите, прежде чем тестировать.
Шаг 5. Свяжитесь с нами
После выполнения всех шагов свяжитесь с нашей службой поддержки по электронной почте [email protected] или в чате, предоставив следующую информацию:
- Приложение, для которого вы хотите включить функцию roi360.
- JSON-файл учетной записи сервиса из Шага 2.2;
Дополнительно. Шаг 6 Настройка обратного вызова AppodealPurchaseCallback
После включения и настройки автоматической верификации покупок, когда в вашем приложении будет совершена покупка через библиотеку Google Billing, Appodeal SDK будет автоматически определять, верефицировать и отправлять данные о покупке в приложении/подписке в Appodeal Dashboard. Если вы хотите получать информацию о покупке в своем приложении, вам просто нужно вызвать метод:
- Kotlin
- Java
Appodeal.setPurchaseListener(object: AppodealPurchaseListener{
override fun onPurchaseReceived(successPurchases: List<Map<String, Any>>) {
Log.d("Appodeal App", "onPurchaseReceived: $successPurchases");
}
override fun onPurchaseFailed(reason: Throwable, failedPurchases: List<Map<String, Any>>?) {
Log.d("Appodeal App", "Message: ${reason.message} failedPurchases: $failedPurchases");
}
})
Appodeal.setPurchaseListener(new AppodealPurchaseListener() {
@Override
public void onPurchaseReceived(@NonNull List<Map<String, Object>> successPurchases) {
Log.d("Appodeal App", "onPurchaseReceived: " + successPurchases);
}
@Override
public void onPurchaseFailed(@NonNull Throwable reason,
@Nullable List<Map<String, Object>> failedPurchases) {
Log.d("Appodeal App", "Message: " + reason.getMessage() + " failedPurchases: " + failedPurchases);
}
});
}
Объект покупки, который вы получаете в onPurchaseReceived/onPurchaseFailed, представляет собой список объектов
- для InApps покупки:
| Параметр | Описание |
|---|---|
| purchase_token | Токен полученной покупки |
| product_ids | Список идентификаторов покупки |
| product_type | Тип покупки inapp/subs |
| purchase_time | Временная метка покупки |
| package_name | Пакет приложения, в котором была совершена покупка |
| one_time_purchase_offer_details | Map деталей покупки, содержит «formatted_price», long «price_amount_micros», «price_currency_code» |
| quantity | Количество элементов покупки |
| order_id | Идентификатор заказа полученной покупки |
| region_code | Код страны полученной покупки |
- для Subscription покупки:
| Параметр | Описание |
|---|---|
| purchase_token | Токен полученной подписки |
| product_ids | Список идентификаторов подписки |
| product_type | Тип покупки inapp/subs |
| purchase_time | Timestamp покупки |
| subscription_offer_details | Список карт, содержащих детали предложений подписки, такие как «base_plan_id», «offer_tags», «offer_token», «pricing_phases» |
| package_name | Пакет приложения, в котором была совершена покупка |
| one_time_purchase_offer_details | Map деталей покупки, содержит «formatted_price», long «price_amount_micros», «price_currency_code» |
| latest_order_id | Идентификатор заказа полученной подписки |
| subscription_state | Текущее состояние описания, например: active |
| start_time | Дата начала подписки |
| expiry_time | Дата истечения срока действия подписки |
На этом подключение автоматических покупок полностью завершено.
Отчеты о покупках будут автоматически загружаться в Личный кабинет 2 раза в день
Ручная верификация и отправка информации о покупке
Отслеживание покупок в приложении будет работать только при подключении к Adjust или AppsFlyer. Чтобы подключить их, следуйте этому руководству для Adjust и этому руководству для AppsFlyer.
Можно отслеживать информацию о покупках в приложении и отправлять информацию на серверы Appodeal для аналитики. Это позволяет группировать пользователей по факту покупки. Это поможет вам настроить рекламу для таких пользователей или просто отключить ее, если это необходимо. Чтобы эта настройка работала правильно, отправьте информацию о покупке через Appodeal SDK.
Шаг 1. Отслеживание Покупок В Приложении
Чтобы отслеживать покупки в приложении, Appodeal SDK потребуется информация о покупке, предоставляемая Google Play Billing Library
Добавьте следующую зависимость в файл build.gradle на уровне модуля:
- Kotlin
- Groovy
buildscript {
dependencies {
// ... остальные зависимости проекта
implementation("com.android.billingclient:billing:5.0.0")
// или
implementation("com.android.billingclient:billing-ktx:5.0.0")
}
}
buildscript {
dependencies {
// ... остальные зависимости проекта
implementation 'com.android.billingclient:billing:5.0.0'
// или
implementation 'com.android.billingclient:billing-ktx:5.0.0'
}
}
Получите объекты Purchase и SkuDetails из Google Play Billing Library используя это руководство. Получите цену и валюту из SkuDetails.
Создайте и подтвердите покупку в приложении используя метод ниже:
- Kotlin
- Java
// Объект покупки возвращается Google API в обратном вызове onPurchasesUpdated()
fun validatePurchase(purchase: Purchase) {
// Создаем новую InAppPurchase с типом
val inAppPurchase: InAppPurchase = InAppPurchase.newBuilder(type = InAppPurchase.Type.InApp)
.withPublicKey("YOUR_PUBLIC_KEY")
.withSignature(purchase.signature)
.withPurchaseData(purchase.originalJson)
.withPurchaseToken(purchase.purchaseToken)
.withPurchaseTimestamp(purchase.purchaseTime)
.withDeveloperPayload(purchase.developerPayload)
.withOrderId(purchase.orderId)
.withSku(...) // Идентификатор единицы хранения из Google API
.withPrice(...) // Цена
.withCurrency(...) // Валюта
.withAdditionalParams(...) // Appodeal In-app event при необходимости
.build()
// Валидация покупки
Appodeal.validateInAppPurchase(context = context, purchase = inAppPurchase, callback = object : InAppPurchaseValidateCallback {
override fun onInAppPurchaseValidateSuccess(purchase: InAppPurchase, errors: List<ServiceError>?) {
// Валидация покупки в приложении была успешно подтверждена как минимум одним подключенным сервисом
}
override fun onInAppPurchaseValidateFail(purchase: InAppPurchase, errors: List<ServiceError>) {
// Валидация покупки в приложении была завершена с ошибкой всеми подключенными сервисами
}
})
}
// Объект покупки возвращается Google API в обратном вызове onPurchasesUpdated()
public void validatePurchase(Purchase purchase) {
// Создаем новую InAppPurchase с типом
InAppPurchase inAppPurchase = InAppPurchase.newBuilder("PURCHASE_TYPE")
.withPublicKey("YOUR_PUBLIC_KEY")
.withSignature(purchase.getSignature())
.withPurchaseData(purchase.getOriginalJson())
.withPurchaseToken(purchase.getPurchaseToken())
.withPurchaseTimestamp(purchase.purchaseTime)
.withDeveloperPayload(purchase.getDeveloperPayload())
.withOrderId(purchase.getOrderId())
.withSku(...) // Идентификатор единицы хранения из Google API
.withPrice(...) // Цена
.withCurrency(...) // Валюта
.withAdditionalParams(...) // Appodeal In-app event при необходимости
.build()
// Валидация покупки
Appodeal.validateInAppPurchase(this, inAppPurchase, new InAppPurchaseValidateCallback() {
@Override
public void onInAppPurchaseValidateSuccess(@NonNull InAppPurchase purchase, @Nullable List<ServiceError> errors) {
// Валидация покупки в приложении была успешно подтверждена как минимум одним подключенным сервисом }
}
@Override
public void onInAppPurchaseValidateFail(@NonNull InAppPurchase purchase, @NonNull List<ServiceError> errors) {
// Валидация покупки в приложении была завершена с ошибкой всеми подключенными сервисами
}
});
}
Убедитесь, что если вы создали продукт в приложении в разделе Google Play Console → Монетизация, то используете:
- InAppPurchase.Type.InApp - для покупки в приложении
- InAppPurchase.Type.Subs - для подписки в приложении
| Parameter | Description | Usage |
|---|---|---|
| purchaseType | Тип покупки. Должен быть InAppPurchase.Type.InApp или InAppPurchase.Type.Subs. | Adjust/AppsFlyer |
| publicKey | Публичный ключ из Google Developer Console. | AppsFlyer |
| signature | Подпись транзакции (возвращается из Google API после завершения покупки). | Adjust/AppsFlyer |
| purchaseData | Продукт, приобретенный в формате JSON (возвращается из Google API после завершения покупки). | AppsFlyer |
| purchaseToken | Токен приобретенного продукта (возвращается из Google API после завершения покупки). | Adjust |
| purchaseTimestamp | Отметка времени покупки продукта (возвращается из Google API после завершения покупки). | Adjust |
| developerPayload | Полезная нагрузка разработчика в приобретенном продукте (возвращается из Google API после завершения покупки). | Adjust |
| orderId | Уникальный идентификатор заказа для транзакции приобретенного продукта (возвращается из Google API после завершения покупки). | Adjust |
| sku | Идентификатор единицы хранения из Google API. | Adjust |
| price | Доход от события в приложении. | Adjust/AppsFlyer/Appodeal |
| currency | Валюта события в приложении. | Adjust/AppsFlyer/Appodeal |
| additionalParameters | Дополнительные параметры внутриигрового события. |
Если вы используете ваш собственный Adjust аккаунт вам необходимо выполнить Шаг 2 из этого руководства по Отслеживанию событий и создать необходимые события на стороне Adjust.
Шаг 2. Создайте Файл Json В Google Cloud
- Войдите в Google Cloud со своими учетными данными;
- Выберите Google Play Console Developer project в левом верхнем углу, как показано ниже.
Убедитесь, что на этом шаге выбран Google Play Console Developer project, а не конкретный проект вашего приложения. Google Play Console позволяет связывать только облачные проекты Google Play Console Developer (позже на шаге 3).
- Выберите Credentials → Create Credentials → Service Account;
- Выберите Viewer в качестве роли для Service Account и нажмите Done;
- Перейдите в ваш service account и нажмите keys → Add key → выберите JSON → отправьте нам файл JSON на электронную почту [email protected] или в чате.
Шаг 3. Добавьте Необходимые Разрешения В Google Play Console
-
Перейдите в ** Google Play Console** и авторизуйтесь;
-
Перейдите в Google Play Console → Manage developer accounts → Выберите Developer account →
Setup → API Access и выберите свой проект Google Play Console Developer из шага 2, где вы создали свой Service Account;
Если вы не видите Google Play Console Developer project в списке, обновите веб-страницу.
Если проблема не устранена, убедитесь, что ваша учетная запись разработчика Google Play (адрес электронной почты) является владельцем проекта Google Cloud. Вы можете прочитать больше здесь.
- Внизу будет список ваших Service Accounts, которые доступны в этом проекте Google Cloud. Выберите тот, с которого был отправлен JSON;
Нажмите Refresh, если вы не видите свою учетную запись Service Account.
-
Выберите View Play Console Permissions. В разделе App Permissions выберите необходимые приложения, в которых будут использоваться внутренние события;
-
Перейдите в раздел Account Permissions и выберите все разрешения для Financial Data:
- View financial data
- Manage Orders, subscriptions
Шаг 4. Свяжитесь С Нами
После выполнения всех шагов свяжитесь с нашей службой поддержки по электронной почте [email protected] или в чате со следующей информацией:
- JSON-файл вашего Service Account;
- Логика реализации покупок в вашем пр иложении (когда и где вы вызываете метод валидации покупок и валидируете покупки);
- Предоставьте нам доступ для тестирования покупки через Google Developer console по электронной почте [email protected];
- Ваш apk файл в архиве zip для тестирования.
Шаг 5. Тестирование
После того как вы связались с нашей службой поддержки и предоставили всю необходимую информацию, вы можете протестировать свое приложение, чтобы убедиться, что покупки валидированы.
- Перейдите по пути App Settings → Attribution Settings → и измените Adjust Environment с Production на Sandbox, чтобы протестировать валидацию покупок и не забудьте нажать Save в конце страницы;
- Подключите ваше устройство к компьютеру с открытой консолью (Android Studio logcat) и отсортируйте логи по слову purchase;
-
Теперь вы можете открыть свое приложение и совершить пробную покупку. Если в консоли отображается надпись Valid Purchase, значит, валидация прошла успешно;
-
Если валидация не прошла успешно, то повторите все шаги, описанные выше, и убедитесь, что предоставленный JSON файл корректный и все шаги выполнены;
-
После тестирования, смените ваш Adjust Environment на Production по пути App Settings → Attribution Settings.