Примеры для AndroidPublisher (V3) клиентской библиотеки Google API для Java
Я обновляю библиотеку AndroidPublisher с версии v1 до версии v3 для моего защищенного внутреннего сервера. Библиотека AndroidPublisher (v3) позволяет мне безопасно выполнять проверку и подтверждение покупок на стороне сервера для покупок в приложении и подписки.
Существующий код для v1 больше не совместим. Библиотека v3 выглядит лучше, но я не смог найти пример кода для:
- Создайте учетные данные клиента с помощью клиента JSON.
Get
&Acknowledge
Покупки с использованием PurchaseToken.
Maven настройки:
<project>
<dependencies>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-androidpublisher</artifactId>
<version>v3-rev103-1.25.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.30.2</version>
</dependency>
</dependencies>
</project>
Документация по API: https://developers.google.com/android-publisher/api-ref/purchases/products/get
Ищете пример, подобный этому: https://developers.google.com/api-client-library/java/google-api-java-client/samples
Любой короткий пример кода будет отличной помощью.
3 ответа
Добавить следующие зависимости
compile "com.google.apis:google-api-services-androidpublisher:v3-rev103-1.25.0"
compile "com.google.auth:google-auth-library-oauth2-http:0.17.1"
Затем включите библиотеку Google Developer Play Api из Google Cloud Console здесь
В учетных данных Создать ключ учетной записи службы с ролью Pub/Sub Admin
и сохраните файл json
В консоли разработчика Google здесь. ВSettings >> Developer Account >> API Access
свяжите свое приложение.
Затем в коде выполните следующие действия, чтобы получить информацию о подписке.
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("<service-account-key-file>.json")).createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER);
AndroidPublisher pub = new AndroidPublisher.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
new HttpCredentialsAdapter(credentials)
).setApplicationName("<app-name>").build();
SubscriptionPurchase purchase = pub.purchases().subscriptions().get(
"<app-package>",
"<subscription-id>",
"<purchase-token>"
).execute();
println(purchase);
Примечание: если вы получите эту ошибку:
У текущего пользователя недостаточно прав для выполнения запрошенной операции.
Затем попробуйте еще раз через один день, потому что после включения API разработчика Google Play и создания ключа учетной записи службы с консоли Google вам нужно подождать от 24 до 48 часов, а также выполнить следующие действия
Из консоли Google Play перейдите (с правами администратора):
- Настройка (левая панель) Учетная запись разработчика (левая панель) Пользователи и разрешения (левая панель)
- Нажмите кнопку "Пригласить нового пользователя".
- Введите адрес электронной почты учетной записи службы (такой же, как в используемом вами json-файле, и который был создан Google при создании учетной записи службы)
- Выберите "Администратор" в раскрывающемся меню "Роль".
- Нажмите ОТПРАВИТЬ ПРИГЛАШЕНИЕ
Документация Google здесь ужасна, нет четких примеров реализации. Я наконец нашел ответ после МНОГО гугления благодаря ответу @Sabeeh и множеству других фрагментов, разбросанных в Интернете.
1. Первый шаг — добавить зависимости:
implementation "com.google.apis:google-api-services-androidpublisher:v3-rev142-1.25.0" // Update based on latest release
implementation "com.google.auth:google-auth-library-oauth2-http:1.12.1" // Update based on latest release
2. Выполните следующие действия , чтобы связать консоль Google Play с Google Play Developer API (выберите «Использовать учетную запись службы», а не «Использовать клиенты OAuth» и следуйте до пункта «Дополнительная информация»).
3. Загрузите файл службы JSON из своей учетной записи службы Google Cloud (щелкните учетную запись, которую вы настроили на предыдущем шаге). Вы можете найти/создать этот файл в разделе «Управление ключами» или на вкладке «Ключи». Добавьте экспортированный файл JSON в папку с ресурсами в Android.
4. Затем вы можете вызвать API разработчика Google Play для запроса таких подписок (важно вызывать из потока, не работает из потока пользовательского интерфейса, не знаю, почему):
new Thread(() -> {
InputStream inputStream = context.getAssets().open("service_account_google_play.json"); // JSON file from step 3
GoogleCredentials credentials = GoogleCredentials.fromStream(inputStream)
.createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER);
AndroidPublisher androidPublisher = new AndroidPublisher(
new NetHttpTransport(),
JacksonFactory.getDefaultInstance(),
new HttpCredentialsAdapter(credentials)
);
SubscriptionPurchase purchase = androidPublisher.purchases().subscriptions().get(
context.getPackageName(), subscriptionId, purchaseToken
).execute();
// Do with the purchase object what you want here
}).start();
Рискуя быть слишком описательным, подписка — это идентификатор вашей подписки в Play Console (например, «subscription_monthly» или как вы его назвали), а PurchaseToken — это токен, который вы получаете от токена Purchase после запроса BillingClient (запрос подписки подробно описано здесь).
Дайте мне знать, если что-то непонятно или пока не работает. Мне потребовалось 6 часов, чтобы понять, и я рад избавить других от этой боли.
@Sabeeh ответ работает.
Вот пример того, как получить (на стороне сервера) покупку с использованием токена и идентификатора продукта в kotlin:
suspend fun playstoreVerifier(productId: String, token: String) = withContext(Dispatchers.IO){
androidPublisher.Purchases().products().get(PACKAGE_NAME, productId, token).execute()?.let {
println("ack ${it.acknowledgementState}")
}
}