Aggiungere offerte di pre-ordine per i prodotti a pagamento singolo

1. Introduzione

In questo codelab ti concentrerai sulla creazione di un prodotto a pagamento singolo e sull'aggiunta di un'offerta di pre-ordine per il prodotto.

Nota: prima di iniziare questo codelab, devi richiedere l'accesso alla funzionalità di preordine compilando il modulo di interesse EAP per i prodotti a pagamento singolo.

Pubblico

Questo codelab è rivolto agli sviluppatori di app per Android che hanno familiarità con i prodotti a pagamento singolo e vogliono capire come aggiungere offerte di preordine ai propri prodotti a pagamento singolo.

Prerequisito

Se non hai mai utilizzato i prodotti a pagamento singolo, ti consigliamo di completare il codelab Apri nuovi mercati con i prezzi dei prodotti regionali.

Cosa imparerai…

  • Come utilizzare Google Play Console per creare offerte di preordine per i tuoi prodotti una tantum.
  • Come utilizzare le API della libreria Fatturazione Google Play per eseguire query sui prodotti a pagamento singolo e sui dettagli dell'offerta di pre-ordine corrispondente.

Cosa ti serve…

2. Crea l'app di esempio

Questo codelab utilizza un'app per Android di esempio per insegnarti a 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:

  • Integrare l'app con PBL.
  • Recupero dei prodotti a pagamento singolo e delle offerte di pre-ordine correlate.
  • Esegui i flussi di acquisto per i 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 in Play Console hai pacchetti di altre app, 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.

3. Creare un OTP con preordine 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 interno di Google Play Console. Solo dopo il caricamento puoi configurare le funzionalità relative alla monetizzazione in Play Console.
    1. Fai clic su Testa e rilascia > Test > Release interna > Crea nuova release.
    2. Inserisci un nome per la release e carica il file APK firmato.
    3. Fai clic su Avanti e poi su Salva e pubblica.

Ora puoi creare i prodotti a pagamento singolo.

Creare un prodotto a pagamento singolo

Ora crea il prodotto a pagamento singolo che vuoi che gli utenti acquistino.

  1. Apri l'app di esempio in Google Play Console e 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, upcoming_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.
    • (Facoltativo) Aggiungi un'immagine dell'icona:carica un'icona che rappresenti il tuo prodotto.
    Nota: ai fini di questo codelab, puoi saltare la configurazione della sezione Imposte, 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.
    1. Seleziona Imposta come non disponibile.
    Tutte le regioni sono selezionate automaticamente e impostate su Disponibile.
    1. Deseleziona solo il paese United States, quindi fai clic su Imposta come non disponibile. Ora il prodotto a pagamento singolo sarà disponibile solo in United States.
    2. Nel menu a discesa Tutte le regioni, seleziona Paesi e regioni disponibili. Dovresti vedere solo United States.
    3. Fai clic sull'icona Prezzo. Viene visualizzata una finestra di dialogo per impostare il prezzo.
    4. Inserisci 10 $ e fai clic su Salva.
  7. Fai clic su Salva come bozza.

Nota: non attivare ancora l'opzione di acquisto. Lo attiveremo dopo aver configurato l'offerta di pre-ordine. Questo perché non puoi aggiungere un'offerta di pre-ordine a un'opzione di acquisto attiva la cui disponibilità regionale è impostata.

Aggiungere un'offerta di pre-ordine

Ora aggiungi un'offerta di pre-ordine per l'opzione di acquisto che hai creato in precedenza. Un'offerta di pre-ordine consente agli utenti di acquistare il tuo articolo prima della sua uscita ufficiale. Tieni presente che le offerte di pre-ordine sono supportate solo per l'opzione di acquisto Acquista e possono essere configurate solo per i nuovi prodotti in una regione.

L'aggiunta di un'offerta di pre-ordine prevede i seguenti due passaggi:

  1. Prepara l'opzione di acquisto Acquista per l'offerta di pre-ordine.
  2. Aggiungi l'offerta di pre-ordine per l'opzione di acquisto.

Preparare l'opzione di acquisto per l'offerta di pre-ordine

  1. Apri l'app di esempio in Google Play Console e vai a Monetizza con Google Play > Prodotti > Prodotti a pagamento singolo.
  2. Nella pagina Prodotti a pagamento singolo, fai clic sulla freccia rivolta verso destra in corrispondenza del prodotto (upcoming_movie_1). Si aprirà la pagina Modifica prodotto a pagamento singolo.
  3. Fai clic sulla freccia rivolta verso destra in corrispondenza dell'opzione di acquisto buy-movie che hai creato in precedenza. Si aprirà la pagina Modifica opzione di acquisto.
  4. Fai clic su Modifica disponibilità e accesso e poi seleziona Imposta come disponibile e consenti agli utenti di effettuare il pre-ordine.
  5. Dal menu a discesa Tutte le regioni, seleziona Paesi e regioni disponibili. Dovrebbero essere visualizzati solo i United States che hai configurato in precedenza.
  6. Seleziona il paese, quindi fai clic su Imposta come disponibile solo per il pre-ordine.
  7. Fai clic su Salva.

