При использовании 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"
}