使用Java Google Play开发者API(版本3)并请求有效购买令牌的购买信息时,出现以下异常。该API调用返回400错误请求响应,并显示以下消息。
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Invalid Value",
"reason" : "invalid"
} ],
"message" : "Invalid Value"
}
很遗憾,没有进一步的信息。我不知道什么值无效。
首先,我们已就此与Google支持人员联系。不幸的是,我们在Google的支持下来回走了近两个月,他们甚至还没有表明他们正确地理解了我们的问题所在。每次他们答复时,即使多次解释了该问题,他们也会向我们提供与Google Play开发人员API无关的建议。这是我20年来最令人沮丧的支持经验。 Google支持显然不会在这里有所帮助。
第二,我们已成功将Google Play帐户与后端关联。所有必要的配置均已完成并且可以正常工作。在我们的后端,每当进行Android应用内购买时,我们都会从Google Play收到通知,这些通知包括购买令牌。这花费了一些实质性的努力,但我相信现在这是正确的,我们的服务帐户配置正确,并且所有权限等都很好。
我能够成功调用该API,该API返回可用的应用内购买产品列表。我会完整,正确地列出我们在Google Play中配置的产品,以供用户在我们的应用中购买。为了进行此调用,我们必须提供凭据,并且我假设服务器在进行此调用时正在验证这些凭据。由于可以成功进行此调用,因此我假设“无效值”与我们的凭据无关。我们正在使用Google生成的针对特定服务帐户创建的JSON文件(而不使用p12文件)。
我已经搜索了StackOverflow,其余的互联网正在寻找有关此问题的信息。我发现许多页面都指示相同或相似的问题,但是使用的是旧版的Google Play开发者API,显然它们的功能有所不同。提供的解决方案似乎不适用于v3 API。我已经搜寻了许多周,尝试各种解决方案,但都没有成功。
我编写了一个在本地PC上运行的测试应用程序,该应用程序在我请求应用内商品列表时可以运行,但是在请求给定购买令牌的购买详细信息时却无法运行。我尝试了许多不同的购买令牌。我了解到测试令牌实际上不适用于该特定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"
}
答案 0 :(得分:0)
在这里,我将提供自己的答案,因为我们终于找到了解决方法。事实证明,Java Google Play开发人员API(v3)客户端库中的某些内容无法正常运行。我不知道它是什么,但是该客户端库的文档非常糟糕,Google并没有提供使用它的示例。但是,事实证明,我们可以直接使用HTTPS / JSON / OAuth2 API,而无需通过Java客户端。我们已经使用这种方法实现了服务器端解决方案,并在内存缓存中缓存了OAuth2令牌,直到它们到期为止。
我仔细检查了一下,我们来回发送了两个月的Google支持!!!他们根本没有帮助。我觉得这很了不起(不好)。