Неверный запрос (недопустимое значение) при попытке получить информацию о покупках из приложения с помощью API Google Play Developer v3 с действительным токеном покупки - PullRequest
0 голосов
/ 05 июня 2019

При использовании Java Google Play Developer API (версия 3) и запросе информации о покупке для действительного токена покупки, я получаю следующее исключение.Вызов API возвращает ответ 400 Bad Request со следующим сообщением.

{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Invalid Value",
    "reason" : "invalid"
  } ],
  "message" : "Invalid Value"
}

К сожалению, дальнейшая информация отсутствует.Я не знаю, какое значение является недействительным.

Сначала мы связались со службой поддержки Google по этому поводу.К сожалению, мы почти два месяца поддерживаем службу Google, и они до сих пор даже не сообщили, что правильно понимают, в чем заключается наша проблема.Каждый раз, когда они отвечают, они дают нам предложения, которые буквально не имеют ничего общего с Google Play Developer API, даже после подробного объяснения проблемы несколько раз.Это самый разочаровывающий опыт поддержки за последние 20 лет.Поддержка Google явно здесь не поможет.

Во-вторых, мы успешно связали нашу учетную запись Google Play и наш бэкэнд.Все необходимые настройки завершены и работают.На нашем сервере мы получаем уведомления от Google Play, когда совершается покупка в приложении для Android, и эти уведомления включают токен покупки.Это потребовало значительных усилий, но я уверен, что теперь все правильно, наша учетная запись службы настроена правильно, и все разрешения и тому подобное хороши.

Я могу успешно вызвать API, который возвращает списокдоступные в приложении покупки товаров.Я получаю полный и правильный список продуктов, которые мы настроили в Google Play, чтобы пользователи могли покупать их в нашем приложении.Чтобы сделать этот вызов, мы должны предоставить учетные данные, и я предполагаю, что сервер проверяет эти учетные данные, когда мы делаем этот вызов.Поскольку я могу успешно выполнить этот вызов, я предполагаю, что «Недопустимое значение» не связано с нашими учетными данными.Мы используем созданный Google файл JSON, созданный для конкретной учетной записи службы (не использующий файл p12).

Я искал StackOverflow, а остальная часть Интернета искала информацию по этой проблеме.Я нашел много страниц, указывающих на ту же или похожую проблему, но с использованием более старой версии Google Play Developer API, которая, по-видимому, действовала иначе.Предлагаемые решения, похоже, не относятся к v3 API.Я искал много недель и пробовал разные решения, с которыми столкнулся, но безуспешно.

Я написал тестовое приложение, которое я запускаю на своем локальном ПК, которое работает, когда я запрашиваю список продуктов в приложении, но не работает, когда запрашивается информация о покупке для данного токена покупки.Я пробовал много разных токенов покупки.Я прочитал, что тестовые токены на самом деле недопустимы для использования с этим конкретным API, поэтому я фактически выпустил сборку нашего приложения, с которой я могу совершить реальную, реальную покупку.Я сделал это, получил оплату от Google, и наш бэкэнд получил реальные и действительные токены покупки от этих покупок.

private static void testGooglePlayDevAPI_Purchase() throws Throwable {
    final String productIdSku = "[the_product_sku]";
    final String purchaseToken = "[a_valid_purchase_token]";
    final String packageName = "[our_app_id]";

    final File GOOGLE_PLAY_DEV_API_CREDENTIALS = 
            new File("path_to_file/google-api-credentials.json");

    final FileInputStream credentials = 
           new FileInputStream(GOOGLE_PLAY_DEV_API_CREDENTIALS);

    final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    final HttpTransport TRANSPORT = 
            GoogleNetHttpTransport.newTrustedTransport();

    String scope = AndroidPublisherScopes.ANDROIDPUBLISHER;

    GoogleCredential credential = GoogleCredential
            .fromStream(credentials, TRANSPORT, JSON_FACTORY)
            .createScoped(Arrays.asList(scope));

    AndroidPublisher publisher = new AndroidPublisher
            .Builder(TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(packageName)
            .build();

    try {
        AndroidPublisher.Purchases purchases = publisher.purchases();

        AndroidPublisher.Purchases.Products products = purchases.products();
        AndroidPublisher.Purchases.Products.Get get = 
                products.get(packageName, productIdSku, purchaseToken);
        ProductPurchase product = get.execute();

        System.out.println(String.format(
                "Product purchase data found [developerPayload=%s]", 
                product.getDeveloperPayload()));
    } catch (Throwable t) {
        System.out.println(ExceptionSupport.getExceptionDetails(t));
    }
}

Я ожидаю, что приведенный выше код даст мне ответ с действительными данными о покупке продукта(действительный экземпляр ProductPurchase, который я могу опрашивать и обрабатывать).Вместо этого все, что я когда-либо получаю, это ответ 400 Bad Request, указывающий, что НЕКОТОРЫЕ ЗНАЧЕНИЯ (я не знаю, какие) недействительныФактический ответ:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 
400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Invalid Value",
    "reason" : "invalid"
  } ],
  "message" : "Invalid Value"
}
...