2012-05-30 7 views
7

Ich versuche, das neue Android-Abonnementsystem von Google Play in meine Anwendung zu integrieren (ich hatte bereits In-App-Abrechnung funktioniert gut). Ich habe die Abonnementabrechnung erfolgreich durchgeführt, aber ich möchte nun Informationen über dieses Abonnement abrufen, indem ich die Google Apis nutze, wie in der Android-Dokumentation (http://developer.android.com/guide/market/billing/billing_subscriptions.html) angegeben. .Android-Abonnement und Google API

Ich möchte, dass mein Dienst den API-Aufruf ausführen kann, um diese Informationen abzurufen, aber ich habe Probleme mit der Authentifizierung (mit oauth2). Bisher ist dies, was ich tun (in meinem PHP-Dienst):

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 

ich dann versuchen, den Zugriffstoken mit diesem JWT-Objekt abzurufen. Das Problem ist, dass, wenn ich das Access-Token gebe ich den Fehler bekam, dass das Entwickler-Konto nicht die Anwendung besitzt, was nicht wahr ist.

(Ich weiß, dies ist nicht die Art, es zu tun, aber ich wollte nur die access_token mit der JWT abrufen, um zu verstehen, warum es nicht funktioniert, wenn ich es wie in der Google Apis-Dokumentation angegeben funktioniert es nicht funktioniert auch).

Ich muss diesen API-Aufruf von einem Server, so dass kein Endbenutzer beteiligt sein muss (keine manuelle Zustimmung).

Antwort

7

Ich hatte das gleiche Problem und schließlich festgestellt, dass Dienstkonten derzeit nicht auf die Play-API zugreifen können.

Ich bin mir nicht sicher, wann Google dies beheben möchte, aber Sie können umgehen, indem Sie eine Web-App-Client-ID erstellen und eine Basis-Login-Seite erstellen, um zuerst einen Code mit den neuen Web-App-Client-Daten zu generieren bis $ 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>"; 

Dies sollten Sie auf eine Google-Login-Seite, wo Sie mit dem Entwickler-Konto anmelden sollten. Wenn Sie die App autorisieren, werden Sie zurück zur Web-App-URL geführt, die Sie beim Einrichten der Client-ID mit einem CODE als get-Parameter definiert haben. Sie können einen Token (und was noch wichtiger ist, eine Aktualisierungs-Token) wie so verwenden zu generieren:

$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 

Dies sollten Sie JSON-Daten mit einer Aktualisierungs-Token zurück. Speichern Sie dieses Token und verwenden Sie es, um jedes Mal einen weiteren Anruf zu tätigen, wenn Sie ein Zugriffstoken generieren müssen. Sie werden im Wesentlichen den gleichen Code führen Sie das Aktualisierungs-Token erhalten hat, aber mit verschiedenen Bereichen:

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

Dies wird Ihnen ein Zugriffstoken können Sie Kaufdaten aus der folgenden URL erhalten verwenden: https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

Der Trick ist, das Refresh-Token zu bekommen, sobald Sie haben, dass der Rest ziemlich einfach sein sollte.

+0

@ Ahmed ... das sieht wie eine Antwort aus "Der Allmächtige!" – dell116

+1

Gehen Sie folgendermaßen vor: https://developers.google.com/android-publisher/authorization – Chloe

0

Ich habe das gleiche Problem. Dies liegt daran, dass Sie Nutzer in der Google API autorisieren, denen die Anwendung nicht gehört, und versuchen, Daten unterhalb Ihrer App abzurufen.

In diesem Thema ist es gut beschrieben. http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=2528691&topic=16285&ctx=topic

Sie sollten von OAuth2 den Besitzer der Anwendung autorisieren und dann die Google API mit dem erhaltenen Token verwenden.