Sbloccare nuovi mercati con i prezzi dei prodotti regionali

1. Introduzione

In questo codelab ti concentrerai sulla creazione di un prodotto a pagamento singolo, sulla definizione della relativa opzione di acquisto, sull'impostazione dei prezzi specifici per regione e sul test del flusso di acquisto dei prodotti a pagamento singolo.

Pubblico

Questo codelab è destinato agli sviluppatori di app per Android che vogliono utilizzare Play Console per gestire il proprio catalogo di prodotti a pagamento singolo.

Cosa imparerai…

  • Il modello degli oggetti prodotto a pagamento singolo.
  • Come navigare e utilizzare Google Play Console per gestire il catalogo dei prodotti a pagamento singolo.
  • Come tradurre i dettagli dei prodotti a pagamento singolo in varie lingue senza costi.
  • Come configurare prezzi e disponibilità a livello regionale per i prodotti a pagamento singolo.
  • Come utilizzare le API della Libreria Fatturazione Play per eseguire query sui dettagli dei prodotti a pagamento singolo.
  • Come testare i prodotti a pagamento singolo utilizzando Play Billing Lab.

Cosa ti serve…

2. Anteprima del prodotto a pagamento singolo

Il modello degli oggetti dei prodotti a pagamento singolo offre una maggiore flessibilità nella modalità di vendita dei prodotti e riduce la complessità della loro gestione. Il modello degli oggetti separa ciò che viene venduto da come viene venduto, consentendo allo stesso diritto di avere più prezzi e diverse modalità di commercializzazione agli utenti. Il modello a oggetti ha tre livelli di gerarchia:

  • Prodotto a pagamento singolo: un oggetto prodotto definisce ciò che l'utente sta acquistando.
  • Opzione di acquisto: un'opzione di acquisto definisce in che modo il diritto viene concesso all'utente, il relativo prezzo e la regione in cui sarà disponibile il prodotto. Un singolo prodotto può avere più opzioni di acquisto, che possono rappresentare prezzi diversi in regioni diverse.
  • Offerta: le offerte possono influire sul prezzo dell'opzione di acquisto a cui sono collegate e possono essere utilizzate per definire sconti o un pre-ordine. Una singola opzione di acquisto può avere diverse offerte.

Il seguente diagramma mostra il modello degli oggetti prodotto a pagamento singolo.

codelab-otp-model.png Figura 1: modello degli oggetti a pagamento singolo.

Per ulteriori informazioni, consulta la panoramica dei prodotti a pagamento singolo.

3. Crea l'app di esempio

Questo codelab utilizza un'app per Android di esempio per mostrare come gestire i prodotti una tantum. L'app di esempio è progettata per essere un'app per Android completamente funzionante con il codice sorgente completo che mostra i seguenti aspetti:

  • Integrazione dell'app con PBL
  • Recupero dei prodotti a pagamento singolo e delle opzioni di acquisto correlate
  • Esegui flussi di acquisto con prezzi regionali

Il seguente video dimostrativo mostra l'aspetto e il comportamento dell'app di esempio dopo il deployment e l'esecuzione.

Se hai già familiarità con i prodotti a pagamento singolo e la Libreria Fatturazione Play (PBL), puoi scaricare l'app di esempio e provarla.

Prerequisiti

Prima di creare ed eseguire il deployment dell'app di esempio:

Build

L'obiettivo di questo passaggio di compilazione è generare un file Android App Bundle firmato dell'app di esempio.

Per generare l'Android App Bundle, svolgi i seguenti passaggi:

  1. Scarica l'app di esempio da GitHub.
  2. 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.
  3. Genera un Android App Bundle firmato.
    1. Generare una chiave di caricamento e un archivio chiavi
    2. Firmare l'app con la chiave di caricamento
    3. Configurare la firma dell'app di Google Play

Il passaggio successivo consiste nel caricare l'app bundle Android su Google Play Console.

4. Creare un prodotto a pagamento singolo in Play Console

Per creare prodotti una tantum in Google Play Console, devi avere un'app in Play Console. Crea un'app in Play Console, poi carica l'app bundle firmato creato in precedenza.

Crea un'app

