Примеры для AndroidPublisher (V3) клиентской библиотеки Google API для Java

Я обновляю библиотеку AndroidPublisher с версии v1 до версии v3 для моего защищенного внутреннего сервера. Библиотека AndroidPublisher (v3) позволяет мне безопасно выполнять проверку и подтверждение покупок на стороне сервера для покупок в приложении и подписки.

Существующий код для v1 больше не совместим. Библиотека v3 выглядит лучше, но я не смог найти пример кода для:

  1. Создайте учетные данные клиента с помощью клиента JSON.
  2. 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 перейдите (с правами администратора):

  1. Настройка (левая панель) Учетная запись разработчика (левая панель) Пользователи и разрешения (левая панель)
  2. Нажмите кнопку "Пригласить нового пользователя".
  3. Введите адрес электронной почты учетной записи службы (такой же, как в используемом вами json-файле, и который был создан Google при создании учетной записи службы)
  4. Выберите "Администратор" в раскрывающемся меню "Роль".
  5. Нажмите ОТПРАВИТЬ ПРИГЛАШЕНИЕ

Документация 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}")
        }
    }
Другие вопросы по тегам