Nhiều lựa chọn mua hàng và ưu đãi cho sản phẩm tính phí một lần

Tài liệu này trình bày chi tiết về việc tích hợp sản phẩm tính phí một lần (OTP) với Thư viện Play Billing. Tài liệu này cũng giải thích cách tích hợp nhiều ưu đãi và lựa chọn mua liên quan đến sản phẩm tính phí một lần.

Bạn có thể định cấu hình nhiều lựa chọn mua và ưu đãi cho các sản phẩm mua một lần. Ví dụ: bạn có thể định cấu hình một lựa chọn mua và một ưu đãi đặt hàng trước cho cùng một sản phẩm mua một lần.

Điều kiện tiên quyết

Để định cấu hình nhiều ưu đãi cho các sản phẩm mua một lần, bạn phải sử dụng API queryProductDetailsAsync(). Không hỗ trợ API querySkuDetailsAsync() không dùng nữa. Để biết thông tin về cách sử dụng queryProductDetailsAsync() và phiên bản launchBillingFlow() nhận ProductDetailsParams làm dữ liệu đầu vào, hãy xem các bước di chuyển.

Truy vấn thông tin chi tiết về sản phẩm

Nếu bạn đã định cấu hình nhiều ưu đãi hoặc lựa chọn mua cho sản phẩm mua một lần, thì đối tượng ProductDetails do phương thức queryProductDetailsAsync() trả về có thể có nhiều lựa chọn mua và (hoặc) thuê có sẵn cho mỗi sản phẩm mua một lần. Để lấy danh sách tất cả các ưu đãi đủ điều kiện cho từng đối tượng ProductDetails, hãy sử dụng phương thức getOneTimePurchaseOfferDetailsList(). Chỉ những ưu đãi và lựa chọn mua mà người dùng đủ điều kiện mới được trả về trong danh sách này. Mã của bạn trong phương thức onProductDetailsResponse() sẽ xử lý các đề nghị được trả về.

Bắt đầu quy trình thanh toán

Để bắt đầu một yêu cầu mua hàng từ ứng dụng của bạn, hãy gọi phương thức launchBillingFlow() từ luồng chính của ứng dụng. Phương thức này tham chiếu đến một đối tượng BillingFlowParams chứa đối tượng ProductDetails liên quan đã nhận được từ việc gọi queryProductDetailsAsync(). Để tạo một đối tượng BillingFlowParams, hãy dùng lớp BillingFlowParams.Builder. Xin lưu ý rằng bạn phải đặt mã thông báo ưu đãi tương ứng với ưu đãi mà người dùng đã chọn khi tạo đối tượng BillingFlowParams.

Mẫu sau đây cho thấy cách bắt đầu quy trình mua cho một sản phẩm tính phí một lần có nhiều ưu đãi:

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

Bạn có thể tìm thấy offerToken trong OneTimePurchaseOfferDetails. Khi cho người dùng thấy ưu đãi, hãy nhớ định cấu hình các thông số của quy trình thanh toán bằng mã thông báo ưu đãi chính xác mà bạn có thể nhận được từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

Các lựa chọn mua hàng và ưu đãi

Lựa chọn mua cho phép bạn xác định cách cấp quyền cho người dùng, giá của quyền và khu vực mà sản phẩm có sẵn. Một sản phẩm có thể có nhiều lựa chọn mua, cho biết nơi và cách bạn bán sản phẩm.

Google Play hỗ trợ các lựa chọn mua sau đây cho sản phẩm tính phí một lần:

  • Lựa chọn mua
  • Lựa chọn mua để thuê

Ưu đãi là một chương trình định giá mà bạn có thể tạo cho các sản phẩm bán một lần. Ví dụ: bạn có thể tạo ưu đãi chiết khấu cho sản phẩm tính phí một lần.

