1. Introduzione
In questo codelab ti concentrerai sulla creazione di un prodotto a pagamento singolo, sull'integrazione della tua app con la Libreria Fatturazione Play (PBL) e sull'analisi dei motivi degli abbandoni degli acquisti.
Nota: per completare correttamente questo codelab, devi avere accesso alla funzionalità Opzioni di acquisto multiple e offerte per i prodotti a pagamento singolo. Questa funzionalità è disponibile nel programma di accesso in anteprima (EAP). I prodotti e le funzionalità in EAP sono disponibili "così come sono" e potrebbero avere un supporto limitato. Per accedere alla funzionalità EAP, invia una richiesta utilizzando il modulo di interesse EAP per i prodotti a pagamento singolo. Se, invece, vuoi solo capire come analizzare gli abbandoni degli acquisti utilizzando i codici di risposta di Fatturazione Play, vai direttamente alla sezione Analizzare gli abbandoni degli acquisti di questo codelab.
Pubblico
Questo codelab è rivolto agli sviluppatori di app per Android che utilizzano la Libreria Fatturazione Play (PBL) o che vogliono utilizzare PBL per monetizzare i propri prodotti a pagamento singolo.
Cosa imparerai
- Come creare prodotti a pagamento singolo in Google Play Console.
- Come integrare la tua app con PBL.
- Come elaborare gli acquisti di prodotti a pagamento singolo di consumo e non di consumo in PBL.
- Come analizzare gli abbandoni degli acquisti.
Cosa ti serve
- Accesso a Google Play Console con un account sviluppatore. Se non hai un account sviluppatore, devi crearne uno.
- Un'app di esempio per questo codelab che puoi scaricare da GitHub.
- Android Studio.
2. Creare l'app di esempio
L'app di esempio è progettata per essere un'app per Android completamente funzionale con il codice sorgente completo che mostra i seguenti aspetti:
- Integrazione dell'app con PBL
- Recupero dei prodotti a pagamento singolo
- Avvio dei flussi di acquisto per i prodotti a pagamento singolo
- Scenari di acquisto che portano alle seguenti risposte di fatturazione:
BILLING_UNAVAILABLEUSER_CANCELLEDOKITEM_ALREADY_OWNED
Il seguente video dimostrativo mostra l'aspetto e il comportamento dell'app di esempio dopo il deployment e l'esecuzione.
Prerequisiti
Prima di creare ed eseguire il deployment dell'app di esempio:
- Crea un account sviluppatore Google Play Console. Se hai già un account sviluppatore, salta questo passaggio.
- Crea una nuova app in Play Console. Quando crei un'app, puoi specificare qualsiasi nome per l'app di esempio.
- Installa Android Studio.
Build
L'obiettivo di questo passaggio di build è generare un file Android App Bundle firmato dell'app di esempio.
Per generare l'Android App Bundle:
- Scarica l'app di esempio da GitHub.
- Crea l'app di esempio. Prima di creare, modifica il nome del pacchetto dell'app di esempio e poi crea. Se hai pacchetti di altre app in Play Console, assicurati che il nome del pacchetto che fornisci per l'app di esempio sia univoco.
Nota: la creazione dell'app di esempio genera solo un file APK che puoi utilizzare per i test locali. Tuttavia, l'esecuzione dell'app non recupera prodotti e prezzi perché i prodotti non sono stati configurati in Play Console, cosa che farai più avanti in questo codelab. - Genera un Android App Bundle firmato.
Il passaggio successivo consiste nel caricare l'Android App Bundle in Google Play Console.
3. Creare un prodotto a pagamento singolo in Play Console
Per creare prodotti a pagamento singolo in Google Play Console, devi avere un'app in Play Console. Crea un'app in Play Console e poi carica l'app bundle firmato creato in precedenza.
Creare un'app
Per creare un'app:
- Accedi a Google Play Console utilizzando il tuo account sviluppatore.
- Fai clic su Crea app. Si aprirà la pagina Crea app.
- Inserisci un nome dell'app, seleziona la lingua predefinita e altri dettagli relativi all'app.
- Fai clic su Crea app. Verrà creata un'app in Google Play Console.
Ora puoi caricare l'app bundle firmato dell'app di esempio.
Caricare l'app bundle firmato
- Carica l'app bundle firmato nel canale di test interni di Google Play Console. Solo dopo il caricamento puoi configurare le funzionalità relative alla monetizzazione in Play Console.
- Fai clic su Test e release > Test > Release interna > Crea nuova uscita.
- Inserisci un nome della release e carica il file dell'app bundle firmato.
- Fai clic su Avanti e poi su Salva e pubblica.
Ora puoi creare i tuoi prodotti a pagamento singolo.
Creare un prodotto a pagamento singolo
Per creare un prodotto a pagamento singolo:
- In the Google Play Console, dal menu di navigazione a sinistra, vai a Monetizzazione con Play > Prodotti > Prodotti a pagamento singolo.
- Fai clic su Crea prodotto a pagamento singolo.
- Inserisci i seguenti dettagli del prodotto:
- ID prodotto:inserisci un ID prodotto univoco. Inserisci
one_time_product_01. - (Facoltativo) Tag:aggiungi tag pertinenti.
- Nome:inserisci un nome del prodotto. Ad esempio,
Product name. - Descrizione:inserisci una descrizione del prodotto. Ad esempio,
Product description. - (Facoltativo) Aggiungi un'immagine dell'icona:carica un'icona che rappresenta il tuo prodotto.
- ID prodotto:inserisci un ID prodotto univoco. Inserisci
- Fai clic su Avanti.
- Aggiungi un'opzione di acquisto e configura la sua disponibilità a livello regionale. Un prodotto a pagamento singolo deve avere almeno un'opzione di acquisto, che definisce in che modo viene concesso il diritto, il relativo prezzo e la disponibilità a livello regionale. Per questo codelab, aggiungeremo l'opzione standard Acquista per il prodotto.Nella sezione Opzione di acquisto, inserisci i seguenti dettagli:
- ID opzione di acquisto:inserisci un ID opzione di acquisto. Ad esempio,
buy. - Tipo di acquisto:seleziona Acquista.
- (Facoltativo) Tag:aggiungi tag specifici per questa opzione di acquisto.
- (Facoltativo) Fai clic su Opzioni avanzate per configurare le opzioni avanzate. Ai fini di questo codelab, puoi saltare la configurazione delle opzioni avanzate.
- ID opzione di acquisto:inserisci un ID opzione di acquisto. Ad esempio,
- Nella sezione Disponibilità e prezzi, fai clic su Imposta prezzi > Modifica collettivamente i prezzi.
- Seleziona l'opzione Paese / regione. Verranno selezionate tutte le regioni.
- Fai clic su Continua. Si aprirà una finestra di dialogo in cui inserire un prezzo. Inserisci 10 USD e poi fai clic su Applica.
- Fai clic su Salva e poi su Attiva. Verrà creata e attivata l'opzione di acquisto.
Ai fini di questo codelab, crea altri tre prodotti a pagamento singolo con i seguenti ID prodotto:
- consumable_product_01
- consumable_product_02
- consumable_product_03
L'app di esempio è configurata per utilizzare questi ID prodotto. Puoi fornire ID prodotto diversi, nel qual caso dovrai modificare l'app di esempio per utilizzare l'ID prodotto che hai fornito.
Apri l'app di esempio in Google Play Console e vai a Monetizzazione con Play > Prodotti > Prodotti a pagamento singolo. Poi fai clic su Crea prodotto a pagamento singolo e ripeti i passaggi da 3 a 9.
Video sulla creazione di prodotti a pagamento singolo
Il seguente video di esempio mostra i passaggi di creazione dei prodotti a pagamento singolo descritti in precedenza.
4. Integrazione con PBL
Ora vedremo come integrare la tua app con la Libreria Fatturazione Play (PBL). Questa sezione descrive i passaggi di alto livello per l'integrazione e fornisce uno snippet di codice per ciascun passaggio. Puoi utilizzare questi snippet come guida per implementare l'integrazione effettiva.
Per integrare la tua app con PBL:
- Aggiungi la dipendenza Libreria Fatturazione Play all'app di esempio.
dependencies { val billing_version = "8.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") } - Inizializza il BillingClient. BillingClient è l'SDK client che risiede nella tua app e comunica con la Libreria Fatturazione Play. Il seguente snippet di codice mostra come inizializzare il client di fatturazione.
protected BillingClient createBillingClient() { return BillingClient.newBuilder(activity) .setListener(purchasesUpdatedListener) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) .enableAutoServiceReconnection() .build(); } - Connettiti a Google Play.Il seguente snippet di codice mostra come connetterti a Google Play.
public void startBillingConnection(ImmutableList<Product> productList) { Log.i(TAG, "Product list sent: " + productList); Log.i(TAG, "Starting connection"); billingClient.startConnection( new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Query product details to get the product details list. queryProductDetails(productList); } else { // BillingClient.enableAutoServiceReconnection() will retry the connection on // transient errors automatically. // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE, // DEVELOPER_ERROR). Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage()); Log.e(TAG, "Billing response code: " + billingResult.getResponseCode()); } } @Override public void onBillingServiceDisconnected() { Log.e(TAG, "Billing Service connection lost."); } }); } - Recupera i dettagli del prodotto a pagamento singolo.Dopo aver integrato l'app con PBL, devi recuperare i dettagli del prodotto a pagamento singolo nella tua app. Il seguente snippet di codice mostra come recuperare i dettagli del prodotto a pagamento singolo nella tua app.
Il recupero diprivate void queryProductDetails(ImmutableList<Product> productList) { Log.i(TAG, "Querying products for: " + productList); QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) { // check billingResult Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode()); // process returned productDetailsList Log.i( TAG, "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList()); setupProductDetailsMap(productDetailsResponse.getProductDetailsList()); billingServiceClientListener.onProductDetailsFetched(productDetailsMap); } }); }ProductDetailsrestituisce una risposta simile alla seguente:{ "productId": "consumable_product_01", "type": "inapp", "title": "Shadow Coat (Yolo's Realm | Play Samples)", "name": "Shadow Coat", "description": "A sleek, obsidian coat for stealth and ambushes", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 1990000, "priceCurrencyCode": "USD", "formattedPrice": "$1.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] }, { "productId": "consumable_product_02", "type": "inapp", "title": "Emperor Den (Yolo's Realm | Play Samples)", "name": "Emperor Den", "description": "A fair lair glowing with molten rock and embers", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 2990000, "priceCurrencyCode": "USD", "formattedPrice": "$2.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] } - Avvia il flusso di fatturazione.
public void launchBillingFlow(String productId) { ProductDetails productDetails = productDetailsMap.get(productId); if (productDetails == null) { Log.e( TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId); billingServiceClientListener.onBillingResponse( BillingResponseCode.ITEM_UNAVAILABLE, BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build()); return; } ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder().setProductDetails(productDetails).build()); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); billingClient.launchBillingFlow(activity, billingFlowParams); } - Rileva ed elabora gli acquisti. Nell'ambito di questo passaggio, devi:
- Verificare l'acquisto
- Concedere il diritto all'utente
- Avvisare l'utente
- Comunicare a Google la procedura di acquisto
private void handlePurchase(Purchase purchase) { // Step 1: Send the purchase to your secure backend to verify the purchase following // https://developer.android.com/google/play/billing/security#verify // Step 2: Update your entitlement storage with the purchase. If purchase is // in PENDING state then ensure the entitlement is marked as pending and the // user does not receive benefits yet. It is recommended that this step is // done on your secure backend and can combine in the API call to your // backend in step 1. // Step 3: Notify the user using appropriate messaging. if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { for (String product : purchase.getProducts()) { Log.d(TAG, product + " purchased successfully! "); } } // Step 4: Notify Google the purchase was processed. // For one-time products, acknowledge the purchase. // This sample app (client-only) uses billingClient.acknowledgePurchase(). // For consumable one-time products, consume the purchase // This sample app (client-only) uses billingClient.consumeAsync() // If you have a secure backend, you must acknowledge purchases on your server using the // server-side API. // See https://developer.android.com/google/play/billing/security#acknowledge if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) { if (shouldConsume(purchase)) { ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); billingClient.consumeAsync(consumeParams, consumeResponseListener); } else { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase( acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }
5. Analizzare gli abbandoni degli acquisti
Finora nel codelab, le risposte di Fatturazione Play si sono concentrate su scenari limitati, come le risposte USER_CANCELLED, BILLING_UNAVAILABLE, OK e ITEM_ALREADY_OWNED. Tuttavia, Fatturazione Play può restituire 13 codici di risposta diversi che possono essere attivati da vari fattori del mondo reale.
Questa sezione illustra le cause delle risposte di errore USER_CANCELLED e BILLING_UNAVAILABLE e suggerisce possibili azioni correttive che puoi implementare.
Codice di errore della risposta USER_CANCELED
Questo codice di risposta indica che l'utente ha abbandonato l'interfaccia utente del flusso di acquisto prima di completare l'acquisto.
Cause probabili | Quali azioni puoi intraprendere? |
|
|
Codice di errore della risposta BILLING_UNAVAILABLE
Questo codice di risposta indica che l'acquisto non è stato completato a causa di un problema con il fornitore di servizi di pagamento dell'utente o con la forma di pagamento scelta. Ad esempio, la carta di credito dell'utente è scaduta o l'utente si trova in un paese non supportato. Questo codice non indica un errore con il sistema di Fatturazione Play stesso.
Cause probabili | Quali azioni puoi intraprendere? |
|
|
Strategie di nuovi tentativi per i codici di errore della risposta
Le strategie di nuovi tentativi efficaci per gli errori recuperabili della Libreria Fatturazione Play (PBL) variano in base al contesto, ad esempio le interazioni dell'utente in sessione (come durante un acquisto) rispetto alle operazioni in background (come l'esecuzione di query sugli acquisti alla ripresa dell'app). È importante implementare queste strategie perché alcuni valori di BillingResponseCode indicano problemi temporanei che possono essere risolti riprovando, mentre altri sono permanenti e non richiedono nuovi tentativi.
Per gli errori riscontrati quando l'utente è in sessione, è consigliabile una semplice strategia di nuovi tentativi con un numero massimo di tentativi impostato per ridurre al minimo l'interruzione dell'esperienza utente. Al contrario, per le operazioni in background , come il riconoscimento di nuovi acquisti, che non richiedono l'esecuzione immediata, l'approccio consigliato è il backoff esponenziale.
Per informazioni dettagliate sui codici di risposta specifici e sulle strategie di nuovi tentativi consigliate corrispondenti, consulta Gestire i codici di risposta BillingResult.
6. Passaggi successivi
- Scopri come massimizzare l'integrazione di Fatturazione Play.
- Ricorda di seguire le best practice per la verifica e l'elaborazione degli acquisti sul backend sicuro una volta che gli utenti iniziano ad acquistare questi prodotti.
Documenti di riferimento
7. Complimenti!
Complimenti! Hai navigato correttamente in Google Play Console per creare un nuovo prodotto a pagamento singolo, testare i codici di risposta di fatturazione e analizzare gli abbandoni degli acquisti.
Sondaggio
Il tuo feedback su questo codelab è molto importante. Ti invitiamo a dedicare qualche minuto per completare il nostro sondaggio.