Tieni presente che non hai ancora aggiunto un'offerta di pre-ordine all'opzione di acquisto. Il passaggio successivo consiste nell'aggiungere l'offerta di pre-ordine.

Aggiungere un'offerta di pre-ordine

  1. Apri l'app di esempio in Google Play Console e vai a Monetizza con Google Play > Prodotti > Prodotti a pagamento singolo.
  2. Nella pagina Prodotti a pagamento singolo, fai clic su Aggiungi offerta > Pre-ordine per il tuo prodotto (upcoming_movie_1). Si aprirà la pagina Aggiungi pre-ordine.
  3. Inserisci i dettagli del preordine:
    • ID pre-ordine: inserisci preorder-offer-1.
    • (Facoltativo) Aggiungi uno sconto:puoi selezionare Nessuno, Percentuale o Sconto assoluto. Ai fini di questo codelab, seleziona Nessuno.
    • (Facoltativo) Tag: aggiungi tag pertinenti.
    • Data e ora di inizio:imposta una data almeno 3 giorni dopo.
    • Data e ora di fine:imposta una data almeno 24 ore dopo la data di inizio.
    • Disponibilità dopo il pre-ordine:scegli se il prodotto diventa disponibile immediatamente dopo il periodo di pre-ordine o in una data/ora successiva specifica.
    • (Facoltativo) Prezzo garantito più basso:seleziona questa opzione se vuoi che agli utenti venga addebitato il prezzo più basso tra quello del preordine e quello al momento dell'uscita. Questo può essere un forte incentivo per i primi acquirenti.
  4. Fai clic su Salva.
  5. Apri la pagina Modifica prodotto a pagamento singolo per il tuo prodotto a pagamento singolo (upcoming_movie_1).
  6. Fai clic su Attiva per l'opzione di acquisto Acquista (buy-movie).
  7. Fai clic su Attiva per l'offerta di pre-ordine (preorder-offer-1) nell'opzione di acquisto Acquista. In questo modo, l'offerta di pre-ordine viene attivata e pubblicata alla data che hai configurato in precedenza nei dettagli del pre-ordine.

Video sulla creazione di offerte di pre-ordine

Il seguente video mostra i passaggi per la creazione dell'offerta di pre-ordine descritti in precedenza.

4. 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.1.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 (upcoming_movie_1 in questo esempio) in ProductDetails restituisce una risposta simile alla seguente:
    {
        "productId": "upcoming_movie_1",
        "type": "inapp",
        "title": "Purrfect Mayhem: The Final Playback (Movies All Day | Play Samples)",
        "name": "Purrfect Mayhem: The Final Playback",
        "description": "Yolo and Thorne must reach the original broadcasting site to initiate the \"Final Playback\" and save the timeline. Follow them through their race against the Clockinators.",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 8500000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$8.50",
                "offerIdToken": "<---offerIdToken--->",
                "offerId": "preorder",
                "purchaseOptionId": "buy-option",
                "offerTags": [],
                "validTimeWindow": {
                    "startTimeMillis": 1756771200000,
                    "endTimeMillis": 1785542400000
                },
                "preorderDetails": {
                    "preorderReleaseTimeMillis": 1785542400000,
                    "preorderPresaleEndTimeMillis": 1785542400000
                }
            }
        ]
    }
    
    Tieni presente che i dettagli dell'offerta di pre-ordine sono disponibili in oneTimePurchaseOfferDetailsList. Questo elenco contiene un'opzione di acquisto (buy-option) per la quale è stata configurata l'offerta di pre-ordine in Play Console. Puoi identificare in modo univoco ogni opzione di acquisto tramite il relativo offerIdToken.
  5. Recupera il token dell'offerta insieme ai dettagli dell'offerta di pre-ordine. Per avviare il flusso di fatturazione al passaggio 6, è necessario il token dell'offerta.
    @Override
    public void onProductDetailsResponse(List<ProductDetails> productDetailsList) {
    
    if (productDetailsList != null && !productDetailsList.isEmpty()) {
    
    // Process productDetailsList returned by QueryProductDetailsResult
    for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
      for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
          productDetails.getOneTimePurchaseOfferDetailsList()) {
        // Checks if the offer is a preorder offer.
        if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) {
          // Process the returned PreorderDetails
          OneTimePurchaseOfferDetails.PreorderDetails preorderDetails =
              oneTimePurchaseOfferDetails.getPreorderDetails();
          // Get preorder release time in millis.
          long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis();
          // Get preorder presale end time in millis.
          long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis();
          // Get offer ID
            String offerId = oneTimePurchaseOfferDetails.getOfferId();
          // Get the associated purchase option ID
          if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
            String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
          }
        }
      }
      }
      } 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);
    }
    

5. 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.

Per capire come testare le opzioni di acquisto utilizzando Play Billing Lab, consulta il codelab Apri nuovi mercati con i prezzi regionali dei prodotti.

6. Passaggi successivi

Documenti di riferimento

7. Complimenti!

Complimenti! Hai navigato correttamente in Google Play Console per creare un'offerta di pre-ordine per un prodotto a pagamento singolo. 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.