Google Play hỗ trợ các ưu đãi mua sau đây cho sản phẩm tính phí một lần:

  • Ưu đãi đặt hàng trước (chỉ được hỗ trợ cho lựa chọn mua)
  • Ưu đãi giảm giá (được hỗ trợ cho cả lựa chọn mua và thuê)

Lựa chọn mua

Lựa chọn mua hàng đại diện cho giao dịch mua sản phẩm tính phí một lần theo cách tiêu chuẩn và hoàn toàn. Trường này có một trường legacyCompatible không bắt buộc, cho biết liệu lựa chọn mua này có được cung cấp trong các quy trình cũ của Thư viện Play Billing (phiên bản 7 trở xuống) không hỗ trợ mô hình mới hay không. Để đảm bảo khả năng tương thích ngược, bạn phải đánh dấu ít nhất một lựa chọn mua là tương thích với phiên bản cũ.

Các bước tích hợp cả lựa chọn mua và thuê với PBL đều giống nhau. Để tìm hiểu cách tích hợp lựa chọn mua bằng PBL, hãy xem phần Tích hợp lựa chọn thuê bằng PBL.

Lựa chọn mua để thuê

Lựa chọn mua để thuê cho phép người dùng truy cập vào các sản phẩm tính phí một lần trong một khoảng thời gian cụ thể. Bạn có thể chỉ định thời hạn cho thuê và thời hạn hết hạn. Tài liệu này mô tả các bước để tích hợp lựa chọn mua để thuê với Thư viện Play Billing (PBL).

Tích hợp lựa chọn mua để thuê với PBL

Phần này mô tả cách tích hợp lựa chọn mua để thuê với Thư viện Google Play Billing (PBL). Hướng dẫn này giả định rằng bạn đã nắm rõ các bước tích hợp PBL ban đầu, chẳng hạn như thêm phần phụ thuộc PBL vào ứng dụng, khởi động BillingClientkết nối với Google Play. Phần này tập trung vào các khía cạnh tích hợp PBL dành riêng cho lựa chọn mua để thuê.

Để định cấu hình các sản phẩm có thể cho thuê, bạn cần sử dụng dịch vụ monetization.onetimeproducts mới của Play Developer API hoặc giao diện người dùng của Play Developer Console. Để sử dụng dịch vụ này, bạn có thể gọi trực tiếp API REST hoặc dùng thư viện ứng dụng Java.

Bắt đầu quy trình mua cho lựa chọn thuê

Để bắt đầu quy trình mua hàng cho ưu đãi thuê phim, hãy làm theo các bước sau:

  1. Tìm nạp siêu dữ liệu về lựa chọn mua để thuê bằng cách sử dụng phương thức ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Mẫu sau đây cho biết cách lấy siêu dữ liệu của giao dịch mua thuê:

    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. Bắt đầu quy trình thanh toán.

    Để bắt đầu một yêu cầu mua hàng từ ứng dụng của bạn, hãy gọi phương thức launchBillingFlow() từ luồng chính của ứng dụng. Phương thức này tham chiếu đến một đối tượng BillingFlowParams chứa đối tượng ProductDetails liên quan đã nhận được từ việc gọi queryProductDetailsAsync(). Để tạo một đối tượng BillingFlowParams, hãy dùng lớp BillingFlowParams.Builder. Xin lưu ý rằng bạn phải đặt mã thông báo ưu đãi tương ứng với ưu đãi mà người dùng đã chọn khi tạo đối tượng BillingFlowParams. Nếu đủ điều kiện sử dụng lựa chọn mua để thuê, người dùng sẽ nhận được một ưu đãi có RentalDetails và offerId trong queryProductDetailsAsync().

    Mẫu sau đây cho biết cách khởi chạy quy trình thanh toán:

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

    Bạn có thể tìm thấy offerToken trong OneTimePurchaseOfferDetails. Khi bạn cho người dùng thấy ưu đãi, hãy nhớ định cấu hình các thông số của quy trình thanh toán bằng mã thông báo ưu đãi chính xác mà bạn có thể nhận được từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

Ưu đãi cho đơn đặt hàng trước

