android - per - scaricare google play store




Come verificare l'acquisto per l'app Android sul lato server(Google Play nella fatturazione delle app v3) (4)

Esempio completo di utilizzo della libreria client dell'API di Google per PHP :

  1. Configura il tuo progetto Google e accedi a Google Play per il tuo account di servizio come descritto nella risposta di Marc qui https://stackoverflow.com/a/35138885/1046909 .

  2. Installa la libreria: https://developers.google.com/api-client-library/php/start/installation .

  3. Ora puoi verificare la ricevuta nel modo seguente:

    $client = new \Google_Client();
    $client->setAuthConfig('/path/to/service/account/credentials.json');
    $client->addScope('https://www.googleapis.com/auth/androidpublisher');
    $service = new \Google_Service_AndroidPublisher($client);
    $purchase = $service->purchases_subscriptions->get($packageName, $productId, $token);

    Dopodiché $ acquisto è l'istanza di Google_Service_AndroidPublisher_SubscriptionPurchase

    $purchase->getAutoRenewing();
    $purchase->getCancelReason();
    ...

Ho un'app semplice (necessita dell'accesso utente con account). Fornisco alcune funzionalità premium per gli utenti a pagamento, come più notizie.

Devo registrare se l'utente ha acquistato questo articolo nel mio database del server. Quando fornisco contenuto di dati al dispositivo dell'utente, posso quindi controllare lo stato dell'utente e fornire contenuti diversi per l'utente a pagamento.

Ho controllato l'esempio ufficiale Trivialdrive fornito da Google, non fornisce alcun codice di esempio per la verifica lato server, ecco le mie domande.

  1. Ho trovato l'esempio utilizzare la chiave pubblica della mia app all'interno per verificare l'acquisto, non sembra buono, penso di poter semplicemente spostare il processo di verifica sul mio server combinato con le credenziali di accesso dell'utente per vedere se l'acquisto è stato completato e quindi aggiornare il database.
  2. Inoltre c'è un'API di acquisto che posso usare per interrogare, ciò di cui ho bisogno è di passare l'acquisto acquistato dal server.

Non sono sicuro quale metodo dovrei adottare per verificare l'acquisto dell'utente e contrassegnare lo stato dell'utente nel mio database, forse entrambi?

E temo che ci sia una situazione, se un utente ha acquistato questo articolo da Google Play, ma per qualche motivo, proprio in quel momento, quando la mia app ha avviato la verifica sul mio server, la connessione di rete è inattiva o il mio server è inattivo , utente ha appena pagato i soldi in Google Play ma non ho registrato l'acquisto sul mio server? Cosa devo fare, come posso affrontare questa situazione.


La documentazione su questo è confusa e stranamente dettagliata con le cose che sono quasi irrilevanti mentre lascia la documentazione realmente importante quasi scollegata e super difficile da trovare. Questo dovrebbe funzionare benissimo sulla piattaforma server più popolare in grado di eseguire le librerie client google api, tra cui Java, Python, .Net e NodeJS, tra gli altri. Nota: ho testato solo il client API Python come mostrato di seguito.

Passi necessari:

  1. Crea un progetto API, dal link Accesso API nella tua console di Google Play

  2. Crea un nuovo account di servizio, salva la chiave privata JSON che viene generata. Dovrai portare questo file sul tuo server.

  3. Premi Fine nella sezione Account di servizio della console di gioco per aggiornare e quindi concedere l'accesso all'account di servizio

  4. Vai a ottenere una libreria client google api per la tua piattaforma server da https://developers.google.com/api-client-library

  5. Utilizza la libreria client della tua piattaforma specifica per creare un'interfaccia di servizio e leggere direttamente il risultato della verifica dell'acquisto.

Non è necessario preoccuparsi degli ambiti di autorizzazione, effettuare chiamate di richieste personalizzate, aggiornare i token di accesso, ecc. La libreria client di api si occupa di tutto. Ecco un esempio di utilizzo della libreria Python per verificare un abbonamento:

Innanzitutto, installa il client API di Google nel tuo pipenv in questo modo:

$ pipenv install google-api-python-client

Quindi è possibile impostare le credenziali del client API utilizzando il file json della chiave privata per autenticare l'account del servizio.

credentials = service_account.Credentials.from_service_account_file("service_account.json")

Ora puoi verificare direttamente gli acquisti in abbonamento o gli acquisti di prodotti utilizzando la libreria.

#Build the "service" interface to the API you want
service = googleapiclient.discovery.build("androidpublisher", "v3", credentials=credentials)

