Più opzioni di acquisto e offerte per i prodotti a pagamento singolo

Questo documento descrive in dettaglio l'integrazione dei prodotti a pagamento singolo (OTP) con la Libreria Fatturazione Play. Inoltre, spiega come integrare varie opzioni di acquisto e offerte correlate ai tuoi prodotti a pagamento singolo.

Puoi configurare più opzioni di acquisto e offerte per i tuoi prodotti una tantum. Ad esempio, puoi configurare un'opzione di acquisto e un'offerta di prenotazione per lo stesso prodotto a pagamento singolo.

Prerequisiti

Per configurare più offerte per i prodotti a pagamento singolo, devi utilizzare l'API queryProductDetailsAsync(). L'API querySkuDetailsAsync() non è supportata. Per informazioni su come utilizzare queryProductDetailsAsync() e la versione di launchBillingFlow() che accetta ProductDetailsParams come input, consulta i passaggi della migrazione.

Esegui una query sui dettagli del prodotto

Se hai configurato più offerte o opzioni di acquisto per il tuo prodotto una tantum, l'oggetto ProductDetails restituito dal metodo queryProductDetailsAsync() può avere più di un'opzione di acquisto e/o di noleggio disponibile per prodotto una tantum. Per ottenere l'elenco di tutte le offerte idonee per ogni oggetto ProductDetails, utilizza il metodo getOneTimePurchaseOfferDetailsList(). Nell'ambito di questo elenco verranno restituite solo le offerte e le opzioni di acquisto per le quali l'utente è idoneo. Il codice nel metodo onProductDetailsResponse() deve gestire le offerte restituite.

Avvia il flusso di fatturazione

Per avviare una richiesta di acquisto dalla tua app, chiama il metodo launchBillingFlow() dal thread principale dell'app. Questo metodo prende un riferimento a un oggetto BillingFlowParams contenente l'oggetto ProductDetails pertinente ottenuto dalla chiamata a queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza la classe BillingFlowParams.Builder. Tieni presente che devi impostare il token dell'offerta corrispondente all'offerta selezionata dall'utente quando crei l'oggetto BillingFlowParams.

L'esempio seguente mostra come avviare il flusso di acquisto per un prodotto a pagamento singolo con più offerte:

Java

    
// An activity reference from which the billing flow will launch.
Activity activity = ...;
ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for &quot;productDetails&quot; by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
    
    

offerToken è disponibile nella sezione OneTimePurchaseOfferDetails. Quando mostri l'offerta all'utente, assicurati di configurare i parametri del flusso di fatturazione con il token dell'offerta corretto, che puoi ottenere dal metodo oneTimePurchaseOfferDetails.getOfferToken().

Offerte e opzioni di acquisto

Un'opzione di acquisto ti consente di definire in che modo il diritto viene concesso a un utente, il suo prezzo e in quale regione è disponibile il prodotto. Un singolo prodotto può avere più opzioni di acquisto, che possono indicare dove e come vendi il prodotto.

Google Play supporta le seguenti opzioni di acquisto per i prodotti a pagamento singolo:

  • Acquista opzione di acquisto
  • Opzione di acquisto con noleggio

Le offerte fanno riferimento a uno schema di prezzi che puoi creare per i tuoi prodotti una tantum. Ad esempio, puoi creare un'offerta di sconto per il tuo prodotto una tantum.

