Wiele opcji zakupu i ofert dla produktów kupowanych raz

Ten dokument zawiera szczegółowe informacje o integracji produktów kupowanych raz z Biblioteką płatności w Play. Dowiesz się z niego też, jak zintegrować różne opcje zakupu i oferty związane z produktami kupowanymi raz.

W przypadku produktów jednorazowych możesz skonfigurować wiele opcji zakupu i ofert. Możesz na przykład skonfigurować opcję kupna i ofertę w przedsprzedaży dla tego samego produktu kupowanego raz.

Wymagania wstępne

Aby skonfigurować wiele ofert produktów kupowanych raz, musisz użyć interfejsu API queryProductDetailsAsync(). Interfejs API querySkuDetailsAsync(), który został wycofany, nie jest obsługiwany. Informacje o używaniu queryProductDetailsAsync() i wersji launchBillingFlow(), która przyjmuje jako dane wejściowe ProductDetailsParams, znajdziesz w krokach migracji.

Wysyłanie zapytania dotyczącego szczegółów produktu

Jeśli dla produktu jednorazowego skonfigurowano wiele ofert lub opcji zakupu, obiekt ProductDetails zwrócony przez metodę queryProductDetailsAsync() może mieć więcej niż jedną opcję zakupu (lub wypożyczenia) produktu jednorazowego. Aby uzyskać listę wszystkich kwalifikujących się ofert dla każdego obiektu ProductDetails, użyj metody getOneTimePurchaseOfferDetailsList(). Na liście tej będą zwracane tylko oferty i opcje zakupu, które są dostępne dla użytkownika. Kod w metodzie onProductDetailsResponse() powinien obsługiwać zwracane oferty.

Uruchomienie procesu płatności

Aby rozpocząć żądanie zakupu z aplikacji, wywołaj metodę launchBillingFlow() w głównym wątku aplikacji. Ta metoda przyjmuje odwołanie do obiektu BillingFlowParams, który zawiera odpowiedni obiekt ProductDetails, uzyskany przez wywołanie metody queryProductDetailsAsync(). 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.

Ten przykład pokazuje, jak uruchomić proces zakupu produktu jednorazowego 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 &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);
    
    

Funkcję offerToken znajdziesz w ramach OneTimePurchaseOfferDetails. Gdy wyświetlasz ofertę użytkownikowi, pamiętaj, aby skonfigurować parametry procesu płatności, podając prawidłowy token oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Opcje zakupu i oferty

Opcja zakupu umożliwia określenie sposobu przyznania uprawnień użytkownikowi, ceny i regionu, w którym produkt jest dostępny. Pojedynczy produkt może mieć wiele opcji zakupu, które określają, gdzie i jak sprzedajesz produkt.

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

  • Opcja zakupu
  • Opcja zakupu filmu do wypożyczenia

Oferty odnoszą się do schematu cenowego, który możesz utworzyć dla produktów jednorazowych. Możesz na przykład utworzyć ofertę rabatową na produkt jednorazowy.

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

  • oferta w przedsprzedaży (obsługiwana tylko w przypadku opcji zakupu),
  • oferta rabatowa (obsługiwana zarówno w przypadku opcji kupna, jak i wypożyczenia),

Opcja zakupu

Opcja kupna to standardowy, bezpośredni zakup produktu kupowanego raz. Zawiera opcjonalne pole legacyCompatible, które wskazuje, czy ta opcja zakupu będzie dostępna w starszych przepływach Biblioteki płatności w Play (w wersji 7 lub starszej), które nie obsługują nowego modelu. Ze względu na zgodność wsteczną co najmniej jedna opcja zakupu powinna być oznaczona jako zgodna ze starszymi wersjami.

Kroki integracji opcji kupna i wypożyczenia z PBL są takie same. Aby dowiedzieć się, jak zintegrować opcję kupna z PBL, przeczytaj artykuł Integracja opcji kupna z PBL.

Opcja zakupu filmu do wypożyczenia

Opcja wypożyczenia umożliwia użytkownikom dostęp do produktów jednorazowych przez określony czas. Możesz określić okres wypożyczenia i datę jego wygaśnięcia. Ten dokument zawiera opis czynności, które należy wykonać, aby zintegrować opcję wypożyczenia z biblioteką płatności Google Play (PBL).

.

Integracja opcji wypożyczenia z platformą PBL

Z tej sekcji dowiesz się, jak zintegrować opcję wypożyczenia z Play Billing Library (PBL). Zakładamy, że znasz początkowe kroki integracji z PBLi, takie jak dodanie zależności PBL do aplikacji, inicjowanie BillingClientłączenie z Google Play. Ta sekcja dotyczy aspektów integracji z platformą PBL, które są specyficzne dla opcji wynajmu z opcją wykupu.

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

