2012-05-30 22 views
7

Próbuję użyć nowego systemu subskrypcji Androida z Google Play w mojej aplikacji (miałem już działającą funkcję rozliczania w aplikacji). Z powodzeniem wykonałem rozliczenia za subskrypcję, ale teraz chcę pobierać informacje o tej subskrypcji za pomocą Google Apis zgodnie z dokumentacją Androida (http://developer.android.com/guide/market/billing/billing_subscriptions.html) .Subskrypcja na system Android i interfejs API Google

Chcę, aby moja usługa mogła wykonać wywołanie API w celu pobrania tych informacji, ale mam problemy z uwierzytelnianiem (z oauth2). Jak dotąd, jest to, co robię (w mojej służbie 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 

I spróbuj pobrać token dostępu z tym obiektem JWT. Problem polega na tym, że kiedy używam tokenu dostępu, dostałem błąd, że konto programisty nie jest właścicielem aplikacji, co nie jest prawdą.

(Wiem, że to nie jest sposób, aby to zrobić, ale po prostu chciałem odzyskać access_token za pomocą JWT, aby zrozumieć, dlaczego to nie działa, jeśli zrobię to jak wskazano w dokumentacji Google Apis to nie działa także).

Potrzebuję wykonać to wywołanie API z serwera, więc nie musi być zaangażowany użytkownik końcowy (bez ręcznej zgody).

Odpowiedz

7

Miałem ten sam problem iw końcu odkryłem, że od tej chwili konta usług nie mogą uzyskać dostępu do interfejsu API Play.

Nie jestem pewien, kiedy Google zamierza to naprawić, ale można obejść ten problem, tworząc identyfikator klienta aplikacji internetowej i konfigurując podstawową stronę logowania, aby najpierw wygenerować kod za pomocą nowej aplikacji internetowej Dane klienta i dane do $ 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>"; 

To powinno cię do strony logowania Google, w których należy zalogować się na konto dewelopera. Po zatwierdzeniu aplikacji nastąpi powrót do adresu URL aplikacji internetowej zdefiniowanego podczas konfigurowania identyfikatora klienta z KODEM jako parametrem pobierania. Można użyć do wygenerowania tokenu (i co ważniejsze, token odświeżania) tak:

$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 

ten powinien zwrócić ci danych JSON z tokena odświeżania. Zapisz ten token i użyj go, aby wykonać kolejne połączenie, gdy potrzebujesz wygenerować token dostępu. Będziesz zasadniczo uruchomić ten sam kod co zrobiłeś, aby uzyskać token odświeżania, ale z różnych dziedzin:

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

To daje token dostępu można użyć, aby uzyskać dane zakupu z następującym adresem URL: https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

Sztuką jest zdobycie tokena odświeżania, gdy już to zrobisz, reszta powinna być całkiem prosta.

+0

@ Ahmed ... to wygląda jak odpowiedź od "Wszechmocnego!" – dell116

+1

Oto jak to zrobić ręcznie: https://developers.google.com/android-publisher/authorization – Chloe

0

Mam ten sam problem. Dzieje się tak, ponieważ autoryzujesz użytkownika w interfejsie API Google, który nie jest właścicielem tej aplikacji i próbuje uzyskać dane, które są jej udziałem.

W tym temacie jest dobrze opisany. http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=2528691&topic=16285&ctx=topic

Należy autoryzować właściciela aplikacji przez OAuth2, a następnie użyć Google API z uzyskanym tokenem.

Powiązane problemy