2012-09-26 11 views
5

in breve: Posso lavorare con l'API per sviluppatori di Google Play per Android dal lato server senza fornire alcuna app nel Play Store?Controllo degli abbonamenti google android dal lato server

Sfondo: Sto lavorando a un progetto che fornisce app con abbonamenti mensili. I dati corrispondenti di ogni abbonamento (token di acquisto, data, ecc.) Vengono memorizzati nel database di back-end. Ora voglio creare un cronjob che itera su ciascuno di questi set di dati. E per ogni abbonamento mi piacerebbe contattare l'API di Google per recuperare le informazioni se l'abbonamento è ancora valido o meno, e aggiornare il nostro database corrispondente alla risposta stato.

Per la logica di backend utilizzo lo google-api-java-client library.

Per annullare o verificare le sottoscrizioni, è necessario prima autenticarsi con OAuth2. Ci sono stato, fatto.

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: Non so se l'ambito dato dell'account è valido. Perché potrei trovare questo valore in pochissimi esempi, né nello this overview né nello google playground

$ 2 Immagino sia necessario, anche se ho trovato molti esempi che non hanno fornito queste informazioni.

Ma, sfortunatamente, non riesco a vedere alcuna differenza quando fornisco dati non validi (come email errata o chiave privata).

Domande

  • Come si può verificare che il GoogleCredential è corretta?
  • Posso vederlo nei passaggi successivi, ad esempio per contattare l'API di androidpublisher?

Nella fase successiva cerco di ottenere lo stato di acquisto di un abbonamento:

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: Il mio nome di prodotto fittizio dal API console -> API Access

$ 2: Oltre al fatto, che l'API androidpush fa not allow contacting it via service accounts, but only via web server applications auth flow, non ho idea di cosa inserire nel parametro del metodo get.

Ecco l'API: https://developers.google.com/android-publisher/v1/purchases/get

Domande

  • Qual è il nome del pacchetto e qual è il subscriptionId in questo contesto?
  • Dove posso ottenere/impostare questi valori?

Dopo aver letto this document so che c'è un modo per gestire le risposte false/statiche. Ma non posso leggere da nessuna parte se questo è possibile anche per gli abbonamenti o solo per le fatturazioni in-app sui dispositivi mobili.

Mi chiedo comunque perché/se c'è un modo semplice di sviluppare con una sandbox o s.th. simliar.

Ho ancora la sensazione che mi manchi solo una parte importante per capire come dovrebbero funzionare le cose. Forse qualcuno di voi può darmi un suggerimento su come procedere in questo posto o potrebbe dirmi dove ho sbagliato.

Cordiali saluti,

Christopher

+0

Controllare http://stackoverflow.com/a/24264696/165708 per una soluzione migliore. –

risposta

4

ora potevo capire la maggior parte dei miei precedenti problemi di comprensione.

= 1 = Genera URL DELL'AUTORIZZAZIONE

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 = AUTHENTICATE

Poiché il server webflow non funziona per l'API AndroidPublisher il cliente deve ora chiamare l'URL generato in (1) manualmente .

= 3 = CALLBACK

Il callback Google dovrebbe elaborare i prossimi passi. Il callback contiene il parametro "codice" che dobbiamo usare.

= 4 = RICHIESTA 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 = RICHIESTA token di aggiornamento

// 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") 
Problemi correlati