Wiele opcji zakupu i ofert dla produktów kupowanych raz

W tym dokumencie opisujemy integrację produktów kupowanych raz z Biblioteką płatności w Play. Wyjaśniamy też, jak zintegrować różne opcje zakupu i oferty związane z produktami kupowanymi raz.

Możesz skonfigurować wiele opcji zakupu i ofert dotyczących produktów kupowanych raz. Możesz na przykład skonfigurować opcję zakupu i ofertę przedsprzedaży dla tego samego produktu kupowanego raz.

Wymagania wstępne

Aby skonfigurować wiele ofert dotyczących produktów kupowanych raz, musisz użyć interfejsu API queryProductDetailsAsync(). Wycofany interfejs API querySkuDetailsAsync() nie jest obsługiwany. Informacje o tym, jak używać queryProductDetailsAsync() i wersji launchBillingFlow() , która przyjmuje ProductDetailsParams jako dane wejściowe, znajdziesz w sekcji Kroki migracji.

Wysyłanie zapytań o szczegóły produktu

Jeśli skonfigurujesz wiele ofert lub opcji zakupu produktu kupowanego raz, obiekt ProductDetails zwracany przez metodę queryProductDetailsAsync() może zawierać więcej niż 1 dostępną opcję zakupu lub wypożyczenia na produkt kupowany raz. Aby uzyskać listę wszystkich kwalifikujących się ofert dla każdego ProductDetails obiektu, użyj getOneTimePurchaseOfferDetailsList() metody. Na tej liście zostaną zwrócone tylko oferty i opcje zakupu, do których użytkownik ma uprawnienia. Kod w metodzie onProductDetailsResponse() powinien obsługiwać zwrócone oferty.

Uruchamianie procesu płatności

Aby rozpocząć prośbę o zakup z aplikacji, wywołaj launchBillingFlow() metodę z głównego wątku aplikacji. Ta metoda przyjmuje odwołanie do obiektu BillingFlowParams, który zawiera odpowiedni obiektProductDetails uzyskany przez wywołaniequeryProductDetailsAsync(). Aby utworzyć obiekt BillingFlowParams, użyj klasy BillingFlowParams.Builder. Pamiętaj, że podczas tworzenia obiektu BillingFlowParams musisz ustawić token oferty odpowiadający ofercie wybranej przez użytkownika.

Poniższy przykład pokazuje, jak uruchomić proces zakupu produktu kupowanego raz z wieloma ofertami:

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);
    
    

offerToken można znaleźć w OneTimePurchaseOfferDetails. Gdy wyświetlasz ofertę użytkownikowi, skonfiguruj parametry procesu płatności za pomocą prawidłowego tokena oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Opcje zakupu i oferty

Opcja zakupu pozwala określić, w jaki sposób uprawnienie jest przyznawane użytkownikowi. Zawiera też informacje o jego cenie i regionie, w którym będzie dostępny. W przypadku jednego produktu może być dostępnych kilka opcji zakupu, które mogą reprezentować miejsce i sposób sprzedaży produktu.

Google Play obsługuje te opcje zakupu produktów kupowanych raz:

  • Opcja zakupu
  • Opcja wypożyczenia

Oferty to schemat cenowy, który możesz utworzyć dla produktów kupowanych raz. Możesz na przykład utworzyć ofertę rabatową dla produktu kupowanego raz.

Google Play obsługuje te oferty zakupu produktów kupowanych raz:

  • Oferta przedsprzedaży (obsługiwana tylko w przypadku opcji zakupu)
  • Oferta rabatowa (obsługiwana w przypadku opcji zakupu i wypożyczenia)

Opcja zakupu

Opcja zakupu oznacza standardowy, bezpośredni zakup produktu kupowanego raz. Ma opcjonalne pole `legacyCompatible`, które wskazuje, czy ta opcja zakupu będzie dostępna w starszych procesach Biblioteki płatności w Play (w wersji 7 lub starszej), które nie obsługują nowego modelu. Aby zapewnić zgodność wsteczną, co najmniej 1 opcja zakupu powinna być oznaczona jako zgodna ze starszą wersją.

Kroki integracji opcji zakupu i wypożyczenia z Biblioteką płatności w Play są takie same. Aby dowiedzieć się, jak zintegrować opcję zakupu z Biblioteką płatności w Play, przeczytaj artykuł Integracja opcji wypożyczenia z Biblioteką płatności w Play.