Tính năng đặt hàng trước cho phép bạn thiết lập các sản phẩm mua một lần để người dùng mua trước khi mặt hàng được phát hành. Khi đặt hàng trước sản phẩm của bạn, người dùng đồng ý thanh toán cho mặt hàng khi sản phẩm được phát hành, trừ phi người dùng huỷ đơn đặt hàng trước trước ngày phát hành. Vào ngày phát hành, người mua sẽ bị tính phí và Play sẽ thông báo cho họ qua email rằng mặt hàng đã được phát hành.

Tài liệu này mô tả các bước để tích hợp ưu đãi mua trước với Thư viện Google Play Billing (PBL).

Tích hợp ưu đãi cho đơn đặt hàng trước với PBL

Phần này mô tả cách tích hợp ưu đãi đặt hàng trước với Thư viện Google Play Billing (PBL). Hướng dẫn này giả định rằng bạn đã nắm rõ các bước tích hợp PBL ban đầu, chẳng hạn như thêm phần phụ thuộc PBL vào ứng dụng, khởi động BillingClientkết nối với Google Play. Phần này tập trung vào các khía cạnh tích hợp PBL dành riêng cho ưu đãi đặt hàng trước.

Bắt đầu quy trình mua cho ưu đãi đặt hàng trước

Để bắt đầu quy trình mua hàng cho ưu đãi đặt hàng trước, hãy làm theo các bước sau:

  1. Tìm nạp siêu dữ liệu về ưu đãi đặt hàng trước bằng cách sử dụng phương thức ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). Mẫu sau đây cho biết cách lấy siêu dữ liệu của ưu đãi đặt hàng trước:

    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. Bắt đầu quy trình thanh toán.

    Để bắt đầu một yêu cầu mua hàng từ ứng dụng của bạn, hãy gọi phương thức launchBillingFlow() từ luồng chính của ứng dụng. Phương thức này tham chiếu đến một đối tượng BillingFlowParams chứa đối tượng ProductDetails liên quan đã nhận được từ việc gọi queryProductDetailsAsync(). Để tạo một đối tượng BillingFlowParams, hãy dùng BillingFlowParams.Builder class. Xin lưu ý rằng bạn phải đặt mã thông báo ưu đãi tương ứng với ưu đãi mà người dùng đã chọn khi tạo đối tượng BillingFlowParams. Nếu đủ điều kiện nhận ưu đãi đặt hàng trước, người dùng sẽ nhận được một ưu đãi có PreorderDetails và offerId trong phương thức queryProductDetailsAsync().

    Mẫu sau đây cho biết cách khởi chạy quy trình thanh toán:

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

    Bạn có thể tìm thấy offerToken trong OneTimePurchaseOfferDetails. Khi bạn cho người dùng thấy ưu đãi, hãy nhớ định cấu hình các thông số của quy trình thanh toán bằng mã thông báo ưu đãi chính xác mà bạn có thể nhận được từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

Ưu đãi chiết khấu

Phần này mô tả cách bạn có thể định cấu hình ưu đãi chiết khấu cho các sản phẩm dùng một lần.

Bạn có thể định cấu hình 4 tham số trong ưu đãi chiết khấu sản phẩm một lần:

  • Giá ưu đãi chiết khấu: Nêu rõ thông tin chi tiết về mức chiết khấu theo tỷ lệ phần trăm hoặc giá chiết khấu tuyệt đối so với giá gốc.

  • Quốc gia hoặc khu vực đủ điều kiện: Nêu rõ tình trạng còn hàng của sản phẩm tính phí một lần ở một quốc gia hoặc khu vực.

  • Giới hạn mua (không bắt buộc): Cho phép bạn xác định số lần người dùng có thể sử dụng cùng một ưu đãi. Nếu vượt quá hạn mức mua, người dùng sẽ không đủ điều kiện nhận ưu đãi.

  • Thời gian có hạn (không bắt buộc): Chỉ định khoảng thời gian mà ưu đãi có hiệu lực. Ngoài khoảng thời gian này, bạn không đủ điều kiện mua ưu đãi.

