2012-05-30 20 views
7

Estoy tratando de usar el nuevo sistema de suscripción de Android de Google Play en mi aplicación (ya tenía la facturación en la aplicación funcionando bien). He realizado correctamente la facturación de la suscripción, pero ahora quiero recuperar información sobre esta suscripción mediante el uso de las API de Google como se indica en la documentación de Android (http://developer.android.com/guide/market/billing/billing_subscriptions.html) .suscripción a Android y API de Google

Quiero que mi servicio pueda hacer la llamada API para recuperar estas informaciones, pero tengo problemas con la autenticación (con oauth2). Hasta el momento, esto es lo que hago (en mi servicio 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 

que luego tratar de recuperar el token de acceso a este objeto de JWT. El problema es que cuando uso el token de acceso dado recibí el error de que la cuenta de desarrollador no es propietaria de la aplicación, lo que no es cierto.

(Sé que esta no es la manera de hacerlo, pero solo quería recuperar el access_token usando el JWT para entender por qué no funciona, si lo hago como se indica en la documentación de google apis no funciona también).

Necesito hacer esta llamada API desde un servidor, por lo que no debe involucrarse ningún usuario (sin consentimiento manual).

Respuesta

7

Tuve el mismo problema, y ​​finalmente descubrí que a partir de ahora las cuentas de servicio no pueden acceder a Play API.

No estoy seguro de cuándo Google planea arreglar esto, pero puede evitar esto creando una ID de cliente de aplicación web y configurando una página de inicio de sesión básica para generar primero un código usando la nueva aplicación web Datos del cliente e ir a $ cliente-> 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>"; 

Esto debería le llevará a una página de acceso a Google donde se debe iniciar sesión con la cuenta de desarrollador. Cuando autoriza la aplicación, lo llevará de vuelta a la URL de su aplicación web, tal como se definió cuando configuró la ID del cliente con un CÓDIGO como parámetro de obtención. Se puede utilizar para generar un token (y más importante, un token de actualización) de esta manera:

$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 

Esto debería devolver datos JSON con un token de actualización. Guarde este token y úselo para hacer otra llamada cada vez que necesite generar un token de acceso. Básicamente van a ejecutar el mismo código que hizo para obtener el token de actualización, pero con diferentes campos:

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

esto le dará un token de acceso se puede utilizar para obtener datos de compra a partir de la siguiente URL: https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

El truco está en obtener el token de actualización, una vez que lo tienes, el resto debería ser bastante sencillo.

+0

@ Ahmed ... esto parece una respuesta de "¡El Todopoderoso!" – dell116

+1

He aquí cómo hacerlo manualmente: https://developers.google.com/android-publisher/authorization – Chloe