Opcja wypożyczenia

Opcja wypożyczenia umożliwia użytkownikom dostęp do produktów kupowanych raz przez określony czas. Możesz określić okres wypożyczenia i jego wygaśnięcie. W tym dokumencie opisujemy, jak zintegrować opcję wypożyczenia z Biblioteką płatności w Play.

Integracja opcji wypożyczenia z Biblioteką płatności w Play

W tej sekcji opisujemy, jak zintegrować opcję wypożyczenia z Biblioteką płatności w Play. Zakładamy, że znasz wstępne kroki integracji z Biblioteką płatności w Play , takie jak dodanie zależności Biblioteki płatności w Play do aplikacji, zainicjowanie BillingClient i połączenie z Google Play. Ta sekcja skupia się na aspektach integracji z Biblioteką płatności w Play, które są specyficzne dla opcji wypożyczenia.

Aby skonfigurować produkty dostępne do wypożyczenia, musisz użyć nowej usługi monetization.onetimeproducts interfejsu Play Developer API lub interfejsu Konsoli Play. Aby korzystać z usługi, możesz bezpośrednio wywołać interfejs REST API lub użyć biblioteki klienta Java.

Uruchamianie procesu zakupu w przypadku opcji wypożyczenia

Aby uruchomić proces zakupu w przypadku oferty wypożyczenia:

  1. Pobierz metadane opcji wypożyczenia za pomocą metody ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Poniższy przykład pokazuje, jak uzyskać metadane opcji wypożyczenia:

    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. Uruchom proces płatności.

    Aby rozpocząć prośbę o zakup z aplikacji, wywołaj metodę launchBillingFlow() z głównego wątku aplikacji. Ta metoda przyjmuje odwołanie do obiektu BillingFlowParams, który zawiera odpowiedni obiekt ProductDetails uzyskany przez wywołanie queryProductDetailsAsync(). Aby utworzyć obiekt BillingFlowParams, użyj klasy BillingFlowParams.Builder. Pamiętaj, że musisz ustawić token oferty odpowiadający ofercie wybranej przez użytkownika podczas tworzenia obiektu BillingFlowParams. Jeśli użytkownik kwalifikuje się do opcji wypożyczenia, otrzyma ofertę z elementami RentalDetails i offerId w queryProductDetailsAsync().

    Poniższy przykład pokazuje, jak uruchomić proces płatności:

    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);

    offerToken można znaleźć w OneTimePurchaseOfferDetails. Gdy wyświetlasz ofertę użytkownikowi, skonfiguruj parametry procesu płatności za pomocą prawidłowego tokena oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Oferta przedsprzedaży

Przedsprzedaż umożliwia skonfigurowanie produktów kupowanych raz, tak aby można je było kupić przed premierą. Gdy użytkownik kupi produkt w przedsprzedaży, zgadza się zapłacić za niego w dniu premiery, chyba że użytkownik anuluje zamówienie przed tą datą. W dniu premiery kupujący zostanie obciążony opłatą, a Google Play wyśle mu e-maila z powiadomieniem o premierze produktu.

W tym dokumencie opisujemy, jak zintegrować ofertę przedsprzedaży z Biblioteką płatności w Play.

Integracja oferty przedsprzedaży z Biblioteką płatności w Play

W tej sekcji opisujemy, jak zintegrować ofertę przedsprzedaży z Biblioteką płatności w Play. Zakładamy, że znasz wstępne kroki integracji z Biblioteką płatności w Play , takie jak dodanie zależności Biblioteki płatności w Play do aplikacji, zainicjowanie BillingClient i połączenie z Google Play. Ta sekcja skupia się na aspektach integracji z Biblioteką płatności w Play, które są specyficzne dla oferty przedsprzedaży.

Uruchamianie procesu zakupu w przypadku oferty przedsprzedaży