Truy xuất thông tin về giá ưu đãi chiết khấu

Đối với một ưu đãi chiết khấu, bạn có thể truy xuất tỷ lệ phần trăm chiết khấu hoặc mức chiết khấu tuyệt đối được cung cấp.

Ví dụ 1: Truy xuất tỷ lệ phần trăm chiết khấu của ưu đãi chiết khấu

Mẫu sau đây cho thấy cách lấy giá gốc đầy đủ của ưu đãi chiết khấu và tỷ lệ chiết khấu của ưu đãi đó. Xin lưu ý rằng thông tin chiết khấu theo tỷ lệ phần trăm chỉ được trả về cho các mặt hàng được chiết khấu.

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();
            }
            // …
          }
        }
      }
    });
    
Ví dụ 2: Truy xuất chiết khấu tuyệt đối của mặt hàng được chiết khấu

Ví dụ sau đây cho thấy cách lấy giá đầy đủ ban đầu của sản phẩm được chiết khấu và mức chiết khấu tuyệt đối của sản phẩm đó tính bằng micros. Xin lưu ý rằng thông tin chiết khấu tuyệt đối tính bằng micros chỉ được trả về cho các sản phẩm được chiết khấu. Bạn phải chỉ định chiết khấu tuyệt đối hoặc chiết khấu theo tỷ lệ phần trăm cho một ưu đãi chiết khấu.

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

Lấy khoảng thời gian hợp lệ của một ưu đãi

Bạn có thể dùng phương thức OneTimePurchaseOfferDetails.getValidTimeWindow() để lấy khung thời gian hợp lệ cho một ưu đãi. Đối tượng này chứa thời gian bắt đầu và thời gian kết thúc của khoảng thời gian tính bằng mili giây.

Mẫu sau đây cho biết cách lấy khung thời gian hợp lệ của một mặt hàng:

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

Số lượng có hạn ở cấp ưu đãi chiết khấu

Bạn có thể chỉ định giới hạn số lượng tối đa ở cấp ưu đãi chiết khấu, tức là chỉ áp dụng ở cấp ưu đãi. Sau đây là một ví dụ minh hoạ:

  1. Super Screensavers có 2 ưu đãi cho sản phẩm trình bảo vệ màn hình: trình bảo vệ màn hình có lựa chọn mua và trình bảo vệ màn hình chiết khấu.
    1. Trình bảo vệ màn hình lựa chọn mua không có chế độ thiết lập số lượng có hạn.
    2. Trình bảo vệ màn hình chiết khấu có số lượng tối đa được phép ở cấp mặt hàng được đặt thành 3.
  2. Sản phẩm trình bảo vệ màn hình không có số lượng tối đa được phép ở cấp sản phẩm, vì vậy người dùng có thể mua số lượng không giới hạn của sản phẩm này.
  3. Người dùng sở hữu 1 trình bảo vệ màn hình giảm giá và họ dự định mua một trình bảo vệ màn hình khác bằng trình bảo vệ màn hình giảm giá.
  4. Khi truy xuất các ưu đãi hiện có, LimitedQuantityInfo cho trình bảo vệ màn hình lựa chọn mua là rỗng và giá trị số lượng còn lại cho trình bảo vệ màn hình chiết khấu là 2.

Mẫu sau đây cho biết cách lấy số lượng có hạn ở cấp ưu đãi chiết khấu:

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

Khi người dùng sử dụng hết số lần sử dụng tối đa cho một ưu đãi, ưu đãi đó sẽ không được phương thức getOneTimePurchaseOfferDetailsList() trả về.

Tính hạn mức sử dụng

