7

Google Play の新しい Android サブスクリプション システムをアプリケーションで使用しようとしています (既にアプリ内課金は正常に機能していました)。サブスクリプションの請求は正常に完了しましたが、Android のドキュメント (http://developer.android.com/guide/market/billing/billing_subscriptions.html) に示されているように、Google API を使用してこのサブスクリプションに関する情報を取得したいと考えています。 .

サービスで API 呼び出しを実行してこれらの情報を取得できるようにしたいのですが、認証 (oauth2 を使用) に問題があります。これまでのところ、これは私が行っていることです(私のphpサービスで):

require_once 'google-api-php-client/src/apiClient.php'

const SERVICE_ACCOUNT_NAME = 'email from services account access';
$key = 'content of my private key retrieved from services account access';    

$client = new apiClient();
$cred = new apiAssertionCredentials(SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/androidpublisher'), $key);
$assertion = $cred->generateAssertion(); // This generate my encrypted JWT

次に、この JWT オブジェクトを使用してアクセス トークンを取得しようとします。問題は、指定されたアクセス トークンを使用すると、開発者アカウントがアプリケーションを所有していないというエラーが発生することです。これは正しくありません。

(これがその方法ではないことはわかっていますが、JWT を使用して access_token を取得し、それが機能しない理由を理解したかっただけです。Google apis のドキュメントに示されているようにそれを行うと、それも機能しません)。

サーバーからこの API 呼び出しを行う必要があるため、エンドユーザーが関与する必要はありません (手動による同意は必要ありません)。

4

2 に答える 2

8

私は同じ問題を抱えていましたが、最終的に、現時点ではサービス アカウントが Play API にアクセスできないことを発見しました。

Google がいつこれを修正する予定なのかはわかりませんが、ウェブ アプリのクライアント ID を作成し、基本的なログイン ページを設定して、新しいウェブ アプリのクライアント データを使用してコードを生成し、$client- に移動することで、これを回避できます。 >createAuthUrl():

$client = new apiClient();

$key = file_get_contents(KEY_FILE);
$client->setClientId(CLIENT_ID);
$client->setClientSecret(CLIENT_SECRET);
$client->setRedirectUri(MY_WEBAPP_URL);
$client->setDeveloperKey($key);
$client->setScopes(array('https://www.googleapis.com/auth/androidpublisher'));

$authUrl = $client->createAuthUrl();
print "<a class='login' href='$authUrl'>Connect Me!</a>";

これにより、開発者アカウントでログインする必要がある Google ログイン ページが表示されます。アプリを承認すると、GET パラメーターとして CODE を使用してクライアント ID を設定したときに定義された Web アプリ URL に戻ります。次のようにトークン (さらに重要なことに、更新トークン) を生成するために使用できます。

$url = 'https://accounts.google.com/o/oauth2/token';

$fields = array(
    'grant_type'=>'authorization_code',
    'code'=>$code,
    'client_id'=>CLIENT_ID,
    'client_secret'=>CLIENT_SECRET,
    'redirect_uri'=>MY_WEBAPP_URL
);

// cURL call to OAuth URL with $fields sent as POST

これにより、更新トークンを含む JSON データが返されます。このトークンを保存し、アクセス トークンを生成する必要があるときはいつでも、それを使用して別の呼び出しを行います。基本的に、更新トークンを取得するために行ったのと同じコードを実行しますが、異なるフィールドを使用します。

$fields = array(
    'grant_type'=>'refresh_token',
    'refresh_token'=>$refresh_token,
    'client_id'=>CLIENT_ID,
    'client_secret'=>CLIENT_SECRET,
);

これにより、次の URL から購入データを取得するために使用できるアクセス トークンが提供されます。 https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

トリックは、リフレッシュ トークンを取得することです。それを取得したら、残りは非常に簡単です。

于 2012-06-18T20:25:36.193 に答える
0

私は同じ問題を抱えています。これは、アプリケーションを所有していないユーザーを Google API で承認し、アプリの下にあるデータを取得しようとするために発生します。

このトピックでは、それがよく説明されています。http://support.google.com/googleplay/android-developer/bin/answer.py?hl=ja&answer=2528691&topic=16285&ctx=topic

アプリケーションの所有者を OAuth2 で認可し、取得したトークンで Google API を使用する必要があります。

于 2012-10-29T11:20:59.050 に答える