Google Play supporta le seguenti offerte di acquisto per i prodotti a pagamento singolo:

  • Offerta di pre-ordine (supportata solo per l'opzione di acquisto Acquista)
  • Offerta di sconto (supportata sia per le opzioni di acquisto che per quelle di noleggio)

Acquista opzione di acquisto

Un'opzione di acquisto rappresenta un acquisto standard e definitivo del prodotto a pagamento singolo. Dispone di un campo facoltativo legacyCompatible che indica se questa opzione di acquisto sarà disponibile nei flussi precedenti della Libreria Fatturazione Play (versione 7 o precedente) che non supportano il nuovo modello. Per la compatibilità con le versioni precedenti, almeno un'opzione di acquisto deve essere contrassegnata come compatibile con le versioni precedenti.

I passaggi per integrare le opzioni di acquisto sia di acquisto che di noleggio con PBL sono gli stessi. Per capire come integrare l'opzione di acquisto con la pubblicità basata sui prodotti, consulta Integrare l'opzione di acquisto con la pubblicità basata sui prodotti.

Opzione di acquisto con noleggio

L'opzione di acquisto con noleggio consente agli utenti di accedere ai prodotti a pagamento singolo per una durata specificata. Puoi specificare il periodo di noleggio e la relativa scadenza. Questo documento descrive i passaggi per integrare l'opzione di acquisto di noleggio con la Libreria Fatturazione Google Play (PBL).

Integrare l'opzione di acquisto a noleggio con PBL

Questa sezione descrive come integrare l'opzione di acquisto con noleggio con la Play Billing Library (PBL). Si presume che tu abbia familiarità con i passaggi iniziali di integrazione della Libreria Fatturazione Play, ad esempio l'aggiunta della dipendenza dalla Libreria Fatturazione Play alla tua app, l'inizializzazione di BillingClient e la connessione a Google Play. Questa sezione si concentra sugli aspetti di integrazione del PBL specifici per l'opzione di acquisto con noleggio.

Per configurare i prodotti disponibili per il noleggio, dovrai utilizzare il nuovo serviziomonetization.onetimeproducts dell'API Google Play Developer o l'interfaccia utente di Play Console. Per utilizzare il servizio, puoi chiamare direttamente l'API REST o utilizzare la libreria client Java.

Avvia un flusso di acquisto per l'opzione di noleggio

Per avviare un flusso di acquisto per un'offerta di noleggio:

  1. Recupera i metadati dell'opzione di acquisto di noleggio utilizzando il metodo ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    L'esempio seguente mostra come ottenere i metadati relativi all'acquisto di una casa in affitto:

    Java

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a rent purchase option.
            if (oneTimePurchaseOfferDetails.getRentalDetails() != null) {
              // process the returned RentalDetails
              OneTimePurchaseOfferDetails.RentalDetails rentalDetails =
                  oneTimePurchaseOfferDetails.getRentalDetails();
              // Get rental period in ISO 8601 format.
              String rentalPeriod = rentalDetails.getRentalPeriod();
              // Get rental expiration period in ISO 8601 format, if present.
              if (rentalDetails.getRentalExpirationPeriod() != null) {
                String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod();
              }
              // Get offer token
                String offerToken = oneTimePurchaseOfferDetails.getOfferToken();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });
  2. Avvia il flusso di fatturazione.

    Per avviare una richiesta di acquisto dalla tua app, chiama il metodo launchBillingFlow() dal thread principale dell'app. Questo metodo prende un riferimento a un oggetto BillingFlowParams contenente l'oggetto ProductDetails pertinente ottenuto dalla chiamata di queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza la classe BillingFlowParams.Builder. Tieni presente che devi impostare il token dell'offerta corrispondente all'offerta selezionata dall'utente quando crei l'oggetto BillingFlowParams. Se un utente è idoneo per l'opzione di acquisto con noleggio, riceverà un'offerta con RentalDetails e offerId in queryProductDetailsAsync().

    L'esempio seguente mostra come avviare il flusso di fatturazione:

    Kotlin

    // An activity reference from which the billing flow will be launched.
    val activity : Activity = ...;
    
    val productDetailsParamsList = listOf(
        BillingFlowParams.ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // Get the offer token:
            // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
            // for a list of offers that are available to the user.
            // b. For subscriptions, call ProductDetails.subscriptionOfferDetails()
            // for a list of offers that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    )
    
    val billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build()
    
    // Launch the billing flow
    val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

    Java

    // An activity reference from which the billing flow will be launched.
    Activity activity = ...;
    
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder()
                 // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
                .setProductDetails(productDetails)
                // Get the offer token:
                // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
                // for a list of offers that are available to the user.
                // b. For subscriptions, call ProductDetails.subscriptionOfferDetails()
                // for a list of offers that are available to the user.
                .setOfferToken(selectedOfferToken)
                .build()
        );
    
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build();
    
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken è disponibile nella sezione OneTimePurchaseOfferDetails. Quando mostri l'offerta all'utente, assicurati di configurare i parametri del flusso di fatturazione con il token dell'offerta corretto, che puoi ottenere dal metodo oneTimePurchaseOfferDetails.getOfferToken().

Offerta di prenotazione

La prenotazione ti consente di configurare i prodotti una tantum da acquistare prima del rilascio dell'articolo. Quando un utente prenota il tuo prodotto, accetta di pagare l'articolo al momento della sua uscita, a meno che non annulli la prenotazione prima della data di uscita. Nella data di uscita, all'acquirente viene addebitato l'importo e Google Play lo informa via email dell'uscita dell'articolo.

Questo documento descrive i passaggi per integrare l'offerta di acquisto in prevendita con la Libreria Fatturazione Google Play (PBL).

Integrare l'offerta di preordine con PBL

Questa sezione descrive come integrare l'offerta di prenotazione con la raccolta di fatturazione di Google Play (PBL). Si presume che tu abbia familiarità con i passaggi iniziali di integrazione della Libreria Fatturazione Play, ad esempio l'aggiunta della dipendenza dalla Libreria Fatturazione Play alla tua app, l'inizializzazione di BillingClient e la connessione a Google Play. Questa sezione si concentra sugli aspetti di integrazione PBL specifici per l'offerta di preordine.