Per creare un'app:

  1. Accedi a Google Play Console utilizzando il tuo account sviluppatore.
  2. Fai clic su Crea app. Si aprirà la pagina Crea app.
  3. Inserisci un nome dell'app, seleziona la lingua predefinita e altri dettagli relativi all'app.
  4. Fai clic su Crea app. In questo modo viene creata un'app in Google Play Console.

Ora puoi caricare l'app bundle firmato dell'app di esempio.

Carica l'app bundle firmato

  1. 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.
  2. Fai clic su Testa e rilascia > Test > Release interna > Crea nuova release.
  3. Inserisci un nome per la release e carica il file APK firmato.
  4. 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:

  1. Nella console Google Play, dal menu di navigazione a sinistra, vai a Monetizza con Google Play > Prodotti > Prodotti a pagamento singolo.
  2. Fai clic su Crea prodotto a pagamento singolo.
  3. Inserisci i seguenti dettagli del prodotto:
    • ID prodotto: inserisci un ID univoco. Ad esempio, trending_movie_1.
    • (Facoltativo) Tag:aggiungi tag pertinenti.
    • Nome:inserisci un nome del prodotto. Ad esempio, Product Movie.
    • Descrizione:inserisci una descrizione del prodotto. Ad esempio, Product Description.
    Traduzione manuale del nome e della descrizione del prodotto
    Per impostazione predefinita, il nome e la descrizione del prodotto sono in lingua inglese (Stati Uniti) – en-US. Puoi anche inserire manualmente il nome e la descrizione in altre lingue. Per inserire i dettagli, fai clic su Gestisci traduzioni, seleziona le lingue per cui vuoi inserire il testo tradotto e poi fai clic su Applica. La seguente immagine mostra l'opzione Gestisci traduzioni:manage-translations.pngFigura 2: Gestisci traduzione.

    Le lingue selezionate verranno visualizzate nel menu a discesa delle lingue. Seleziona ogni lingua e inserisci il nome e la descrizione corrispondenti nella lingua selezionata. Puoi anche tradurre automaticamente il nome e la descrizione del prodotto senza costi. Per ulteriori informazioni, consulta la sezione Tradurre i prodotti a pagamento singolo in questo codelab.

    Nota: ai fini di questo codelab, puoi saltare la configurazione del campo Icona e della sezione Tasse, conformità e programmi.
  4. Fai clic su Avanti.
  5. Aggiungi un'opzione di acquisto e configura la sua disponibilità a livello regionale. Un prodotto a pagamento singolo richiede 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 univoco. Ad esempio buy-movie.
    • 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.
  6. A questo punto, devi configurare la disponibilità e il prezzo a livello regionale per l'opzione di acquisto. Nella disponibilità a livello regionale, specificherai le regioni in cui è disponibile il tuo prodotto, incluse quelle in cui la tua app non è ancora stata pubblicata. Per impostazione predefinita, un'opzione di acquisto sarà disponibile in tutte le regioni.

    Nella sezione Disponibilità e prezzi, fai clic su Modifica disponibilità e accesso > Imposta come non disponibile. Nota che tutte le regioni sono impostate per impostazione predefinita su Disponibile.
    1. Seleziona tutti i paesi tranne France, Spain e United States, poi fai clic su Imposta come non disponibile.
    2. Dal menu a discesa Tutte le regioni, seleziona Paesi e regioni disponibili. Vengono visualizzati solo i paesi che hai selezionato nel passaggio precedente.
    3. Per ciascuno dei paesi disponibili, fai clic sull'icona di modifica nella colonna Prezzo. Viene visualizzata una finestra di dialogo per modificare il prezzo. Inserisci e salva i seguenti prezzi:
      • Per France, inserisci 10 EUR
      • In Spain, inserisci 8 EUR
      • Per United States, inserisci 13 USD
  7. Fai clic su Attiva. In questo modo, il tuo prodotto a pagamento singolo sarà disponibile con l'opzione di acquisto Acquista.

Nota: la valuta del prezzo regionale è visibile in base al paese impostato per Google Play dall'utente. Ad esempio, se il paese Play dell'utente è impostato su Francia, il prezzo del prodotto a pagamento singolo viene visualizzato in euro.

