เอกสารนี้จะอธิบายรายละเอียดการผสานรวมไอเทมแบบเรียกเก็บเงินครั้งเดียว (OTP) กับ Google Play Billing Library นอกจากนี้ ยังอธิบายวิธีผสานรวมตัวเลือกการซื้อและข้อเสนอต่างๆ ที่เกี่ยวข้องกับไอเทมแบบเรียกเก็บเงินครั้งเดียว
คุณกำหนดค่าตัวเลือกการซื้อและข้อเสนอหลายรายการสำหรับผลิตภัณฑ์แบบซื้อครั้งเดียวได้ เช่น คุณสามารถกำหนดค่าตัวเลือกการซื้อและข้อเสนอการสั่งซื้อล่วงหน้า สำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียวเดียวกันได้
สิ่งที่ต้องมีก่อน
หากต้องการกำหนดค่าข้อเสนอหลายรายการสำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียว คุณต้องใช้ API ของ queryProductDetailsAsync()
ไม่รองรับ querySkuDetailsAsync()
API ที่เลิกใช้งานแล้ว ดูข้อมูลเกี่ยวกับวิธีใช้
queryProductDetailsAsync()
และเวอร์ชันของ launchBillingFlow()
ที่ใช้ ProductDetailsParams
เป็นอินพุตได้ที่ขั้นตอนการย้ายข้อมูล
ค้นหารายละเอียดผลิตภัณฑ์
หากคุณกำหนดค่าข้อเสนอหรือตัวเลือกการซื้อหลายรายการสำหรับผลิตภัณฑ์แบบซื้อครั้งเดียว
ออบเจ็กต์ ProductDetails
ที่เมธอด queryProductDetailsAsync()
แสดงผลอาจมีตัวเลือกการซื้อ
และ (หรือ) การเช่าที่พร้อมใช้งานมากกว่า 1 รายการต่อผลิตภัณฑ์แบบซื้อครั้งเดียว หากต้องการดูรายการข้อเสนอที่มีสิทธิ์ทั้งหมดสำหรับออบเจ็กต์ ProductDetails
แต่ละรายการ ให้ใช้เมธอด getOneTimePurchaseOfferDetailsList()
ระบบจะแสดงเฉพาะข้อเสนอและตัวเลือกการซื้อ
ที่ผู้ใช้มีสิทธิ์เป็นส่วนหนึ่งของรายการนี้ โค้ดของคุณในเมธอด onProductDetailsResponse()
ควรจัดการข้อเสนอที่ส่งคืน
เปิดตัวขั้นตอนการเรียกเก็บเงิน
หากต้องการเริ่มคำขอซื้อจากแอป ให้เรียกใช้เมธอด launchBillingFlow()
จากเทรดหลักของแอป เมธอดนี้รับการอ้างอิงไปยังออบเจ็กต์
BillingFlowParams
ที่มีออบเจ็กต์ ProductDetails
ที่เกี่ยวข้องซึ่งได้จากการเรียกใช้ queryProductDetailsAsync()
หากต้องการสร้างออบเจ็กต์
BillingFlowParams
ให้ใช้คลาส BillingFlowParams.Builder
โปรดทราบว่าคุณต้องตั้งค่าโทเค็นข้อเสนอที่สอดคล้องกับข้อเสนอ
ที่ผู้ใช้เลือกเมื่อสร้างออบเจ็กต์ BillingFlowParams
ตัวอย่างต่อไปนี้แสดงวิธีเปิดตัวขั้นตอนการซื้อผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวที่มีข้อเสนอหลายรายการ
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
offerToken
จะเป็นส่วนหนึ่งของ OneTimePurchaseOfferDetails
เมื่อแสดงข้อเสนอต่อผู้ใช้ โปรดตรวจสอบว่าได้กำหนดค่าพารามิเตอร์ขั้นตอนการเรียกเก็บเงินด้วยโทเค็นข้อเสนอที่ถูกต้อง ซึ่งคุณจะได้รับจากเมธอด oneTimePurchaseOfferDetails.getOfferToken()
ตัวเลือกและข้อเสนอการซื้อ
ตัวเลือกการซื้อช่วยให้คุณกำหนดวิธีให้สิทธิ์แก่ผู้ใช้ ราคา และภูมิภาคที่ผลิตภัณฑ์พร้อมให้บริการ ผลิตภัณฑ์เดียวอาจมี ตัวเลือกการซื้อหลายรายการ ซึ่งอาจแสดงถึงสถานที่และวิธีที่คุณขาย ผลิตภัณฑ์
Google Play รองรับตัวเลือกการซื้อต่อไปนี้สำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียว
- ซื้อตัวเลือกการซื้อ
- ตัวเลือกการซื้อแบบเช่า
ข้อเสนอหมายถึงรูปแบบการกำหนดราคาที่คุณสร้างขึ้นสำหรับผลิตภัณฑ์แบบครั้งเดียว เช่น คุณสามารถสร้างข้อเสนอส่วนลดสำหรับผลิตภัณฑ์แบบครั้งเดียวได้
Google Play รองรับข้อเสนอการซื้อต่อไปนี้สำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียว
- ข้อเสนอการสั่งจองล่วงหน้า (รองรับเฉพาะตัวเลือกการซื้อแบบซื้อ)
- ข้อเสนอส่วนลด (รองรับทั้งตัวเลือกการซื้อและเช่า)
ซื้อตัวเลือกการซื้อ
ตัวเลือกการซื้อแบบซื้อแสดงถึงการซื้อผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวโดยตรงตามมาตรฐาน โดยมีฟิลด์ legacyCompatible ที่ไม่บังคับ ซึ่งระบุว่าตัวเลือกการซื้อนี้จะพร้อมใช้งานในโฟลว์ Play Billing Library เวอร์ชันเก่า (เวอร์ชัน 7 หรือเก่ากว่า) ที่ไม่รองรับโมเดลใหม่หรือไม่ หากต้องการให้เข้ากันได้แบบย้อนหลัง คุณควรทำเครื่องหมายตัวเลือกการซื้ออย่างน้อย 1 รายการว่าเข้ากันได้กับแผนเดิม
ขั้นตอนการผสานรวมทั้งตัวเลือกการซื้อและเช่ากับ PBL จะเหมือนกัน หากต้องการทราบวิธีผสานรวมตัวเลือกซื้อกับ PBL โปรดดูผสานรวมตัวเลือกเช่าซื้อกับ PBL
ตัวเลือกการซื้อแบบเช่า
ตัวเลือกการเช่า/ซื้อช่วยให้ผู้ใช้เข้าถึงผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวได้ตามระยะเวลาที่กำหนด คุณระบุระยะเวลาการเช่าและวันหมดอายุได้ เอกสารนี้อธิบายขั้นตอนการผสานรวมตัวเลือกการซื้อแบบเช่ากับ Play Billing Library (PBL)
ผสานรวมตัวเลือกการซื้อหรือเช่ากับ PBL
ส่วนนี้จะอธิบายวิธีผสานรวมตัวเลือกการซื้อแบบเช่ากับ Play Billing Library (PBL) โดยจะถือว่าคุณคุ้นเคยกับขั้นตอนการผสานรวม PBL เริ่มต้น เช่น การเพิ่มการอ้างอิง PBL ลงในแอป การเริ่มต้น BillingClient และการเชื่อมต่อกับ Google Play ส่วนนี้จะมุ่งเน้นที่แง่มุมของการผสานรวม PBL ที่เฉพาะเจาะจงสำหรับตัวเลือกการเช่า/ซื้อ
หากต้องการกำหนดค่าผลิตภัณฑ์ที่พร้อมให้เช่า คุณจะต้องใช้บริการใหม่ของ Play Developer API หรือ UI ของ Play Developer Consolemonetization.onetimeproducts
หากต้องการใช้บริการนี้ คุณสามารถเรียก REST API โดยตรงหรือ
ใช้ไลบรารีของไคลเอ็นต์ Java
เปิดตัวขั้นตอนการซื้อสำหรับตัวเลือกการเช่า
หากต้องการเปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการเช่า ให้ทำตามขั้นตอนต่อไปนี้
ดึงข้อมูลเมตาของตัวเลือกการซื้อแบบเช่าโดยใช้เมธอด
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
ตัวอย่างต่อไปนี้แสดงวิธีรับข้อมูลเมตาของการเช่า/ซื้อ
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(); } } } } } });
เปิดโฟลว์การเรียกเก็บเงิน
หากต้องการเริ่มคำขอซื้อจากแอป ให้เรียกใช้เมธอด
launchBillingFlow()
จากเทรดหลักของแอป เมธอดนี้ รับการอ้างอิงไปยังออบเจ็กต์BillingFlowParams
ที่มีออบเจ็กต์ProductDetails
ที่เกี่ยวข้องซึ่งได้จากการเรียกใช้queryProductDetailsAsync()
หากต้องการสร้างออบเจ็กต์BillingFlowParams
ให้ใช้คลาสBillingFlowParams.Builder
โปรดทราบว่าคุณต้องตั้งค่าโทเค็นข้อเสนอที่สอดคล้องกับข้อเสนอที่ผู้ใช้เลือกเมื่อสร้างออบเจ็กต์BillingFlowParams
หากผู้ใช้มีสิทธิ์ใช้ ตัวเลือกซื้อแบบเช่า ผู้ใช้จะได้รับข้อเสนอที่มี RentalDetails และ offerId ในqueryProductDetailsAsync()
ตัวอย่างต่อไปนี้แสดงวิธีเปิดตัวขั้นตอนการเรียกเก็บเงิน
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);
offerToken
จะเป็นส่วนหนึ่งของOneTimePurchaseOfferDetails
เมื่อแสดงข้อเสนอต่อผู้ใช้ โปรดตรวจสอบว่าได้กำหนดค่าพารามิเตอร์ขั้นตอนการเรียกเก็บเงินด้วยโทเค็นข้อเสนอที่ถูกต้อง ซึ่งคุณจะได้รับจากเมธอดoneTimePurchaseOfferDetails.getOfferToken()
ข้อเสนอการสั่งจองล่วงหน้า
การสั่งจองล่วงหน้าช่วยให้คุณตั้งค่าผลิตภัณฑ์แบบครั้งเดียวเพื่อซื้อก่อนที่ระบบจะ เปิดตัวไอเทม เมื่อผู้ใช้สั่งจองผลิตภัณฑ์ล่วงหน้า แสดงว่าผู้ใช้ตกลงที่จะชำระเงินสำหรับไอเทม เมื่อผลิตภัณฑ์วางจำหน่าย เว้นแต่ผู้ใช้จะยกเลิกการสั่งจองล่วงหน้าก่อน วันที่วางจำหน่าย ในวันที่วางจำหน่าย ระบบจะเรียกเก็บเงินจากผู้ซื้อและ Play จะแจ้งให้ผู้ซื้อทราบทางอีเมลว่ารายการพร้อมให้บริการแล้ว
เอกสารนี้อธิบายขั้นตอนการผสานรวมข้อเสนอการซื้อแบบสั่งจองล่วงหน้ากับ Play Billing Library (PBL)
ผสานรวมข้อเสนอการสั่งจองล่วงหน้ากับ PBL
ส่วนนี้อธิบายวิธีผสานรวมข้อเสนอสั่งจองล่วงหน้ากับ Play Billing Library (PBL) โดยจะถือว่าคุณคุ้นเคยกับขั้นตอนการผสานรวม PBL เริ่มต้น เช่น การเพิ่มการอ้างอิง PBL ลงในแอป การเริ่มต้น BillingClient และการเชื่อมต่อกับ Google Play ส่วนนี้มุ่งเน้นที่แง่มุมการผสานรวม PBL ที่เฉพาะเจาะจงสำหรับ ข้อเสนอการสั่งซื้อล่วงหน้า
เปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการสั่งจองล่วงหน้า
หากต้องการเปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการสั่งจองล่วงหน้า ให้ทำตามขั้นตอนต่อไปนี้
ดึงข้อมูลเมตาของข้อเสนอการสั่งจองล่วงหน้าโดยใช้เมธอด
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
ตัวอย่างต่อไปนี้แสดงวิธีรับข้อมูลเมตาของข้อเสนอการสั่งจองล่วงหน้า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(); } } } } } });
เปิดโฟลว์การเรียกเก็บเงิน
หากต้องการเริ่มคำขอซื้อจากแอป ให้เรียกใช้
launchBillingFlow()
เมธอดจากเทรดหลักของแอป เมธอดนี้รับการอ้างอิงไปยังออบเจ็กต์BillingFlowParams
ที่มีออบเจ็กต์ProductDetails
ที่เกี่ยวข้องซึ่งได้จากการเรียกใช้ queryProductDetailsAsync() หากต้องการสร้างออบเจ็กต์BillingFlowParams
ให้ใช้BillingFlowParams.Builder class
โปรดทราบว่าคุณต้องตั้งค่าโทเค็นข้อเสนอที่สอดคล้องกับข้อเสนอที่ผู้ใช้เลือกเมื่อสร้างออบเจ็กต์BillingFlowParams
หากผู้ใช้มีสิทธิ์รับข้อเสนอการสั่งจองล่วงหน้า ผู้ใช้จะได้รับข้อเสนอที่มี PreorderDetails และ offerId ในเมธอดqueryProductDetailsAsync()
ตัวอย่างต่อไปนี้แสดงวิธีเปิดตัวขั้นตอนการเรียกเก็บเงิน
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
offerToken
จะเป็นส่วนหนึ่งของOneTimePurchaseOfferDetails
เมื่อแสดงข้อเสนอต่อผู้ใช้ โปรดตรวจสอบว่าได้กำหนดค่าพารามิเตอร์ขั้นตอนการเรียกเก็บเงินด้วยโทเค็นข้อเสนอที่ถูกต้อง ซึ่งคุณจะได้รับจากเมธอดoneTimePurchaseOfferDetails.getOfferToken()
ข้อเสนอส่วนลด
ส่วนนี้อธิบายวิธีกำหนดค่าข้อเสนอส่วนลดสำหรับผลิตภัณฑ์แบบครั้งเดียว
คุณกำหนดค่าพารามิเตอร์ต่างๆ ได้ 4 รายการในข้อเสนอส่วนลดสำหรับไอเทมแบบเรียกเก็บเงินครั้งเดียว
ราคาข้อเสนอที่ลดแล้ว: ระบุรายละเอียดเกี่ยวกับส่วนลดเป็นเปอร์เซ็นต์หรือส่วนลดเป็นราคาที่แน่นอนจากราคาเดิม
การมีสิทธิ์ของประเทศหรือภูมิภาค: ระบุความพร้อมจำหน่ายสินค้าของข้อเสนอผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวในประเทศหรือภูมิภาค
ขีดจำกัดการซื้อ (ไม่บังคับ): ช่วยให้คุณกำหนดจำนวนครั้งที่ผู้ใช้สามารถ แลกรับข้อเสนอเดียวกันได้ หากผู้ใช้ซื้อเกินขีดจำกัด ผู้ใช้จะ ไม่มีสิทธิ์รับข้อเสนอ
ระยะเวลาจำกัด (ไม่บังคับ): ระบุระยะเวลาที่ข้อเสนอ พร้อมให้บริการ หากอยู่นอกระยะเวลาดังกล่าว ข้อเสนอจะไม่มีสิทธิ์ซื้อ
ดึงข้อมูลราคาข้อเสนอที่มีส่วนลด
สำหรับข้อเสนอที่มีส่วนลด คุณสามารถดึงข้อมูลเปอร์เซ็นต์ส่วนลดหรือ ส่วนลดแบบแน่นอนที่เสนอได้
ตัวอย่างที่ 1: ดึงส่วนลดเป็นเปอร์เซ็นต์ของข้อเสนอที่มีส่วนลด
ตัวอย่างต่อไปนี้แสดงวิธีรับราคาเต็มเดิมของข้อเสนอที่มีส่วนลด และส่วนลดเป็นเปอร์เซ็นต์ โปรดทราบว่าระบบจะแสดงข้อมูลส่วนลดเป็นเปอร์เซ็นต์ สำหรับข้อเสนอที่ลดราคาเท่านั้น
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(); } // … } } } });
ตัวอย่างที่ 2: ดึงส่วนลดสุทธิของข้อเสนอที่มีส่วนลด
ตัวอย่างต่อไปนี้แสดงวิธีรับราคาเต็มเดิมของข้อเสนอที่ลดราคาและส่วนลดสัมบูรณ์ในหน่วยไมโคร โปรดทราบว่าระบบจะแสดงส่วนลดแบบสัมบูรณ์ใน ข้อมูลไมโครเฉพาะสำหรับข้อเสนอที่มีส่วนลดเท่านั้น ต้องระบุส่วนลดแบบสัมบูรณ์ หรือส่วนลดเป็นเปอร์เซ็นต์สำหรับข้อเสนอส่วนลด
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(); } // … } } } });
รับกรอบเวลาที่ถูกต้องของข้อเสนอ
คุณสามารถใช้วิธี OneTimePurchaseOfferDetails.getValidTimeWindow()
เพื่อรับ
กรอบเวลาที่ถูกต้องสำหรับข้อเสนอ ออบเจ็กต์นี้มีเวลาเริ่มต้นและเวลาสิ้นสุดของกรอบเวลาเป็นมิลลิวินาที
ตัวอย่างต่อไปนี้แสดงวิธีรับกรอบเวลาที่ถูกต้องของข้อเสนอ
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(); // … } } } } });
จำนวนจำกัดที่ระดับข้อเสนอส่วนลด
คุณระบุขีดจำกัดจำนวนสูงสุดได้ที่ระดับข้อเสนอส่วนลด ซึ่งจะ ใช้ที่ระดับข้อเสนอเท่านั้น ตัวอย่างต่อไปนี้จะช่วยให้เข้าใจได้ดียิ่งขึ้น
- Super Screensavers มีข้อเสนอ 2 รายการสำหรับผลิตภัณฑ์โปรแกรมรักษาหน้าจอ ได้แก่ ตัวเลือกการซื้อ
โปรแกรมรักษาหน้าจอและโปรแกรมรักษาหน้าจอแบบมีส่วนลด
- โปรแกรมรักษาหน้าจอตัวเลือกการซื้อไม่ได้ตั้งค่าจำนวนจำกัดไว้
- สกรีนเซฟเวอร์ส่วนลดมีจำนวนสูงสุดที่อนุญาตในระดับข้อเสนอ ตั้งค่าเป็น 3
- ผลิตภัณฑ์สกรีนเซฟเวอร์ไม่มีจำนวนสูงสุดที่อนุญาตในระดับผลิตภัณฑ์ ดังนั้นผู้ใช้จึงซื้อผลิตภัณฑ์นี้ได้ไม่จำกัดจำนวน
- ผู้ใช้มีโปรแกรมรักษาหน้าจอแบบลดราคา 1 รายการ และวางแผนที่จะซื้ออีกรายการด้วยโปรแกรมรักษาหน้าจอแบบลดราคา
- เมื่อดึงข้อเสนอที่ใช้ได้ LimitedQuantityInfo สำหรับ สกรีนเซฟเวอร์ตัวเลือกการซื้อจะเป็นค่าว่าง และค่าจำนวนที่เหลือสำหรับ สกรีนเซฟเวอร์ส่วนลดจะเป็น 2
ตัวอย่างต่อไปนี้แสดงวิธีรับจำนวนจำกัดที่ระดับข้อเสนอส่วนลด
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(); // … } } } } });
เมื่อผู้ใช้แลกรับข้อเสนอจนครบจำนวนสูงสุดแล้ว ระบบจะไม่แสดงข้อเสนอในผลลัพธ์ของเมธอด getOneTimePurchaseOfferDetailsList()
คำนวณขีดจำกัดการแลกสิทธิ์
ตัวอย่างต่อไปนี้แสดงวิธีรับข้อมูลจำนวนจำกัดของข้อเสนอส่วนลดหนึ่งๆ คุณดูจำนวนสูงสุดที่อนุญาตและจำนวนที่เหลือสำหรับผู้ใช้ปัจจุบันได้ โปรดทราบว่าฟีเจอร์จำนวนจำกัดใช้ได้กับข้อเสนอผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวทั้งแบบใช้แล้วหมดและแบบใช้ได้ตลอด ฟีเจอร์นี้รองรับเฉพาะที่ระดับข้อเสนอ
Google Play จะคำนวณจำนวนที่เหลือโดยการลบจำนวนที่ผู้ใช้เป็นเจ้าของ ออกจากจำนวนสูงสุดที่อนุญาตที่คุณตั้งค่าไว้ เมื่อนับจำนวนที่ผู้ใช้เป็นเจ้าของ Google Play จะพิจารณาการซื้อที่ใช้แล้วหรือการซื้อที่รอดำเนินการ การซื้อที่ถูกยกเลิก คืนเงิน หรือปฏิเสธการชำระเงินจะไม่นับรวม ในจำนวนที่ผู้ใช้เป็นเจ้าของ เช่น
Super Screensaver ตั้งค่าข้อเสนอส่วนลดที่มีจำนวนสูงสุดที่อนุญาต คือ 1 รายการ เพื่อให้ผู้ใช้ซื้อโปรแกรมรักษาหน้าจอที่ลดราคาได้สูงสุด 1 รายการ
ผู้ใช้ซื้อโปรแกรมรักษาหน้าจอที่ลดราคา หากผู้ใช้พยายามซื้อสกรีนเซฟเวอร์ที่ลดราคาชิ้นที่ 2 ระบบจะแสดงข้อผิดพลาดและ
PurchasesUpdatedListener
จะได้รับรหัสการตอบกลับ ITEM_UNAVAILABLEผู้ใช้ขอเงินคืนสำหรับสกรีนเซฟเวอร์ที่ซื้อพร้อมส่วนลดในตอนแรก และได้รับเงินคืนเรียบร้อยแล้ว ผู้ใช้พยายามซื้อโปรแกรมรักษาหน้าจอที่ลดราคา 1 รายการ และการซื้อจะสำเร็จ
การมีสิทธิ์ของประเทศและภูมิภาค
คุณเลือกประเทศหรือภูมิภาคที่จะให้บริการข้อเสนอหรือส่วนลดสำหรับตัวเลือกการซื้อแก่ผู้ใช้ได้ Google Play จะประเมินการมีสิทธิ์ของผู้ใช้
โดยอิงตามประเทศที่ใช้ Play เมื่อกำหนดค่าความพร้อมจำหน่ายสินค้าระดับภูมิภาคสำหรับข้อเสนอ ระบบจะแสดงข้อเสนอเป็นส่วนหนึ่งของ getOneTimePurchaseOfferDetailsList()
ก็ต่อเมื่อผู้ใช้อยู่ในประเทศหรือภูมิภาคเป้าหมายเท่านั้น ไม่เช่นนั้น ข้อเสนอจะไม่รวมอยู่ในรายการข้อเสนอที่แสดงเมื่อคุณเรียกใช้ queryProductDetailsAsync()
แท็กข้อเสนอ
ตัวอย่างต่อไปนี้แสดงวิธีดึงแท็กข้อเสนอที่เชื่อมโยงกับ ข้อเสนอ
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(); // … } } } });
การสืบทอดแท็กข้อเสนอ
คุณตั้งค่าแท็กข้อเสนอสำหรับผลิตภัณฑ์ ตัวเลือกการซื้อ หรือข้อเสนอส่วนลดก็ได้ ข้อเสนอส่วนลดจะรับช่วงแท็กข้อเสนอจากข้อเสนอตัวเลือกการซื้อ ในทำนองเดียวกัน หากมีการระบุแท็กข้อเสนอที่ระดับผลิตภัณฑ์ ทั้งข้อเสนอตัวเลือกการซื้อและข้อเสนอส่วนลดจะรับช่วงแท็กข้อเสนอผลิตภัณฑ์
ตัวอย่างเช่น Super Screensavers มีข้อเสนอ 2 รายการสำหรับผลิตภัณฑ์ภาพพักหน้าจอ ได้แก่ ภาพพักหน้าจอแบบตัวเลือกการซื้อและภาพพักหน้าจอแบบส่วนลด
- Super Screensaver มีแท็กข้อเสนอผลิตภัณฑ์
SSProductTag
- โปรแกรมพักหน้าจอตัวเลือกการซื้อมีแท็กข้อเสนอ
SSPurchaseOptionTag
- โปรแกรมรักษาหน้าจอส่วนลดมีแท็กข้อเสนอ
SSDiscountOfferTag
ในตัวอย่างนี้ วิธี oneTimePurchaseOfferDetails.getOfferTagsList()
สำหรับ
ข้อเสนอตัวเลือกการซื้อจะแสดงผล SSProductTag
และ SSPurchaseOptionTag
สำหรับข้อเสนอส่วนลด เมธอดจะแสดงผล SSProductTag
, SSPurchaseOptionTag
และ SSDiscountOfferTag