2012-05-30 12 views
7

Google Playの新しいAndroidサブスクリプションシステムを自分のアプリケーションに使用しようとしています(既にアプリ内課金が正常に機能していました)。サブスクリプションの請求を正常に完了しましたが、アンドロイドのドキュメント(http://developer.android.com/guide/market/billing/billing_subscriptions.html)に示されているgoogle apisを使用して、このサブスクリプションに関する情報を取得したいと考えています。 。Androidのサブスクリプションと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オブジェクトでアクセストークンを取得しようとします。問題は、与えられたアクセストークンを使用すると、開発者アカウントがアプリケーションを所有していないというエラーが発生していることです。これは真実ではありません。

(私はこれを行う方法ではないことを知っていますが、私はJAWTを使用してaccess_tokenを検索して、動作していない理由を理解したいと思っていました。あまりにも)。

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

答えて

7

私は同じ問題を抱えていましたが、現在のところサービスアカウントがPlay APIにアクセスできないことがわかりました。

Googleがこれを修正する予定があるのか​​どうかはわかりませんが、ウェブアプリクライアントIDを作成し、基本的なログインページを設定して、新しいウェブアプリクライアントデータを使用してコードを生成し、 $クライアント - > 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データを返す必要があります。トークン(さらに重要なのはリフレッシュトークン)を生成することができます。このトークンを保存し、アクセストークンを生成する必要があるときはいつでもこのトークンを使用して別の呼び出しを行います。あなたは、本質的には異なる分野で、あなたはリフレッシュトークンを取得するためにやった同じコードを実行します: https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

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

これは、次のURLから購入データを取得するために使用できるトークンをあなたにアクセスできるようになります

トリックはリフレッシュトークンを取得していますが、残りの部分はかなり簡単です。

+0

@ Ahmed ...これは「全能者」からの答えのようです。 – dell116

+1

手動で行う方法は次のとおりです。https://developers.google.com/android-publisher/authorization – Chloe

0

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

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

OAuth2によってアプリケーションの所有者を承認し、得られたトークンでGoogle APIを使用する必要があります。