Aby uruchomić proces zakupu w przypadku oferty przedsprzedaży:

  1. Pobierz metadane oferty przedsprzedaży za pomocą ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() metody. Poniższy przykład pokazuje, jak uzyskać metadane oferty przedsprzedaży:

    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. Uruchom proces płatności.

    Aby rozpocząć prośbę o zakup z aplikacji, wywołaj metodę launchBillingFlow() z głównego wątku aplikacji. Ta metoda przyjmuje odwołanie do BillingFlowParams obiektu, który zawiera odpowiedni ProductDetails obiekt uzyskany przez wywołanie queryProductDetailsAsync(). Aby utworzyć BillingFlowParams obiekt, użyj klasy BillingFlowParams.Builder class. Pamiętaj, że podczas tworzenia obiektuBillingFlowParams musisz ustawić token oferty odpowiadający ofercie wybranej przez użytkownika. Jeśli użytkownik kwalifikuje się do oferty przedsprzedaży, otrzyma ofertę z elementami PreorderDetails i offerId w metodzie queryProductDetailsAsync().

    Poniższy przykład pokazuje, jak uruchomić proces płatności:

    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 można znaleźć w OneTimePurchaseOfferDetails. Gdy wyświetlasz ofertę użytkownikowi, skonfiguruj parametry procesu płatności za pomocą prawidłowego tokena oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Oferta rabatowa

W tej sekcji opisujemy, jak skonfigurować oferty rabatowe dla produktów kupowanych raz.

W ofercie rabatowej dotyczącej produktu kupowanego raz możesz skonfigurować 4 różne parametry:

  • Cena oferty z rabatem: określa szczegóły dotyczące rabatu procentowego lub ceny bezwzględnej w stosunku do ceny pierwotnej.

  • Kraje lub regiony, w których oferta jest dostępna: określa dostępność ofert produktów kupowanych raz w danym kraju lub regionie.

  • Limit zakupu (opcjonalnie): pozwala określić, ile razy użytkownik może skorzystać z tej samej oferty. Jeśli użytkownik przekroczy limit zakupu, nie będzie mógł skorzystać z oferty.

  • Ograniczenie czasowe (opcjonalnie): określa okres, w którym oferta jest dostępna. Po upływie tego okresu oferta nie będzie dostępna.

Pobieranie informacji o cenie oferty z rabatem

W przypadku oferty z rabatem możesz pobrać procent rabatu lub oferowany rabat bezwarunkowy.

Przykład 1. Pobieranie rabatu procentowego oferty z rabatem

Poniższy przykład pokazuje, jak uzyskać pierwotną cenę biletu normalnego oferty z rabatem i jej rabat procentowy. Pamiętaj, że informacje o rabacie procentowym są zwracane tylko w przypadku ofert z rabatem.

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();
            }
            // …
          }
        }
      }
    });
    
Przykład 2. Pobieranie rabatu bezwarunkowego oferty z rabatem

Poniższy przykład pokazuje, jak uzyskać pierwotną cenę pełną oferty z rabatem i jej rabat bezwarunkowy w mikrach. Pamiętaj, że informacje o rabacie bezwzględnym w mikrach są zwracane tylko w przypadku ofert z rabatem. W przypadku oferty rabatowej należy określić rabat bezwzględny lub rabat procentowy.

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();
            }
            // …
          }
        }
      }
    });
    

Pobieranie prawidłowego okresu obowiązywania oferty

Aby uzyskać prawidłowy okres obowiązywania oferty, możesz użyć metody OneTimePurchaseOfferDetails.getValidTimeWindow(). Ten obiekt zawiera czas rozpoczęcia i zakończenia okresu w milisekundach.

Poniższy przykład pokazuje, jak uzyskać prawidłowy okres obowiązywania oferty:

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();
              // …
            }
          }
        }
      }
    });
    

Ograniczona ilość na poziomie oferty rabatowej

Możesz określić maksymalny limit ilości na poziomie oferty rabatowej, który jest stosowany tylko na poziomie oferty. Oto przykład:

  1. Firma Super screensavers ma 2 oferty dotyczące wygaszacza ekranu: opcję zakupu wygaszacza ekranu i wygaszacz ekranu z rabatem.
    1. Opcja zakupu wygaszacza ekranu nie ma ustawionego limitu ilości.
    2. W przypadku wygaszacza ekranu z rabatem maksymalna dozwolona ilość na poziomie oferty jest ustawiona na 3.
  2. Wygaszacz ekranu nie ma maksymalnej dozwolonej ilości na poziomie produktu, więc użytkownicy mogą kupować nieograniczoną ilość tego produktu.
  3. Użytkownik ma 1 wygaszacz ekranu z rabatem i planuje kupić kolejny z rabatem.
  4. Podczas pobierania dostępnych ofert LimitedQuantityInfo dla opcji zakupu wygaszacza ekranu ma wartość null, a pozostała ilość dla wygaszacza ekranu z rabatem wynosi 2.

