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

Questo documento descrive in dettaglio l'integrazione dei tuoi prodotti a pagamento singolo con la Libreria Fatturazione Play. Spiega inoltre come integrare varie offerte e opzioni di acquisto relative ai tuoi prodotti a pagamento singolo.

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

Prerequisiti

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

Eseguire una query sui dettagli del prodotto

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

Avviare il flusso di fatturazione

Per avviare una richiesta di acquisto dalla tua app, chiama il launchBillingFlow() metodo dal thread principale dell'app. Questo metodo accetta un riferimento a un BillingFlowParams oggetto che contiene l'oggetto ProductDetails pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un BillingFlowParams oggetto, utilizza la BillingFlowParams.Builder classe. 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 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);
    
    

Il offerToken è disponibile come parte di 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 relativo prezzo e la regione in cui è disponibile il prodotto. Un singolo prodotto può avere più opzioni di acquisto, che possono rappresentare dove e come vendi il tuo prodotto.

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

  • Opzione di acquisto Acquista
  • Opzione di acquisto Noleggia

Le offerte si riferiscono a uno schema di prezzi che puoi creare per i tuoi prodotti a pagamento singolo. Ad esempio, puoi creare un'offerta di sconto per il tuo prodotto a pagamento singolo.

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 Acquista che Noleggia)

Opzione di acquisto Acquista

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

I passaggi per integrare le opzioni di acquisto Acquista e Noleggia con la Libreria Fatturazione Play sono gli stessi. Per capire come integrare l'opzione di acquisto Acquista con la Libreria Fatturazione Play, consulta Integrare l'opzione di acquisto Noleggia con la Libreria Fatturazione Play.

Opzione di acquisto Noleggia

L'opzione di acquisto Noleggia consente agli utenti di accedere ai prodotti a pagamento singolo per un periodo di tempo specificato. Puoi specificare il periodo di noleggio e la relativa scadenza. Questo documento descrive i passaggi per integrare l'opzione di acquisto Noleggia con la Libreria Fatturazione Play.

Integrare l'opzione di acquisto Noleggia con la Libreria Fatturazione Play

Questa sezione descrive come integrare l'opzione di acquisto Noleggia con la Libreria Fatturazione Play. Si presuppone che tu conosca i passaggi di integrazione iniziali della Libreria Fatturazione Play , ad esempio l'aggiunta della dipendenza della Libreria Fatturazione Play alla tua app, l'inizializzazione di BillingClient e la connessione a Google Play. Questa sezione si concentra sugli aspetti di integrazione della Libreria Fatturazione Play specifici per l'opzione di acquisto Noleggia.

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

Avviare un flusso di acquisto per l'opzione Noleggia

Per avviare un flusso di acquisto per un'offerta di noleggio, svolgi i seguenti passaggi:

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

    L'esempio seguente mostra come ottenere i metadati dell'opzione di acquisto Noleggia:

    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 launchBillingFlow() metodo dal thread principale dell'app. Questo metodo accetta un riferimento a un oggetto BillingFlowParams che contiene l'oggetto ProductDetails pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un BillingFlowParams oggetto, 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 Noleggia, 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.getSubscriptionOfferDetails()
            // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            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.getSubscriptionOfferDetails()
                // 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);

    Il offerToken è disponibile come parte di 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 pre-ordine

Il pre-ordine ti consente di configurare i prodotti a pagamento singolo in modo che possano essere acquistati prima della loro uscita. Quando un utente pre-ordina il tuo prodotto, accetta di pagare l'articolo al momento dell'uscita del prodotto, a meno che l'utente non annulli il pre-ordine prima della data di uscita. Alla data di uscita, all'acquirente viene addebitato l'importo e riceve una notifica via email da Play che lo informa dell'uscita dell'articolo.

Questo documento descrive i passaggi per integrare l'offerta di acquisto di pre-ordine con la Libreria Fatturazione Play.

Integrare l'offerta di pre-ordine con la Libreria Fatturazione Play

Questa sezione descrive come integrare l'offerta di pre-ordine con la Libreria Fatturazione Play. Si presuppone che tu conosca i passaggi di integrazione iniziali della Libreria Fatturazione Play , ad esempio l'aggiunta della dipendenza della Libreria Fatturazione Play alla tua app, l'inizializzazione di BillingClient e la connessione a Google Play. Questa sezione si concentra sugli aspetti di integrazione della Libreria Fatturazione Play specifici per l'offerta di pre-ordine.