Uruchom proces zakupu w przypadku opcji wypożyczenia

Aby rozpocząć proces zakupu oferty wypożyczenia:

  1. Pobierz metadane opcji zakupu filmu do wypożyczenia, używając metody ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Ten przykład pokazuje, jak uzyskać metadane zakupu na podstawie 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ąć żądanie zakupu z aplikacji, wywołaj metodę launchBillingFlow() w głównym wątku aplikacji. Ta metoda przyjmuje odwołanie do obiektu BillingFlowParams, który zawiera odpowiedni obiekt ProductDetails uzyskany przez wywołanie metody queryProductDetailsAsync(). 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. Jeśli użytkownik kwalifikuje się do skorzystania z opcji wypożyczenia, otrzyma ofertę z RentalDetails i offerId w queryProductDetailsAsync().

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

    Funkcję offerToken znajdziesz w ramach OneTimePurchaseOfferDetails. Podczas wyświetlania oferty użytkownikowi pamiętaj, aby skonfigurować parametry procesu płatności za pomocą prawidłowego tokena oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Oferta w przedsprzedaży

Przedsprzedaż umożliwia skonfigurowanie produktów jednorazowych, które można kupić przed udostępnieniem produktu. Gdy użytkownik złoży zamówienie w przedsprzedaży, zgadza się zapłacić za produkt w dacie jego premiery, chyba że anuluje zamówienie przed datą premiery. W dniu premiery kupujący zostanie obciążony opłatą, a Google Play wyśle mu e-maila z powiadomieniem o premierze produktu.

Ten dokument zawiera instrukcje integracji oferty zakupu w przedsprzedaży z biblioteką płatności Play (PBL).

Integracja oferty w przedsprzedaży z platformą PBL

Z tej sekcji dowiesz się, jak zintegrować ofertę w przedsprzedaży z biblioteką płatności w Google Play (PBL). Zakładamy, że znasz początkowe kroki integracji z PBLi, takie jak dodanie zależności PBL do aplikacji, inicjowanie BillingClientłączenie z Google Play. Ta sekcja dotyczy aspektów integracji z platformą PBL, które są specyficzne dla oferty wczesnego zamówienia.

Uruchamianie procesu zakupu w ramach oferty w przedsprzedaży

Aby rozpocząć proces zakupu w ramach oferty w przedsprzedaży:

  1. Pobierz metadane oferty w przedsprzedaży, używając metody ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). Ten przykład pokazuje, jak uzyskać metadane oferty w 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ąć żądanie zakupu 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 metody queryProductDetailsAsync(). Aby utworzyć obiekt BillingFlowParams, użyj obiektu BillingFlowParams.Builder class. Pamiętaj, że podczas tworzenia obiektu BillingFlowParams musisz ustawić token oferty odpowiadający ofercie wybranej przez użytkownika. Jeśli użytkownik kwalifikuje się do oferty przedsprzedaży, otrzyma ofertę z parametrami PreorderDetails i offerId w metodzie queryProductDetailsAsync().

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

    Funkcję offerToken znajdziesz w ramach OneTimePurchaseOfferDetails. Podczas wyświetlania oferty użytkownikowi pamiętaj, aby skonfigurować parametry procesu płatności za pomocą prawidłowego tokena oferty, który możesz uzyskać za pomocą metody oneTimePurchaseOfferDetails.getOfferToken().

Oferta zniżkowa

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

W ramach jednorazowej oferty rabatowej na produkt możesz skonfigurować 4 parametry:

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

  • Kraje lub regiony kwalifikujące się do korzystania z oferty: 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 wykorzystać tę samą ofertę. Jeśli użytkownik przekroczy limit zakupów, nie będzie mógł skorzystać z oferty.

  • Ograniczony czas (opcjonalnie): określa okres, w którym oferta jest dostępna. Poza tym okresem oferta nie jest dostępna do zakupu.

Pobieranie informacji o cenie oferty rabatowej

W przypadku oferty rabatowej możesz pobrać procent rabatu lub oferowany rabat bezwzględny.

Przykład 1. Pobieranie procentowego rabatu w ramach oferty promocyjnej

Poniższy przykład pokazuje, jak uzyskać pierwotną cenę pełną oferty promocyjnej oraz jej rabat procentowy. Pamiętaj, że informacje o rabatach procentowych są zwracane tylko w przypadku ofert zniżkowych.

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 bezwzględnego rabatu w ramach oferty z rabatem

Ten przykład pokazuje, jak uzyskać pierwotną pełną cenę oferty ze zniżką oraz jej bezwzględny rabat w mikrosach. Pamiętaj, że informacje o rabatach bezwzględnych w mikrosach są zwracane tylko w przypadku ofert rabatowych. W przypadku oferty rabatowej musisz podać rabat kwotowy lub 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 okna czasowego oferty