Ví dụ sau đây cho thấy cách lấy thông tin về số lượng có hạn của một ưu đãi chiết khấu nhất định. Bạn có thể nhận được số lượng tối đa được phép và số lượng còn lại cho người dùng hiện tại. Xin lưu ý rằng tính năng số lượng có hạn áp dụng cho cả sản phẩm tiêu hao và sản phẩm không tiêu hao được cung cấp một lần. Tính năng này chỉ được hỗ trợ ở cấp mặt hàng.

Google Play tính số lượng còn lại bằng cách trừ số lượng mà người dùng sở hữu cho số lượng tối đa được phép mà bạn đã thiết lập. Khi tính số lượng mà người dùng sở hữu, Google Play sẽ xem xét các giao dịch mua đã sử dụng hoặc giao dịch mua đang chờ xử lý. Những giao dịch mua đã bị huỷ, hoàn tiền hoặc hoàn tiền không được tính vào số lượng mà người dùng sở hữu. Ví dụ:

  1. Super screensavers thiết lập ưu đãi chiết khấu với số lượng tối đa được phép là một, vì vậy người dùng có thể mua tối đa một trình bảo vệ màn hình được chiết khấu.

  2. Người dùng mua một trong các trình bảo vệ màn hình được chiết khấu. Nếu sau đó người dùng cố gắng mua trình bảo vệ màn hình được chiết khấu thứ hai, thì sẽ xảy ra lỗi và PurchasesUpdatedListener sẽ nhận được mã phản hồi ITEM_UNAVAILABLE.

  3. Người dùng yêu cầu hoàn tiền cho trình bảo vệ màn hình được chiết khấu mà họ đã mua ban đầu và nhận được tiền hoàn lại. Người dùng cố gắng mua một trong các trình bảo vệ màn hình được chiết khấu và giao dịch mua sẽ thành công.

Điều kiện về quốc gia và khu vực

Bạn có thể chọn những quốc gia hoặc khu vực nơi người dùng có thể mua hoặc nhận ưu đãi giảm giá. Google Play sẽ đánh giá điều kiện của người dùng dựa trên quốc gia trên Play. Khi bạn định cấu hình tình trạng còn hàng theo khu vực cho một sản phẩm, sản phẩm đó sẽ chỉ được trả về trong getOneTimePurchaseOfferDetailsList() nếu người dùng ở một quốc gia hoặc khu vực được nhắm đến, nếu không thì sản phẩm đó sẽ không nằm trong danh sách sản phẩm được trả về khi bạn gọi queryProductDetailsAsync().

Thẻ ưu đãi

Mẫu sau đây cho biết cách truy xuất các thẻ ưu đãi được liên kết với một ưu đãi.

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

Kế thừa thẻ ưu đãi

Bạn có thể đặt thẻ ưu đãi cho sản phẩm, lựa chọn mua hoặc ưu đãi chiết khấu. Ưu đãi chiết khấu sẽ kế thừa thẻ ưu đãi từ ưu đãi của lựa chọn mua. Tương tự, nếu bạn chỉ định thẻ ưu đãi ở cấp sản phẩm, thì cả ưu đãi về lựa chọn mua và ưu đãi chiết khấu đều kế thừa thẻ ưu đãi của sản phẩm.

Ví dụ: Super screensavers có 2 ưu đãi cho sản phẩm trình bảo vệ màn hình: trình bảo vệ màn hình có thể mua và trình bảo vệ màn hình chiết khấu.

  • Trình bảo vệ màn hình Super có thẻ ưu đãi sản phẩm SSProductTag.
  • Trình bảo vệ màn hình lựa chọn mua có thẻ ưu đãi SSPurchaseOptionTag.
  • Trình bảo vệ màn hình chiết khấu có thẻ ưu đãi SSDiscountOfferTag.

Trong ví dụ này, phương thức oneTimePurchaseOfferDetails.getOfferTagsList() cho ưu đãi lựa chọn mua trả về SSProductTagSSPurchaseOptionTag. Đối với ưu đãi chiết khấu, phương thức này trả về SSProductTag, SSPurchaseOptionTagSSDiscountOfferTag.