#Use the token your API got from the app to verify the purchase
result = service.purchases().subscriptions().get(packageName="your.app.package.id", subscriptionId="sku.name", token="token-from-app").execute()
#result is a python object that looks like this ->
# {'kind': 'androidpublisher#subscriptionPurchase', 'startTimeMillis': '1534326259450', 'expiryTimeMillis': '1534328356187', 'autoRenewing': False, 'priceCurrencyCode': 'INR', 'priceAmountMicros': '70000000', 'countryCode': 'IN', 'developerPayload': '', 'cancelReason': 1, 'orderId': 'GPA.1234-4567-1234-1234..5', 'purchaseType': 0}

La documentazione per l'interfaccia del servizio di piattaforma per l'API per sviluppatori di Play non è collegata in modo facile da trovare, per alcuni è decisamente difficile da trovare . Ecco i link per le piattaforme popolari che ho trovato:

Python | Java | .NET | PHP | NodeJS (Github TS) | Go (Github JSON)


Rispondo a questa preoccupazione

la connessione di rete è inattiva o il mio server è inattivo, l'utente ha appena pagato i soldi in Google Play ma non ho registrato l'acquisto nel mio server? Cosa devo fare, come posso affrontare questa situazione.

La situazione è:

L'utente acquista l'articolo "abc" utilizzando il servizio Google Play -> restituisci OK -> non riesce a verificare con il server per alcuni motivi, ad esempio nessuna connessione a Internet.

La soluzione è:

Sul lato client, prima di mostrare il pulsante "Google Wallet", verifichi se l'elemento "abc" è già di proprietà.

  • in caso affermativo, verificare nuovamente con il server
  • in caso contrario, mostra il pulsante "Google Wallet".

Acquisto acquisto = mInventory.getPurchase ('abc');

if (purchase != null) // Verify with server 

else // show Google Wallet button

https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails


Sembra che quello che stai cercando sia un modo per verificare se l'utente ha abilitate funzionalità premium sul proprio account, quindi è qui che vorrei iniziare;

Assicurati che nel tuo database sia presente un contrassegno di qualche tipo che indica se l'utente ha funzionalità premium e includilo nel payload della risposta API quando richiedi informazioni sull'account. Questa bandiera sarà la tua autorità principale per le "funzionalità premium".

Quando un utente effettua un acquisto in-app, memorizza nella cache i dettagli (token, ID ordine e ID prodotto) localmente sul client (cioè l'app), quindi invialo alla tua API.

L'API deve quindi inviare l' purchaseToken preso all'API per sviluppatori di Google Play per la convalida.

Alcune cose potrebbero succedere da qui:

  1. La ricevuta è valida, l'API risponde al client con un codice di stato 200 Ok
  2. La ricevuta non è valida, l'API risponde al client con un codice di stato 400 Richiesta errata
  3. L'API di Google Play non funziona, l'API risponde con un codice di stato 502 Bad Gateway

Nel caso di 1. o 2. (codici di stato 2xx o 4xx) il client cancella la cache dei dettagli di acquisto perché non ne ha più bisogno perché l'API ha indicato che è stata ricevuta.

Una volta convalidata correttamente (caso 1.), è necessario impostare il flag premium su true per l'utente.

Nel caso di 3. (codice di stato 5xx) o di un timeout di rete, il client dovrebbe continuare a provare fino a quando non riceve un codice di stato 2xx o 4xx dall'API.

A seconda delle esigenze, è possibile attendere alcuni secondi prima di inviarlo di nuovo o inviare semplicemente i dettagli all'API ogni volta che l'app viene riavviata o esce in background se i dettagli di acquisto sono presenti nella cache dell'app.

Questo approccio dovrebbe occuparsi dei timeout della rete, dei server non disponibili, ecc.

Ora ci sono alcune domande che devi considerare:

Cosa dovrebbe succedere immediatamente dopo un acquisto? L'app dovrebbe attendere il completamento della convalida prima di fornire contenuti premium o dovrebbe concedere provvisoriamente l'accesso e portarlo via se la convalida fallisce?

Concedere l'accesso provvisorio a funzionalità premium semplifica il processo per la maggior parte dei tuoi utenti, ma garantirai l'accesso anche a un numero di utenti fraudolenti mentre l'API convalida l' purchaseToken preso.

In altre parole: l'acquisto è valido fino a prova fraudolenta o; fraudolento fino a prova contraria?

Al fine di identificare se l'utente ha ancora un abbonamento valido al momento del rinnovo del periodo di abbonamento, è necessario pianificare una nuova convalida purchaseToken da eseguire alla expiryTimeMillis restituita nel result .

Se expiryTimeMillis è in passato, è possibile impostare il flag premium su false. Se è in futuro, riprogrammalo di nuovo per il nuovo expiryTimeMillis .

Infine, per garantire che l'utente abbia un accesso premium (o meno), l'app dovrebbe interrogare l'API per i dettagli degli utenti all'avvio dell'app o quando esce dallo sfondo.





in-app-billing