6

最后我可以解决我最近处理访问 google API 的 OAuth2 身份验证的问题。

但是现在我在查询 android 开发人员 API 以检索有关订阅的状态信息时遇到了困难。我正在使用以下 REST API 调用:

https://www.googleapis.com/androidpublisher/v1/applications/ APP_PACKAGE /subscriptions/ SUBSCRIPTION_ID /purchases/ PURCHASE_TOKEN ?access_token= AUTH_TOKEN

  • APP_PACKAGE 我上传到开发者控制台的应用程序的包名
  • SUBSCRIPTION_ID为应用指定的订阅 ID(开发者控制台)
  • PURCHASE_TOKEN (Yet dummy) 购买代币
  • AUTH_TOKEN 从 OAuth2 检索到的身份验证令牌。

我检索到的此请求的身份验证令牌如下:

// Build the HTTP parameter
Map<String,String> params = [:]
params.put("grant_type", "refresh_token")
params.put("refresh_token", googleRefreshToken.encodeAsURL())
params.put("client_id", googleClientId.encodeAsURL())
params.put("client_secret", googleClientSecret.encodeAsURL())

// Send the POST request
// This action might throw an exception in case any parameter were wrong, invalid or not specified.
String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params);
JSONElement jsonResult = JSON.parse(result)

这工作得很好,但上面提到的 REST 调用返回 500 错误 - 没有任何给定的消息。

{
  "error": {
    "code": 500,
    "message": null
  }
}

我读到有些人有几乎类似的问题,但只有在联系取消 API时。

一些信息:

  • 属于客户端 ID 的 google-user 也是 android 应用程序的所有者
  • 该应用程序尚未发布
  • 该应用授予 com.android.vending.BILLING 访问权限
  • 我还在应用程序中实现了一个虚拟的 BillingService 和 BillingReceiver

由于我没有检索到任何错误消息,我现在真的不知道如何继续。还有其他人知道这个问题吗?

编辑 1

在玩各种测试用例时,我得到了非常奇怪的结果。例如:如果我使用 <= 7 个字符的 PURCHASE_TOKEN,那么我会收到以下响应:

{
  "error": {
    "errors": [
     {
      "domain": "global",
      "reason": "notFound",
      "message": "The subscription purchase token was not found.",
      "locationType": "parameter",
      "location": "token"
     }
    ],
   "code": 404,
   "message": "The subscription purchase token was not found."
  }
}

而当我使用 PURCHASE_TOKEN > 7 个字符时,我仍然会收到 500 错误。就像从这里复制的示例令牌:rojeslcdyyiapnqcynkjyyjh

编辑 2

服务器偶尔会随机响应 503 后端错误。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error"
   }
  ],
  "code": 503,
  "message": "Backend Error"
 }
}

编辑 3

如果我使用 Java API(而不是直接 URL 调用),我会得到同样的错误。

// Build token for the response
TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setAccessToken(googleAccessToken);
tokenResponse.setRefreshToken(googleRefreshToken);
tokenResponse.setExpiresInSeconds(3600L);
tokenResponse.setScope(OAuth2Handler.SCOPE_ANDROID_PUBLISHER);
tokenResponse.setTokenType("Bearer");

// Init credential container
HttpRequestInitializer credential =  new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(googleClientId, googleClientSecret)
.build()
.setFromTokenResponse(tokenResponse);

// Connect to the android publisher API
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
    .setApplicationName("NameOfMyApplicationInGooglePlayStore")
    .build();

// Retrieve subscription purchase information
Androidpublisher.Purchases purchases = publisher.purchases();
Androidpublisher.Purchases.Get get = purchases.get(
    packageName,
    subscriptionId,
    purchaseToken
);

// Analyse result
SubscriptionPurchase subscription = get.execute();        

亲切的问候,克里斯托弗

4

0 回答 0