Avviare un flusso di acquisto per un'offerta di prenotazione

Per lanciare un flusso di acquisto per un'offerta di prenotazione, svolgi i seguenti passaggi:

  1. Recupera i metadati dell'offerta di prenotazione utilizzando il metodo ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). L'esempio seguente mostra come ottenere i metadati dell'offerta di prenotazione:

    Java

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // 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();
              }
            }
          }
        }
      }
    });

  2. Avvia il flusso di fatturazione.

    Per avviare una richiesta di acquisto dalla tua app, chiama il metodo launchBillingFlow() dal thread principale dell'app. Questo metodo accetta un riferimento a un BillingFlowParams che contiene l'oggetto pertinente ProductDetails ottenuto dall'chiamata queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza BillingFlowParams.Builder class. Tieni presente che devi impostare il token dell'offerta corrispondente all'offerta selezionata dall'utente quando crei l'oggetto BillingFlowParams. Se un utente è idoneo per l'offerta di prenotazione, riceverà un'offerta con PreorderDetails e offerId nel metodo queryProductDetailsAsync().

    L'esempio seguente mostra come avviare il flusso di fatturazione:

    Java

    // An activity reference from which the billing flow will launch.
    Activity activity = ...;
    ImmutableList productDetailsParamsList =
        ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken è disponibile nella sezione OneTimePurchaseOfferDetails. Quando mostri l'offerta all'utente, assicurati di configurare i parametri del flusso di fatturazione con il token dell'offerta corretto, che puoi ottenere dal metodo oneTimePurchaseOfferDetails.getOfferToken().

Offerta di sconto

Questa sezione descrive come configurare le offerte di sconto per i tuoi prodotti una tantum.

In un'offerta di sconto una tantum per un prodotto puoi configurare quattro diversi parametri:

  • Prezzo dell'offerta scontata: specifica i dettagli della percentuale di sconto o del prezzo assoluto scontato rispetto al prezzo originale.

  • Idoneità per paesi o regioni: specifica la disponibilità di offerte di prodotti a pagamento singolo in un paese o una regione.

  • (Facoltativo) Limite di acquisto: consente di determinare quante volte un utente può utilizzare la stessa offerta. Se un utente supera il limite di acquisto, non sarà idoneo per l'offerta.

  • A tempo limitato (facoltativo): specifica il periodo di tempo in cui l'offerta è disponibile. Al di fuori del periodo di tempo, l'offerta non è idonea per l'acquisto.

Recuperare le informazioni sul prezzo scontato dell'offerta

Per un'offerta scontata, puoi recuperare la percentuale di sconto o lo sconto assoluto offerto.

Esempio 1: recupera la percentuale di sconto dell'offerta scontata

L'esempio seguente mostra come ottenere il prezzo pieno originale dell'offerta scontata e la percentuale di sconto. Tieni presente che le informazioni sulla percentuale di sconto vengono riportate solo per le offerte scontate.

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult){
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and percentageDiscount.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long percentageDiscount =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getPercentageDiscount();
            }
            // …
          }
        }
      }
    });
    
Esempio 2: recuperare lo sconto assoluto dell'offerta scontata

L'esempio seguente mostra come ottenere il prezzo pieno originale dell'offerta scontata e lo sconto assoluto in micro. Tieni presente che lo sconto assoluto nelle informazioni su micros viene restituito solo per le offerte scontate. Per un'offerta di sconto è necessario specificare lo sconto assoluto o percentuale.

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and absolute DiscountAmountMicros.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long discountAmountMicros =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getDiscountAmount()
                      .getDiscountAmountMicros();
            }
            // …
          }
        }
      }
    });
    

Ottenere la finestra temporale valida di un'offerta

Puoi utilizzare il metodo OneTimePurchaseOfferDetails.getValidTimeWindow() per ottenere la finestra temporale valida per un'offerta. Questo oggetto contiene l'ora di inizio e di fine dell'intervallo di tempo in millisecondi.

L'esempio seguente mostra come ottenere la finestra temporale valida di un'offerta:

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) {
              // process the returned startTimeMillis and endTimeMillis.
              ValidTimeWindow validTimeWindow =
                  oneTimePurchaseOfferDetails.getValidTimeWindow();
              long startTimeMillis = validTimeWindow.getStartTimeMillis();
              long endTimeMillis = validTimeWindow.getEndTimeMillis();
              // …
            }
          }
        }
      }
    });
    

Quantità limitata a livello di offerta di sconto

