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 (まだダミー) 購入トークン
  • 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

(直接 URL 呼び出しの代わりに) Java API を使用すると、同じエラーが発生します。

// 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