Google Play 开发者 API - 400 无效值 - InAppPurchases

问题描述 投票:0回答:7

我的问题与这个问题类似。但是,我将 API Java 客户端库 与服务帐户一起使用,从我的服务器调用 API。

我的代码遵循this指南,非常简单。但是,我似乎无法收到适合我的请求的错误。这就是我构建我的

AndroidPublisher
:

val credential = GoogleCredential.fromStream(FileInputStream(
        "/path/to/json"
)).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER))

androidPublisher = AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
        .setApplicationName(packageName)
        .build()

JSON 是从开发者控制台的服务帐户下生成的。这就是我提出要求的方式:

androidPublisher.purchases().subscriptions().get(packageName, "valid-sku", "invalid-token").execute()

我的订阅 ID 有效,但我的令牌无效。我预计响应中会出现诸如“无效令牌”之类的错误。然而,我得到的是:

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

这是由于令牌无效而导致的一般错误还是身份验证问题?如果是身份验证问题,我该如何解决?如果是无效令牌问题,我怎么知道?

更多信息:

  • 尝试从 API Explorer 进行该调用时也遇到相同的错误(这次使用客户端 ID 和 API 密钥而不是服务帐户)。
  • 没有委派对服务帐户的域范围访问权限。出于某种原因我必须这么做吗?
  • 我可以成功对 API 进行 其他调用,例如
    inappproducts.list
java kotlin google-oauth google-api-java-client google-play-developer-api
7个回答
13
投票

根据我的经验,如果您有

HTTP 400
Invalid Value
错误,那么该购买或订阅就是 欺诈

您可以查看这些购买的订单 ID 部分。可能是

XXXXXXXXXXXX.XXXXXXXXXXXX
的格式,这是错误的,应该是
GPA.XXXX.XXXXX.XXXXX.XXX

  • 我并没有真正计算 X 字符的数量。我只是添加来显示逻辑。

12
投票

就我而言,问题是我正在打电话:

purchases.products.get

代替:

purchases.subscriptions.get

9
投票

所以,发生这种情况的原因只是因为我使用的

purchaseToken
是错误的。

我没想到这是原因,因为我认为在令牌无效的情况下,我会收到“令牌无效”错误(或类似的错误)。事实证明,Google 给出的响应非常不一致(对于无效令牌也可能给出 404)。


6
投票

挠了我的头几个小时,我所有的参数都是正确的,然后好吧..我意识到我找错了树(端点)

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}

不是这个

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}

/购买/订阅/.. vs /购买/产品/..


1
投票

这是很多年后的事了,但当我试图找到答案时,我听到了为什么我会遇到同样的错误。

这个答案救了我!

对我来说,问题基本上是我使用“GPA.XXXX-XXXX-XXXX-XXXX”值(订单 ID)而不是令牌“dipjcnhompnmpbkokmjjdfam.AO-XXXwKJo931-qI0crOddpS1hKm2-vOfXGS2cxJfRsiEepN F4lfjqYTU6deUs6_hAhofJdBD9Az_CbfKm6xQJ5hAhofJdVNXH7zGzxfWt0gd2y3_pehztA"。

有效令牌的长度始终为 144 个字符,以点分隔, 初始 [a-z]{24} 部分之后的 119 个字符、Base64ish 部分, 欺诈企图仅包括(例如 eiorsfdmklehiojapofmknoe)

我希望这可以节省其他人的时间。 。 .


0
投票

你能帮我吗 这是我的代码: const androidpublisher = google.androidpublisher({ 版本:“v3”, 授权: 授权, });

try {
  const response = await androidpublisher.purchases.products.get({
    packageName: packageName.trim(),
    productId: productId.trim(),
    token: purchaseToken.trim(),
  });

我收到此错误: 代码:400, 消息:'无效值', 状态:400,


-1
投票

对于所有遇到这个问题的人来说,99%的人都需要发布应用程序供内部测试人员使用。

遵循本指南:https://support.google.com/googleplay/android-developer/answer/6062777?hl=en

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.