Aby uzyskać prawidłowe okno czasowe oferty, możesz użyć metody OneTimePurchaseOfferDetails.getValidTimeWindow(). Ten obiekt zawiera czas rozpoczęcia i zakończenia okna czasowego w milisekundach.

Poniższy przykład pokazuje, jak uzyskać prawidłowe okno czasowe 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ć maksymalną wielkość zamówienia na poziomie oferty rabatowej, która jest stosowana tylko na poziomie oferty. Oto przykład:

  1. Super screensavers ma 2 oferty dotyczące produktu screensaver: opcję zakupu screensavera i rabat na screensaver.
    1. Wygaszacz ekranu z opcją zakupu nie ma ustawionej ograniczonej ilości.
    2. Wyświetlacz rabatowy ma maksymalną dozwoloną ilość na poziomie oferty ustawioną na 3.
  2. Produkt wygaszacz ekranu nie ma maksymalnej dopuszczalnej ilości na poziomie produktu, więc użytkownicy mogą kupować nieograniczoną liczbę egzemplarzy tego produktu.
  3. Użytkownik ma 1 wygaszacz ekranu z rabatem i planuje kupić kolejny.
  4. Podczas pobierania dostępnych ofert wartość informacji o ograniczonej liczbie dla opcji zakupu wygaszacza ekranu jest pusta, a wartość pozostałej liczby dla rabatowanego wygaszacza ekranu wynosi 2.

Ten przykład pokazuje, jak uzyskać ograniczoną ilość na poziomie oferty zniżkowej:

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ę sztuk w ramach oferty, oferta nie jest zwracana za pomocą metody getOneTimePurchaseOfferDetailsList().

Obliczanie limitu wykorzystania

Poniższy przykład pokazuje, jak uzyskać informacje o ograniczonej ilości w przypadku określonej oferty zniżkowej. Możesz uzyskać maksymalną dozwoloną ilość i ilość pozostawioną dla bieżącego użytkownika. Pamiętaj, że funkcja ograniczonej ilości dotyczy zarówno ofert produktów jednorazowych konsumpcyjnych, jak i niekonsumpcyjnych. Ta funkcja jest obsługiwana tylko na poziomie oferty.

Google Play oblicza pozostałą liczbę, odejmując liczbę należącą do użytkownika od maksymalnej liczby ustawionej przez Ciebie. Przy zliczaniu liczby posiadanych przez użytkownika produktów Google Play uwzględnia zakupione lub oczekujące zakupy. Zakupy, które zostały anulowane, zwrócone lub obciążone zwrotem środków, nie są wliczane do ilości należącej do użytkownika. Na przykład:

  1. Superwygaszacze mają ustawioną ofertę zniżkową z maksymalnie dozwoloną liczbą 1, dzięki czemu użytkownicy mogą kupić maksymalnie 1 wygaszacz w promocyjnej cenie.

  2. Użytkownik kupuje jeden z wygaszaczy ze zniżką. Jeśli użytkownik spróbuje kupić drugą wersję wygaszacza ekranu ze zniżką, pojawi się błąd, a PurchasesUpdatedListener otrzyma kod odpowiedzi ITEM_UNAVAILABLE.

  3. Użytkownik prosi o zwrot środków za pierwotnie zakupiony ze zniżką wygaszacz ekranu i otrzymuje zwrot środków. Użytkownik próbuje kupić wygaszacz ekranu w obniżonej cenie i uda mu się to.

Kwalifikujące się kraje i regiony

Możesz wybrać kraje lub regiony, w których opcja zakupu lub oferta zniżkowa będą dostępne dla użytkowników. Google Play ocenia, czy użytkownik kwalifikuje się do korzystania z usługi na podstawie kraju, w którym jest ona dostępna. Gdy skonfigurujesz dostępność regionalną oferty, będzie ona zwracana tylko w ramach getOneTimePurchaseOfferDetailsList(), jeśli użytkownik znajduje się w docelowym kraju lub regionie. W przeciwnym razie nie będzie ona częścią listy ofert zwracanych przez wywołanie queryProductDetailsAsync().

Tagi oferty

Ten przykładowy kod pokazuje, jak pobrać tagi oferty 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 oferty możesz ustawić dla produktu, opcji zakupu lub oferty rabatowej. Oferty rabatowe dziedziczą tagi oferty z opcji zakupu. Podobnie, jeśli tagi ofert są określone na poziomie produktu, zarówno opcja zakupu, jak i oferty rabatowe dziedziczą tagi oferty produktu.

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

  • Super wygaszacz ekranu ma tag oferty produktu SSProductTag.
  • Ekran w ramach opcji zakupu ma tag oferty SSPurchaseOptionTag.
  • Wygaszacz ekranu z rabatem ma tag oferty SSDiscountOfferTag.

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