Poniższy przykład pokazuje, jak uzyskać ograniczoną ilość na poziomie oferty rabatowej:

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();
              // …
            }
          }
        }
      }
    });
    

Gdy użytkownicy wykorzystają maksymalną liczbę wykorzystań oferty, oferta nie będzie zwracana przez metodę getOneTimePurchaseOfferDetailsList().

Obliczanie limitu wykorzystania

Poniższy przykład pokazuje, jak uzyskać informacje o ograniczonej ilości w przypadku określonej oferty rabatowej. Możesz uzyskać maksymalną dozwoloną ilość i pozostałą ilość dla bieżącego użytkownika. Pamiętaj, że funkcja ograniczonej ilości ma zastosowanie zarówno do ofert produktów kupowanych raz, które można wykorzystać, jak i tych, których nie można wykorzystać. Ta funkcja jest obsługiwana tylko na poziomie oferty.

Google Play oblicza pozostałą ilość, odejmując ilość należącą do użytkownika od maksymalnej dozwolonej ilości, którą skonfigurowano. Podczas zliczania ilości należącej do użytkownika Google Play uwzględnia zakupy wykorzystane lub oczekujące. Zakupy, które zostały anulowane, zwrócone lub obciążone zwrotem, nie są uwzględniane w ilości należącej do użytkownika. Przykład:

  1. Firma Super screensavers skonfigurowała ofertę rabatową z maksymalną dozwoloną ilością 1, dzięki czemu użytkownicy mogą kupić maksymalnie 1 wygaszacz ekranu z rabatem.

  2. Użytkownik kupuje 1 wygaszacz ekranu z rabatem. Jeśli użytkownik spróbuje kupić drugi wygaszacz ekranu z rabatem, wystąpi błąd, a PurchasesUpdatedListener otrzyma kod odpowiedzi ITEM_UNAVAILABLE.

  3. Użytkownik prosi o zwrot środków za pierwotnie zakupiony wygaszacz ekranu z rabatem i otrzymuje zwrot. Użytkownik próbuje kupić 1 wygaszacz ekranu z rabatem i zakup się powiedzie.

Kraje i regiony, w których oferta jest dostępna

Możesz wybrać kraje lub regiony, w których oferta opcji zakupu lub oferta rabatowa będzie dostępna dla użytkowników. Google Play oceni uprawnienia użytkownika na podstawie kraju w Google Play. Jeśli skonfigurujesz regionalną dostępność oferty, będzie ona zwracana w ramach getOneTimePurchaseOfferDetailsList() tylko wtedy, gdy użytkownik znajduje się w kraju lub regionie docelowym. W przeciwnym razie nie będzie ona częścią listy ofert zwracanych po wywołaniu queryProductDetailsAsync().

Tagi ofert

Poniższy przykład pokazuje, jak pobrać tagi ofert powiązane z ofertą.

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();
            // …
          }
        }
      }
    });
    
    

Dziedziczenie tagów ofert

Tagi ofert możesz ustawić dla produktu, opcji zakupu lub oferty rabatowej. Oferty rabatowe dziedziczą tagi ofert z oferty opcji zakupu. Podobnie, jeśli tagi ofert są określone na poziomie produktu, zarówno oferta opcji zakupu, jak i oferty rabatowe dziedziczą tagi ofert produktu.

Na przykład firma Super screensavers ma 2 oferty dotyczące wygaszacza ekranu: opcję zakupu wygaszacza ekranu i wygaszacz ekranu z rabatem.

  • Super screensaver ma tag oferty produktu SSProductTag.
  • Opcja zakupu wygaszacza ekranu ma tag oferty SSPurchaseOptionTag.
  • Wygaszacz ekranu z rabatem ma tag oferty SSDiscountOfferTag.

W tym przykładzie metoda oneTimePurchaseOfferDetails.getOfferTagsList() dla oferty opcji zakupu zwraca SSProductTag i SSPurchaseOptionTag. W przypadku oferty rabatowej metoda zwraca SSProductTag, SSPurchaseOptionTag i SSDiscountOfferTag.