เอกสารนี้แสดงรายละเอียดการผสานรวมผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว (OTP) กับ Play Billing Library และอธิบายเพิ่มเติมเกี่ยวกับวิธีผสานรวมตัวเลือกการซื้อและข้อเสนอต่างๆ ที่เกี่ยวข้องกับผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว
คุณสามารถกำหนดค่าตัวเลือกการซื้อและข้อเสนอหลายรายการสำหรับผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวได้ เช่น กำหนดค่าตัวเลือกการซื้อแบบซื้อและข้อเสนอการสั่งล่วงหน้าสำหรับผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียวรายการเดียวกัน
สิ่งที่ต้องมีก่อน
หากต้องการกำหนดค่าข้อเสนอหลายรายการสำหรับผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว คุณต้องใช้
queryProductDetailsAsync() API ระบบไม่รองรับ 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 ที่เฉพาะเจาะจงสำหรับตัวเลือกการซื้อแบบเช่า
หากต้องการกำหนดค่าผลิตภัณฑ์ที่พร้อมให้เช่า คุณจะต้องใช้บริการ monetization.onetimeproducts ใหม่ของ Play Developer API หรือ UI ของ Play Developer Console หากต้องการใช้บริการนี้ คุณสามารถเรียก 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.getSubscriptionOfferDetails() // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( 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.getSubscriptionOfferDetails() // 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 เบื้องต้น เช่น การเพิ่มทรัพยากร Dependency ของ 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` สำหรับสกรีนเซฟเวอร์ตัวเลือกการซื้อจะเป็น null และค่าจำนวนที่เหลือสำหรับสกรีนเซฟเวอร์ส่วนลดจะเป็น 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 Screensavers ตั้งค่าข้อเสนอส่วนลดที่มีจำนวนสูงสุดที่อนุญาตเป็น 1 รายการ ดังนั้นผู้ใช้จึงซื้อสกรีนเซฟเวอร์ที่มีส่วนลดได้สูงสุด 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 Screensavers มีแท็กข้อเสนอของผลิตภัณฑ์
SSProductTag - สกรีนเซฟเวอร์ตัวเลือกการซื้อมีแท็กข้อเสนอ
SSPurchaseOptionTag - สกรีนเซฟเวอร์ส่วนลดมีแท็กข้อเสนอ
SSDiscountOfferTag
ในตัวอย่างนี้ เมธอด oneTimePurchaseOfferDetails.getOfferTagsList() สำหรับข้อเสนอตัวเลือกการซื้อจะแสดงผล SSProductTag และ SSPurchaseOptionTag สำหรับข้อเสนอส่วนลด เมธอดจะแสดงผล SSProductTag, SSPurchaseOptionTag และ SSDiscountOfferTag