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 correlate ai tuoi prodotti a pagamento singolo.

Puoi configurare più opzioni di acquisto e offerte per i tuoi prodotti a pagamento singolo. Ad esempio, puoi configurare un'opzione di acquisto Acquista 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'API queryProductDetailsAsync(). L'API querySkuDetailsAsync() deprecata non è supportata. Per informazioni su come utilizzare queryProductDetailsAsync() e la versione di launchBillingFlow() che accetta ProductDetailsParams come input, consulta i passaggi di migrazione.

Eseguire 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 disponibile per l'acquisto e/o il noleggio per prodotto a pagamento singolo. Per ottenere l'elenco di tutte le offerte idonee per ogni oggetto ProductDetails, utilizza il metodo getOneTimePurchaseOfferDetailsList(). Nell'elenco verranno restituite solo le offerte e le opzioni di acquisto per le quali l'utente è idoneo. Il tuo 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 accetta un riferimento a un oggetto BillingFlowParams che contiene l'oggetto ProductDetails pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza la classe BillingFlowParams.Builder. Tieni presente che devi impostare il token dell'offerta corrispondente a quella selezionata dall'utente durante la creazione dell'oggetto BillingFlowParams.

Il seguente esempio 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 si trova all'interno del 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 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:

  • Acquista opzione di acquisto
  • Opzione di acquisto Noleggia

Le offerte si riferiscono a un sistema 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)
  • Offerta di sconto (supportata per le opzioni di acquisto Acquista e Noleggia)

Acquista opzione di acquisto

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 della Libreria Fatturazione Play precedenti (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 le versioni precedenti.

I passaggi per integrare le opzioni di acquisto Acquista e Noleggia con PBL sono gli stessi. Per capire come integrare l'opzione di acquisto con la Libreria Fatturazione Play, vedi Integrare l'opzione di acquisto a noleggio 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 del noleggio 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 del noleggio con la Libreria Fatturazione Play. Presuppone che tu conosca i passaggi iniziali di integrazione 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 dell'integrazione della Libreria Fatturazione Play specifici dell'opzione di acquisto del noleggio.

Per configurare i prodotti disponibili per il noleggio, devi utilizzare il nuovo servizio monetization.onetimeproducts dell'API Play Developer o l'UI di Play Developer 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 Noleggia utilizzando il metodo ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Il seguente esempio mostra come ottenere i metadati dell'acquisto del noleggio:

    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 accetta un riferimento a un oggetto BillingFlowParams che contiene l'oggetto ProductDetails pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza la classe BillingFlowParams.Builder. Tieni presente che devi impostare il token dell'offerta corrispondente a quella selezionata dall'utente quando crei l'oggetto BillingFlowParams. Se un utente è idoneo per l'opzione di acquisto del noleggio, riceverà un'offerta con RentalDetails e offerId in queryProductDetailsAsync().

    Il seguente esempio 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);

    Il offerToken si trova all'interno del 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 prodotti a pagamento singolo da acquistare prima dell'uscita dell'articolo. Quando un utente prenota il tuo prodotto, accetta di pagare l'articolo al momento dell'uscita del prodotto, a meno che non annulli la prenotazione prima della data di uscita. Alla data di uscita, all'acquirente viene addebitato l'importo e Play lo informa via email che l'articolo è stato rilasciato.

Questo documento descrive i passaggi per integrare l'offerta di acquisto in preordine con la Libreria Fatturazione Play.

Integrare l'offerta di pre-ordine con PBL

Questa sezione descrive come integrare l'offerta di pre-ordine con la libreria Play Billing Library (PBL). Presuppone che tu conosca i passaggi iniziali di integrazione 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 dell'integrazione di PBL specifici per l'offerta di preordine.

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 prenotazione utilizzando il metodo ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). Il seguente esempio 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 oggetto BillingFlowParams che contiene l'oggetto ProductDetails pertinente ottenuto chiamando queryProductDetailsAsync(). Per creare un oggetto BillingFlowParams, utilizza BillingFlowParams.Builder class. Tieni presente che devi impostare il token dell'offerta corrispondente a quella selezionata dall'utente durante la creazione dell'oggetto BillingFlowParams. Se un utente è idoneo per l'offerta di pre-ordine, riceverà un'offerta con PreorderDetails e offerId nel metodo queryProductDetailsAsync().

    Il seguente esempio 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 si trova all'interno del 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.

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

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

  • Idoneità di paesi o regioni: specifica la disponibilità di offerte di prodotti una tantum in un paese o 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 potrà usufruire dell'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 percentuale di sconto. Tieni presente che le informazioni sullo sconto percentuale 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 pieno originale dell'offerta scontata e lo sconto assoluto in micro. Tieni presente che lo sconto assoluto in microinformazioni viene restituito solo per le offerte scontate. Per un'offerta di sconto, è necessario specificare lo sconto assoluto o lo sconto 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();
            }
            // …
          }
        }
      }
    });
    

Recuperare 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 massimo di quantità a livello di offerta di sconto, ovvero applicato solo a livello di offerta. Ecco un esempio:

  1. Super screensavers offre due opzioni per il prodotto salvaschermo: l'acquisto del salvaschermo e il salvaschermo scontato.
    1. Il salvaschermo con opzioni di acquisto non ha una quantità limitata impostata.
    2. Il salvaschermo con lo sconto 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 un salvaschermo scontato e prevede di acquistarne un altro con il salvaschermo scontato.
  4. Quando recupera le offerte disponibili, LimitedQuantityInfo per il salvaschermo dell'opzione di acquisto è null e il valore della quantità rimanente per il salvaschermo dello sconto è 2.

Il seguente esempio mostra come ottenere la quantità limitata a livello di offerta con 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, questa 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 con 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 di consumo che a quelle di prodotti non di consumo una tantum. 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 proprietà dell'utente, Google Play prende in considerazione gli acquisti consumati o in attesa. Gli acquisti annullati, rimborsati o stornati non vengono conteggiati ai fini della quantità di proprietà dell'utente. Ad esempio:

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

  2. L'utente acquista uno dei salvaschermi scontati. Se l'utente tenta di acquistare il secondo salvaschermo scontato, si verifica un errore e il 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 dei salvaschermo scontati e l'acquisto andrà a buon fine.

Idoneità di paesi e regioni

Puoi scegliere i paesi o le regioni in cui l'offerta o lo sconto dell'opzione di acquisto 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 solo come parte di getOneTimePurchaseOfferDetailsList() se l'utente si trova in un paese o in una regione di destinazione, altrimenti non farà parte dell'elenco delle offerte restituite quando chiami queryProductDetailsAsync().

Tag offerta

Il seguente esempio mostra come recuperare i tag 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 dell'offerta

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

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

  • Il salvaschermo avanzato ha il tag dell'offerta del prodotto SSProductTag.
  • Il salvaschermo dell'opzione di acquisto ha il tag dell'offerta SSPurchaseOptionTag.
  • Il salvaschermo con lo sconto ha il tag 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.