Avviare un flusso di acquisto per un'offerta di pre-ordine

Per avviare un flusso di acquisto per un'offerta di pre-ordine, svolgi i seguenti passaggi:

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

    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 oggetto che contiene l' ProductDetails oggetto pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un BillingFlowParams oggetto, utilizza la 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 pre-ordine, 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);

    Il offerToken è disponibile come parte di 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 a pagamento singolo.

Esistono quattro parametri diversi che puoi configurare in un'offerta di sconto per un prodotto a pagamento singolo:

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

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

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

  • 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 dell'offerta scontata

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

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

L'esempio seguente mostra come ottenere il prezzo intero originale dell'offerta scontata e la relativa percentuale di sconto. Tieni presente che le informazioni sulla percentuale di sconto vengono restituite 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 intero originale dell'offerta scontata e lo sconto assoluto in micro. Tieni presente che le informazioni sullo sconto assoluto in micro vengono restituite solo per le offerte scontate. Per un'offerta di sconto è necessario specificare lo sconto assoluto o la percentuale 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()) {
            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 della finestra temporale 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à massimo a livello di offerta di sconto, che viene applicato solo a livello di offerta. Ecco un esempio per illustrare:

  1. Super screensavers ha 2 offerte per il prodotto screensaver: screensaver con opzione di acquisto e screensaver scontato.
    1. Lo screensaver con opzione di acquisto non ha una quantità limitata impostata.
    2. Lo screensaver scontato ha la quantità massima consentita a livello di offerta impostata su 3.
  2. Il prodotto screensaver non ha una quantità massima consentita a livello di prodotto, quindi gli utenti possono acquistare quantità illimitate di questo prodotto.
  3. L'utente possiede 1 screensaver scontato e prevede di acquistarne un altro con lo screensaver scontato.
  4. Quando recuperi le offerte disponibili, LimitedQuantityInfo per lo screensaver con opzione di acquisto è null e il valore della quantità rimanente per lo screensaver scontato è 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 utilizzano il numero massimo di utilizzi 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 per 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 a pagamento singolo consumabili che 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 conta la quantità di proprietà dell'utente, Google Play considera gli acquisti consumati o in attesa. Gli acquisti annullati, rimborsati o stornati non vengono conteggiati nella quantità di proprietà dell'utente. Ad esempio:

  1. Super screensavers ha configurato un'offerta di sconto con una quantità massima consentita di uno, quindi gli utenti possono acquistare fino a uno screensaver scontato.

  2. L'utente acquista uno degli screensaver scontati. Se l'utente tenta di acquistare il secondo screensaver scontato, si verifica un errore e PurchasesUpdatedListener riceve un codice di risposta ITEM_UNAVAILABLE.

  3. L'utente chiede un rimborso dello screensaver scontato acquistato originariamente e lo riceve. L'utente tenta di acquistare uno degli screensaver scontati e l'acquisto andrà a buon fine.

Idoneità di paesi e regioni

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à dell'utente in base al paese di Play. Quando configuri la disponibilità regionale per un'offerta, questa verrà restituita solo come parte di getOneTimePurchaseOfferDetailsList() se l'utente si trova in un paese o in una regione target, altrimenti non farà parte dell'elenco delle offerte restituite quando chiami queryProductDetailsAsync().

Tag delle offerte

L'esempio seguente mostra come recuperare i tag delle offerte 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 delle offerte

Puoi impostare i tag delle offerte per il prodotto, l'opzione di acquisto o l'offerta di sconto. Le offerte di sconto ereditano i tag delle offerte dall'offerta dell'opzione di acquisto. Allo stesso modo, se i tag delle offerte sono specificati a livello di prodotto, sia l'offerta dell'opzione di acquisto sia le offerte di sconto ereditano i tag delle offerte del prodotto.

Ad esempio, Super screensavers ha due offerte per il prodotto screensaver: screensaver con opzione di acquisto e screensaver scontato.

  • Super screensaver ha il tag dell'offerta del prodotto SSProductTag.
  • Lo screensaver con opzione di acquisto ha il tag dell'offerta SSPurchaseOptionTag.
  • Lo screensaver scontato 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.