【问题标题】:Bad request (invalid value) when trying to retrieve in-app purchase info using the Java Google Play Developer API v3 with a valid purchase token尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)
【发布时间】:2019-10-20 13:13:17
【问题描述】:

当使用 Java Google Play Developer API(第 3 版)并请求购买信息以获得有效的购买令牌时,我收到以下异常。 API 调用返回 400 Bad Request 响应和以下消息。

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

很遗憾,没有更多信息。不知道什么值无效。

首先,我们已就此联系了 Google 支持。不幸的是,近 2 个月来,我们一直在与 Google 支持来回切换,但他们甚至还没有表示他们正确理解我们的问题是什么。每次他们回复时,他们都会给我们提供与 Google Play Developer API 毫无关系的建议,即使在多次彻底解释问题之后也是如此。这是我 20 年来最令人沮丧的支持体验。 Google 支持在这里显然不会有任何帮助。

其次,我们已成功关联我们的 Google Play 帐户和我们的后端。所有必要的配置都已完成并正常工作。在我们的后端,每当进行 Android 应用内购买时,我们都会收到来自 Google Play 的通知,这些通知包括购买令牌。这需要付出一些巨大的努力,但我相信现在一切都是正确的,我们的服务帐户配置正确,所有权限等都很好。

我能够成功调用返回可用应用内购买产品列表的 API。我得到了我们在 Google Play 中配置的产品的完整和正确列表,供用户在我们的应用程序中购买。为了进行此调用,我们必须提供凭据,并且我假设在我们进行此调用时服务器正在验证这些凭据。由于我可以成功拨打此电话,因此我假设“无效值”与我们的凭据无关。我们使用的是为特定服务帐户创建的由 Google 生成的 JSON 文件(不使用 p12 文件)。

我搜索了 StackOverflow,并在互联网上寻找有关此问题的信息。我发现许多页面表明相同或相似的问题,但使用的是旧版本的 Google Play Developer 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 响应,表明 SOME VALUE(我不知道哪个)是无效的。实际的反应是:

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

更新:

我在下面对这个问题提供了自己的答案。

【问题讨论】:

  • 我也有同样的问题,不知道怎么解决。你能帮帮我吗?
  • @Traif:我提供了下面的答案,也就是说我找到了 HTTPS/JSON/Oauth2 API 的文档,然后编写代码直接调用该 API,而不使用 Google 提供的 Java 客户端(但显然完全不受支持,或者由根本不了解它的工作人员支持)。这是我能为你做的最好的。如果您设法以我使用的解决方法以外的其他方式解决了问题,请在此处发布答案。

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


【解决方案1】:

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

我仔细检查过,我们在两个月的时间里来回通过电子邮件与 Google 支持联系!!!他们根本没有帮助。我觉得这很了不起(以一种糟糕的方式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多