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 "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 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 BillingClient và kế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:
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(); } } } } } });
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ượngBillingFlowParams
chứa đối tượngProductDetails
liên quan đã nhận được từ việc gọiqueryProductDetailsAsync()
. Để tạo một đối tượngBillingFlowParams
, hãy dùng lớpBillingFlowParams.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ượngBillingFlowParams
. 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 trongqueryProductDetailsAsync()
.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
trongOneTimePurchaseOfferDetails
. 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ứconeTimePurchaseOfferDetails.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 BillingClient và kế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:
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(); } } } } } });
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ượngBillingFlowParams
chứa đối tượngProductDetails
liên quan đã nhận được từ việc gọi queryProductDetailsAsync(). Để tạo một đối tượngBillingFlowParams
, hãy dùngBillingFlowParams.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ượngBillingFlowParams
. 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ứcqueryProductDetailsAsync()
.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
trongOneTimePurchaseOfferDetails
. 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ứconeTimePurchaseOfferDetails.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ạ:
- 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.
- 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.
- 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.
- 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.
- 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á.
- 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ụ:
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.
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.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ề SSProductTag
và SSPurchaseOptionTag
. Đối với ưu đãi chiết khấu, phương thức này trả về SSProductTag
, SSPurchaseOptionTag
và SSDiscountOfferTag
.