Video sulla creazione di prodotti a pagamento singolo

Il seguente video mostra i passaggi per la creazione di un prodotto a pagamento singolo descritti in precedenza.

Aggiungere un'opzione di acquisto Noleggia

Ora aggiungi un'opzione di acquisto a noleggio al prodotto a pagamento singolo creato in precedenza.

  1. Nella console Google Play, dal menu di navigazione a sinistra, vai a Monetizza con Google Play > Prodotti > Prodotti a pagamento singolo.
  2. Fai clic sulla freccia rivolta verso destra in corrispondenza del prodotto con l'ID prodotto trending_movie_1 che hai creato nel passaggio precedente.
  3. Fai clic su Aggiungi opzione di acquisto.
  4. Nella sezione Opzione di acquisto, inserisci i seguenti dettagli:
    • ID opzione di acquisto: inserisci rent-movie.
    • Tipo di acquisto:seleziona Noleggia.
    • Periodo di noleggio: seleziona 48 ore.
    • Periodo di inizio del noleggio:seleziona 24 ore.
    • (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.
  5. Successivamente, in modo simile all'opzione di acquisto, configura la disponibilità regionale per l'opzione di acquisto Noleggia. Vedi i passaggi 6 e 7 nella sezione precedente. Quando imposti i prezzi regionali, imposta un prezzo diverso per i noleggi. Ad esempio:
    • France - 5 €
    • Spain - 4 €
    • United States - 7 USD.

5. Tradurre i dettagli del prodotto a pagamento singolo

Puoi tradurre il nome e la descrizione del prodotto senza costi aggiuntivi utilizzando la funzionalità di traduzione automatica disponibile in Google Play Console.

Per tradurre il titolo e la descrizione, procedi nel seguente modo:

  1. In Google Play Console, dal menu di navigazione a sinistra, vai a Aumenta gli utenti > Traduzioni > Store e prodotti in-app.
  2. Fai clic su Crea ordine.
  3. Seleziona l'opzione Traduzione automatica senza costi e poi fai clic su Avanti.
  4. Nelle lingue Traduci in, seleziona Francese - fr-FR e Spagnolo - es-ES, poi fai clic su Avanti.
  5. Seleziona Abbonamenti e prodotti a pagamento singolo, quindi fai clic su Traduci e visualizza traduzioni. Viene visualizzato un banner di disclaimer. Accetta la limitazione di responsabilità.
  6. Ora vedrai l'elenco delle lingue tradotte. Fai clic su Rivedi e applica per una lingua. Controlla il testo e poi fai clic su Applica tutte le traduzioni. Ripeti questo passaggio per tutte le lingue che hai scelto di tradurre.

Dopo la traduzione, puoi modificare il testo tradotto in Play Console. Per modificare il testo tradotto:

  1. Apri la pagina Prodotti a pagamento singolo > [il tuo prodotto a pagamento singolo] > Modifica prodotto a pagamento singolo > Modifica i dettagli del prodotto a pagamento singolo.
  2. Seleziona la lingua richiesta dal menu a discesa. Mostra il testo nella lingua selezionata. L'immagine seguente mostra la selezione di una lingua per modificare il testo tradotto:

    edit-translations.png Figura 3: modifica il testo tradotto.
  3. Modifica il testo come preferisci e poi fai clic su Salva modifiche.

Il testo tradotto è visibile all'utente in base alle preferenze della lingua dello smartphone. Ad esempio, se la lingua dello smartphone dell'utente è impostata su francese, il titolo e la descrizione del prodotto a pagamento singolo vengono visualizzati in francese. L'immagine di esempio seguente mostra come e dove apparirà il testo tradotto in diverse lingue.

post-translation.pngFigura 4: testo tradotto nell'app.

Video sulla configurazione della traduzione

Il seguente video mostra i passaggi di configurazione della traduzione descritti in precedenza.

6. Integrazione con PBL

Per integrare la tua app con la Libreria Fatturazione Play, segui questi passaggi:

  1. Aggiungi la dipendenza della libreria Fatturazione Google Play all'app di esempio.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Inizializza 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.
    private BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        // For one-time products, add a listener to process and acknowledge the purchases. This will notify
        // Google the purchase was processed.
        // For client-only apps, use billingClient.acknowledgePurchase().
        // 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
        // In this sample snippet purchases aren't processed. You must
        // implement your business logic to process and acknowledge the purchases.
        .setListener((billingResult, purchases) -> {})
        .enableAutoServiceReconnection()
        .build();
     }
    
  3. Connettiti a Google Play.Il seguente snippet di codice mostra come connettersi a Google Play.
    /**
    * Starts the billing connection with Google Play. This method should be called exactly once
    * before any other methods in this class.
    *
    * @param productList The list of products to query for after the connection is established.
    */
    public void startBillingConnection(List<Product> productList) {
        billingClient.startConnection(
            new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                Log.d(TAG, "Billing Client Connection Successful");
                queryProductDetails(productList);
                } else {
                Log.e(TAG, "Billing Client Connection Failed: " + billingResult.getDebugMessage());
                listener.onBillingSetupFailed(billingResult); // Propagate the error to the listener to show a message to the user.
                }
            }
    
            @Override
            public void onBillingServiceDisconnected() {
                Log.e(TAG, "Billing Client Connection Lost");
                listener.onBillingError("Billing Connection Lost");
            }
            });
    }
    
  4. 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. Lo snippet di codice seguente mostra come recuperare i dettagli del prodotto a pagamento singolo nella tua app.
    private void queryProductDetails(List<Product> productList) {
        QueryProductDetailsParams queryProductDetailsParams =
            QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    
        billingClient.queryProductDetailsAsync(
            queryProductDetailsParams,
            new ProductDetailsResponseListener() {
            @Override
            public void onProductDetailsResponse(
                BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
                if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                List<ProductDetails> productDetailsList =
                    productDetailsResponse.getProductDetailsList();
                    listener.onProductDetailsResponse(productDetailsList);
                } else {
                Log.e(TAG, "QueryProductDetailsAsync Failed: " + billingResult.getDebugMessage());
                listener.onBillingError("Query Products Failed: " + billingResult.getResponseCode());
                }
            }
            });
    }
    
    Il recupero del prodotto una tantum (trending_movie_1 in questo esempio) in ProductDetails restituisce una risposta simile alla seguente:
    {
        "productId": "trending_movie_1",
        "type": "inapp",
        "title": "Purrfect Mayhem: The Rewind Protocol (Movies All Day | Play Samples)",
        "name": "Purrfect Mayhem: The Rewind Protocol",
        "description": "Dr. Arid Thorne and a smart tiger named Yolo find a mysterious tape. It's a \"Rewind Protocol\" to fix time. A shadowy group, the Clockinator, hunts them to seize the tape's power.",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 13000000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$13.00",
                "offerIdToken": "<---buy offerIdToken --->",
                "purchaseOptionId": "buy-option",
                "offerTags": [
                    "adventure",
                    "mystery"
                ]
            },
            {
                "priceAmountMicros": 7000000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$7.00",
                "offerIdToken": "<---rent offerIdToken--->",
                "purchaseOptionId": "rent-option",
                "offerTags": [
                    "adventure",
                    "mystery"
                ],
                "rentalDetails": {
                    "rentalPeriod": "P30D",
                    "rentalExpirationPeriod": "PT24H"
                }
            }
        ]
    }
    
    Tieni presente che le opzioni di acquisto Acquista e Noleggia sono disponibili in oneTimePurchaseOfferDetailsList. Questo elenco contiene due opzioni di acquisto (buy-option e rent-option) configurate in Play Console. Puoi identificare in modo univoco ogni opzione di acquisto tramite il relativo offerIdToken.
  5. Recupera i token dell'offerta per le offerte Noleggia e acquista. Ti serviranno i token dell'offerta per avviare il flusso di fatturazione al passaggio 6.
    @Override
    public void onProductDetailsResponse(List<ProductDetails> productDetailsList) {
    
        if (productDetailsList != null && !productDetailsList.isEmpty()) {
    
            // Iterate over all details of the queried product in step 4.
            for (ProductDetails productDetails : productDetailsList) {
    
                // Get the list of all the offers associated with the product.
                List<ProductDetails.OneTimePurchaseOfferDetails> offerDetailsList =
                        productDetails.getOneTimePurchaseOfferDetailsList();
    
                // Iterate over the offer details
                for (ProductDetails.OneTimePurchaseOfferDetails offerDetails : offerDetailsList) {
    
                    // For a Rent purchase option, the
                    // offerDetails.getRentalDetails() method returns
                    // the rent information. If this information is present,
                    // the offer corresponds to a Rent purchsae option.
                    if (offerDetails.getRentalDetails() != null) {
                        rentFormattedPrice = offerDetails.getFormattedPrice();
    
                        // Get the offerIdToken for the Rent purchase option
                        rentOfferToken = offerDetails.getOfferToken();
                        rentMovieTags = offerDetails.getOfferTags();
                    }
                    // If the offerDetails.getRentalDetails() returns
                    // null, the offer corresponds to a Buy purchsae option.
                    else {
                        buyFormattedPrice = offerDetails.getFormattedPrice();
    
                        // Get the offerIdToken for the Buy purchase option
                        buyOfferToken = offerDetails.getOfferToken();
                        buyMovieTags = offerDetails.getOfferTags();
                    }
                }
                updateUIButtons();
                return;
    
            }
        } else {
            Log.e(TAG, "No product details found for " + productId);
        }
    }
    
  6. Avvia il flusso di fatturazione.
    /**
     * Launches the billing flow for the product with the given offer token.
    *
    * @param activity The activity instance from which the billing flow will be launched.
    * @param productDetails The product details of the product to purchase.
    * @param offerToken The offer token of the product to purchase.
    * @return The result of the billing flow.
    */
    public void launchPurchase(Activity activity, ProductDetails productDetails, String offerToken) {
        ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
            ImmutableList.of(
                BillingFlowParams.ProductDetailsParams.newBuilder()
                    .setProductDetails(productDetails)
                    .setOfferToken(offerToken)
                    .build());
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
        billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    

Suggerimento: puoi anche configurare le notifiche in tempo reale per lo sviluppatore (RTDN) per implementare campagne di riconquista e altre strategie di gestione del ciclo di vita degli acquisti. Per capire come configurare le RTDN e gestire le notifiche con monitoraggio e diritti accurati, ti consigliamo di consultare il codelab Ottimizza l'integrazione di Google Play Billing.

7. Opzioni di acquisto di test

Prima di rendere disponibili i tuoi prodotti a pagamento singolo nell'app live, puoi testare l'integrazione di Play Billing Library utilizzando i tester delle licenze e Play Billing Lab.

Scoprirai come testare la localizzazione e la disponibilità dei prezzi in cui l'app è disponibile solo in alcune regioni con un prezzo diverso per ciascuna regione.

Prerequisiti

Testare i prezzi regionali per le opzioni di acquisto

Per testare i prezzi regionali per le opzioni di acquisto:

  1. Apri l'app Play Billing Lab e accedi come tester di licenze.
  2. In Impostazioni di configurazione, fai clic su Modifica, seleziona il paese France e poi fai clic su Applica. Qui selezioniamo il paese di Play che determina la valuta che verrà mostrata nell'app.
  3. Chiudi e riapri l'app di esempio. Ora dovrebbe mostrare la valuta di acquisto e noleggio per France in euro.

Per eseguire il test per un altro paese, seleziona Spain nel passaggio 2 e poi esegui il passaggio 3.

Video di test di Play Billing Lab

Il seguente video mostra i passaggi per il test dei prezzi regionali utilizzando l'app di esempio.

8. Passaggi successivi

Documenti di riferimento

9. Complimenti!

Complimenti! Hai navigato correttamente in Google Play Console per creare un nuovo prodotto a pagamento singolo, configurare un'opzione di acquisto e testare il flusso di acquisto utilizzando Play Billing Lab. Ora hai una conoscenza più approfondita del catalogo dei prodotti flessibile di Google Play per gli acquisti una tantum.

Sondaggio

Il tuo feedback su questo codelab è molto importante. Ti invitiamo a dedicare qualche minuto per completare il nostro sondaggio.