Puoi specificare il limite di quantità massima a livello di offerta di sconto, che viene applicato solo a livello di offerta. Ecco un esempio:

  1. Super screensaver ha due offerte per il prodotto screensaver: screensaver con opzione di acquisto e screensaver scontato.
    1. Il salvaschermo con le opzioni di acquisto non ha una quantità limitata impostata.
    2. Per lo screensaver sconto, la quantità massima consentita a livello di offerta è impostata su 3.
  2. Il prodotto salvaschermo non ha una quantità massima consentita a livello di prodotto, pertanto gli utenti possono acquistarne quantità illimitate.
  3. L'utente possiede un salvaschermo con sconto e prevede di acquistarne un altro con il salvaschermo con sconto.
  4. Quando vengono recuperate le offerte disponibili, il valore LimitedQuantityInfo per lo screensaver dell'opzione di acquisto è nullo e il valore della quantità rimanente per lo screensaver dello sconto è 2.

L'esempio seguente mostra come ottenere la quantità limitata a livello di offerta di sconto:

Java

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) {
              // process the returned maximumQuantity and remainingQuantity.
              LimitedQuantityInfo limitedQuantityInfo =
                  oneTimePurchaseOfferDetails.getLimitedQuantityInfo();
              int maximumQuantity = limitedQuantityInfo.getMaximumQuantity();
              int remainingQuantity = limitedQuantityInfo.getRemainingQuantity();
              // …
            }
          }
        }
      }
    });
    

Quando gli utenti esauriscono le richieste di utilizzo della quantità massima per un'offerta, l'offerta non viene restituita dal metodo getOneTimePurchaseOfferDetailsList().

Calcolare il limite di utilizzo

L'esempio seguente mostra come ottenere le informazioni sulla quantità limitata di una determinata offerta di sconto. Puoi ottenere la quantità massima consentita e la quantità rimanente per l'utente corrente. Tieni presente che la funzionalità di quantità limitata è applicabile sia alle offerte di prodotti una tantum consumabili che a quelle non consumabili. Questa funzionalità è supportata solo a livello di offerta.

Google Play calcola la quantità rimanente sottraendo la quantità di proprietà dell'utente dalla quantità massima consentita che hai configurato. Quando conteggia la quantità di titoli di proprietà dell'utente, Google Play prende in considerazione gli acquisti consumati o in attesa. Gli acquisti annullati, rimborsati o di storno di addebito non vengono conteggiati ai fini della quantità di proprietà dell'utente. Ad esempio:

  1. I super salvaschermo impostano un'offerta di sconto con una quantità massima consentita di uno, in modo che gli utenti possano acquistare fino a un salvaschermo scontato.

  2. L'utente acquista uno dei salvaschermo scontati. Se l'utente tenta di acquistare il secondo salvaschermo scontato, verrà visualizzato un errore ePurchasesUpdatedListener riceverà un codice di risposta ITEM_UNAVAILABLE.

  3. L'utente richiede un rimborso per lo screensaver scontato acquistato originariamente e lo riceve correttamente. L'utente tenta di acquistare uno tra i salvaschermo scontati e l'acquisto andrà a buon fine.

Idoneità per paese e regione

Puoi scegliere i paesi o le regioni in cui l'offerta di opzione di acquisto o l'offerta di sconto sarà disponibile per gli utenti. Google Play valuterà l'idoneità degli utenti in base al paese di Google Play. Quando configuri la disponibilità regionale per un'offerta, questa verrà restituita come parte di getOneTimePurchaseOfferDetailsList() solo se l'utente si trova in un paese o in una regione di destinazione, altrimenti non farà parte dell'elenco di offerte restituito quando chiami queryProductDetailsAsync().

Tag offerta

L'esempio seguente mostra come recuperare i tag di offerta associati a un'offerta.

Java

    
billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // process the returned offer tags.
            ImmutableList<String> offerTags =
                oneTimePurchaseOfferDetails.getOfferTagsList();
            // …
          }
        }
      }
    });
    
    

Ereditarietà dei tag di offerta

Puoi impostare i tag di offerta per prodotti, opzioni di acquisto o offerte di sconto. Le offerte di sconto ereditano i tag dell'offerta dall'opzione di acquisto. Analogamente, se i tag di offerta sono specificati a livello di prodotto, sia le offerte con opzioni di acquisto che le offerte di sconto ereditano i tag di offerta del prodotto.

Ad esempio, Super screensavers ha due offerte per il prodotto salvaschermo: un salvaschermo con opzione di acquisto e un salvaschermo con sconto.

  • Il salvaschermo Super ha il tag dell'offerta del prodotto SSProductTag.
  • Il salvaschermo dell'opzione di acquisto ha il tag dell'offerta SSPurchaseOptionTag.
  • Il salvaschermo dello sconto ha il tag dell'offerta SSDiscountOfferTag.

In questo esempio, il metodo oneTimePurchaseOfferDetails.getOfferTagsList() per l'offerta dell'opzione di acquisto restituisce SSProductTag e SSPurchaseOptionTag. Per l'offerta di sconto, il metodo restituisce SSProductTag, SSPurchaseOptionTag e SSDiscountOfferTag.