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ề cách 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 giải thích thêm về cách tích hợp nhiều lựa chọn mua hàng và ưu đãi 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 hàng và ưu đãi cho các sản phẩm tính phí một lần. Ví dụ: bạn có thể định cấu hình một lựa chọn mua hàng 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 sản phẩm tính phí 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() lấy 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 hàng cho sản phẩm tính phí 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ê cho mỗi sản phẩm tính phí một lần. Để nhận 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 ưu đãi đượ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 đối tượng BillingFlowParams, hãy sử 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 hàng 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 hiển thị ưu đãi cho người dùng, 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ể lấy từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

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

Lựa chọn mua giú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 có sản phẩm. Một sản phẩm có thể có nhiều lựa chọn mua hàng, thể hiện 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 giá mà bạn có thể tạo cho các sản phẩm tính phí 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ỉ hỗ trợ 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 một giao dịch mua tiêu chuẩn, trả thẳng cho sản phẩm tính phí một lần. Lớp này có một trường legacyCompatible không bắt buộc, cho biết liệu tuỳ chọn mua này có xuất hiện trong các luồng Thư viện Play Billing cũ (phiên bản 7 trở xuống) không hỗ trợ mô hình mới hay không. Để tương thích ngược, ít nhất một lựa chọn mua hàng phải được đánh dấu 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 với PBL, hãy xem phần Tích hợp lựa chọn mua thuê với 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 thuê và thời điểm 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 Play Billing (PBL). Bài viết này giả định rằng bạn đã quen thuộc với 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 chạy 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 nhà cho thuê.

Để định cấu hình các sản phẩm có thể thuê, bạn cần sử dụng dịch vụ monetization.onetimeproducts mới của API Nhà phát triển Play hoặc giao diện người dùng của Play Console. Để sử dụng dịch vụ này, bạn có thể gọi trực tiếp API REST hoặc sử 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 cho một ưu đãi thuê, 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 phương thức ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails().

    Mẫu sau đây cho biết cách lấy siêu dữ liệu về giao dịch 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 đối tượng BillingFlowParams, hãy sử 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 tuỳ 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 hiển thị ưu đãi cho người dùng, 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ể lấy từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

Ưu đãi đặ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 tính phí 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 hàng đặt trước với Thư viện Play Billing (PBL).

Tích hợp ưu đãi đặ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 Play Billing (PBL). Bài viết này giả định rằng bạn đã quen thuộc với 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 chạy 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. Truy xuất siêu dữ liệu về mặt hàng đặt trước bằng phương thức ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(). Mẫu sau đây cho biết cách lấy siêu dữ liệu về ư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 đối tượng BillingFlowParams, hãy sử 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 ư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 hiển thị ưu đãi cho người dùng, 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ể lấy từ phương thức oneTimePurchaseOfferDetails.getOfferToken().

Ưu đãi giảm giá

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

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

  • Giá ưu đãi chiết khấu: Chỉ định thông tin chi tiết về tỷ lệ phần trăm giảm giá hoặc giá tuyệt đối giảm so với giá gốc.

  • Quốc gia hoặc Khu vực đủ điều kiện: Chỉ định tình trạng cung cấp 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 hàng (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 áp dụng ưu đãi. Ngoài khoảng thời gian này, bạn sẽ 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 ưu đãi giảm giá, 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 mức chiết khấu theo phần trăm của ưu đãi giảm giá

Mẫu sau đây cho biết cách lấy giá đầy đủ ban đầu của mặt hàng giảm giá và mức chiết khấu theo phần trăm. 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 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 mức chiết khấu tuyệt đối của mặt hàng giảm giá

Ví dụ sau đây cho biết cách lấy giá đầy đủ ban đầu của ưu đãi chiết khấu và mức chiết khấu tuyệt đối của ưu đãi đó theo micro. Xin lưu ý rằng mức chiết khấu tuyệt đối trong thông tin vi mô chỉ được trả về cho các mặt hàng giảm giá. Bạn phải chỉ định mức chiết khấu tuyệt đối hoặc chiết khấu theo tỷ lệ phần trăm cho ư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();
            }
            // …
          }
        }
      }
    });
    

Nhận khoảng thời gian hợp lệ của một ưu đãi

Bạn có thể sử dụng phương thức OneTimePurchaseOfferDetails.getValidTimeWindow() để lấy khoảng 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 khoảng thời gian hợp lệ của 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()) {
            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. Giới hạn này chỉ áp dụng ở cấp ưu đãi. Sau đây là 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 có chiết khấu.
    1. Trình bảo vệ màn hình có lựa chọn mua hàng không được thiết lập giới hạn về số lượng.
    2. Trình bảo vệ màn hình giảm giá có số lượng tối đa được phép ở cấp ưu đãi đượ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 có ưu đãi 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 sẽ có giá trị 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ượng ưu đãi tối đa cho một ưu đãi, phương thức getOneTimePurchaseOfferDetailsList() sẽ không trả về ưu đãi đó.

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ể lấy 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ả mặt hàng tiêu hao và mặt hàng không tiêu hao trong các sản phẩm tính phí 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 khỏi số lượng tối đa được phép mà bạn đã thiết lập. Khi tính số lượng bản quyền mà người dùng sở hữu, Google Play sẽ xem xét các giao dịch mua đã tiêu thụ hoặc các giao dịch mua đang chờ xử lý. Các giao dịch mua đã bị huỷ, hoàn tiền hoặc hoàn lại tiền sẽ 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 một ư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 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 giảm giá. Sau đó, nếu người dùng cố gắng mua trình bảo vệ màn hình thứ hai được giảm giá, thì trình bảo vệ màn hình đó sẽ gặp 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 đã giảm giá ban đầu và nhận được tiền hoàn lại thành công. Người dùng sẽ cố gắng mua một trong các trình bảo vệ màn hình được giảm giá và giao dịch mua sẽ thành công.

Quốc gia và khu vực đủ điều kiện

Bạn có thể chọn những quốc gia hoặc khu vực mà người dùng có thể sử dụng ưu đãi mua hàng hoặc ưu đãi chiết khấu. Google Play sẽ đánh giá xem người dùng có đủ điều kiện hay không dựa trên quốc gia của họ 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 mặt hàng, mặt hàng đó 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, mặt hàng đó sẽ không có trong danh sách mặt hàng được trả về khi bạn gọi queryProductDetailsAsync().

Thẻ mặt hàng

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ẻ mặt hàng

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

Ví dụ: Super screensavers có hai ư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 có 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 cho 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.