尝试使用带有有效购买令牌的Java Google Play Developer API v3检索应用内购买信息时,请求错误(无效值)

时间:2019-06-05 02:15:52

标签: java android in-app-purchase google-play-developer-api android-inapp-purchase

使用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"
}

1 个答案:

答案 0 :(得分:0)

在这里,我将提供自己的答案,因为我们终于找到了解决方法。事实证明,Java Google Play开发人员API(v3)客户端库中的某些内容无法正常运行。我不知道它是什么,但是该客户端库的文档非常糟糕,Google并没有提供使用它的示例。但是,事实证明,我们可以直接使用HTTPS / JSON / OAuth2 API,而无需通过Java客户端。我们已经使用这种方法实现了服务器端解决方案,并在内存缓存中缓存了OAuth2令牌,直到它们到期为止。

我仔细检查了一下,我们来回发送了两个月的Google支持!!!他们根本没有帮助。我觉得这很了不起(不好)。