2012-09-26 11 views
5

en pocas palabras: ¿Puedo trabajar con la API para desarrolladores de Android de Google Play desde el lado del servidor sin proporcionar ninguna aplicación en Play Store?Comprobando las suscripciones de Google Android desde el lado del servidor

Antecedentes: Estoy trabajando en un proyecto que proporciona aplicaciones con suscripciones mensuales. Los datos correspondientes de cada suscripción (token de compra, fecha, etc.) se almacenan en la base de datos back-end. Ahora quiero crear un cronjob que itere a través de cada uno de estos conjuntos de datos. Y para cada suscripción, me gustaría contactar a la API de Google para recuperar la información si la suscripción sigue siendo válida o no, y actualizar nuestra base de datos correspondiente al respondido estado.

Para la lógica back-end, uso google-api-java-client library.

Para cancelar o verificar suscripciones, necesito autenticarme con OAuth2 anteriormente. estado allí, hecho eso.

new GoogleCredential.Builder() 
    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
    .setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher") // $1 
    .setServiceAccountPrivateKeyFromP12File(new File(filePath)) 
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET) // $2 
    .build(); 

$ 1: No sé si el alcance dado cuenta es válida. Porque podría encontrar este valor en unos pocos ejemplos, pero ni en this overview ni en google playground

$ 2 Supongo que es necesario, aunque encontré muchos ejemplos que no proporcionaron esta información.

Pero, desafortunadamente, no puedo ver ninguna diferencia cuando proporciono datos no válidos (como correo electrónico incorrecto o clave privada).

Preguntas

  • ¿Cómo puedo verificar que el GoogleCredential es correcta?
  • ¿Puedo verlo en los próximos pasos, como ponerse en contacto con, por ejemplo, la API androidpublisher?

En el siguiente paso Trato de estado de la compra de una suscripción:

Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
           .setApplicationName(GOOGLE_PRODUCT_NAME) // $1     
           .build(); 
Androidpublisher.Purchases purchases = publisher.purchases(); 
Androidpublisher.Purchases.Get get = purchases.get("android.test.purchased", "monthly001", "mytoken"); // $2 
SubscriptionPurchase subscripcion = get.execute(); 

$ 1: Mi nombre del producto ficticio del API console -> API Access

$ 2: Aparte del hecho de que la API androidpush not allow contacting it via service accounts, but only via web server applications auth flow, no tengo ni idea de qué insertar en el parámetro del método get.

Aquí está la API: https://developers.google.com/android-publisher/v1/purchases/get

Preguntas

  • ¿Cuál es el nombre del paquete y lo que es la subscriptionId en este contexto?
  • ¿Dónde obtengo/fijo estos valores?

Después de leer this document Sé que hay una manera de manejar las respuestas falsas/estáticas. Pero no puedo leer en ningún lado si esto también es posible para las suscripciones, o solo para las facturas integradas en la aplicación solo en dispositivos móviles.

Me pregunto de todos modos por qué/si hay alguna manera fácil de desarrollar con un sandbox o s.th. simliar.

Todavía tengo la sensación de que me falta un gran papel para entender cómo deberían funcionar las cosas. Tal vez alguien de usted me puede dar una pista de cómo proceder en este lugar o puede decirme dónde estoy equivocado.

Saludos cordiales,

Christopher

+0

Comprobar http://stackoverflow.com/a/24264696/165708 para una mejor solución. –

Respuesta

4

ahora podían averiguar la mayoría de mis problemas de comprensión anteriores.

= 1 = Generar URL AUTORIZACIÓN

String authorizeUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId,callbackUrl,"https://www.googleapis.com/auth/androidpublisher").build()  
// See why: http://stackoverflow.com/questions/8433990/when-authenticating-with-oauth-and-youtube-always-get-error-invalid-grant-on 
authorizeUrl += "&approval_prompt=force&access_type=offline" 

= 2 = AUTENTICAR

Desde el servidor de WebFlow no está funcionando para la API AndroidPublisher el cliente ahora debe llamar a la URL generada en (1) manualmente .

= 3 = CALLBACK

El Google de devolución de llamada debe procesar los siguientes pasos. La devolución de llamada contiene el parámetro "código" que debemos usar.

= 4 = SOLICITUD AUTH-TOKEN

// Build the HTTP parameter 
    Map<String,String> params = [:] 
    params.put("grant_type", "authorization_code") 
    params.put("code", code.encodeAsURL()) 
    params.put("client_id", customer.googleClientId.encodeAsURL()) 
    params.put("client_secret", customer.googleClientSecret.encodeAsURL()) 
    params.put("redirect_uri", getCallbackUrl().encodeAsURL()) 

    // Send the POST request 
    // This action might throw an exception in case any parameter were wrong, invalid or not specified. 
    String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params); 
    JSONElement jsonResult = JSON.parse(result) 

    // Map result 
    OAuth2Result oAuth2Result = new OAuth2Result() 
    oAuth2Result.accessToken = jsonResult.getAt("access_token") 
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token") 
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString()) 
    oAuth2Result.tokenType = jsonResult.getAt("token_type") 

= 5 = petición de actualización TOKEN

// Build the HTTP parameter 
    Map<String,String> params = [:] 
    params.put("grant_type", "refresh_token") 
    params.put("refresh_token", this.customer.googleRefreshToken.encodeAsURL()) 
    params.put("client_id", customer.googleClientId.encodeAsURL()) 
    params.put("client_secret", customer.googleClientSecret.encodeAsURL()) 

    // Send the POST request 
    // This action might throw an exception in case any parameter were wrong, invalid or not specified. 
    String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params); 
    JSONElement jsonResult = JSON.parse(result) 

    // Map result 
    OAuth2Result oAuth2Result = new OAuth2Result() 
    oAuth2Result.accessToken = jsonResult.getAt("access_token") 
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token") 
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString()) 
    oAuth2Result.tokenType = jsonResult.getAt("token_type") 
Cuestiones relacionadas