เอกสารนี้จะอธิบายรายละเอียดการผสานรวมไอเทมแบบเรียกเก็บเงินครั้งเดียว (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 (PBL)
ผสานรวมตัวเลือกการซื้อเช่ากับ PBL
ส่วนนี้จะอธิบายวิธีผสานรวมตัวเลือกการซื้อเช่ากับคลังการเรียกเก็บเงินของ Play (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.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 (PBL)
ผสานรวมข้อเสนอการสั่งจองล่วงหน้ากับ PBL
ส่วนนี้จะอธิบายวิธีผสานรวมข้อเสนอการสั่งจองล่วงหน้ากับคลังการเรียกเก็บเงินของ Play (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: ดึงข้อมูลส่วนลดสุทธิของข้อเสนอที่มีส่วนลด
ตัวอย่างต่อไปนี้แสดงวิธีรับราคาเต็มเดิมของข้อเสนอที่มีส่วนลดและส่วนลดสัมบูรณ์ในหน่วยไมโคร โปรดทราบว่าระบบจะแสดงส่วนลดสัมบูรณ์ในข้อมูล Micros สำหรับข้อเสนอที่มีส่วนลดเท่านั้น คุณต้องระบุส่วนลดแบบสัมบูรณ์หรือส่วนลดแบบเปอร์เซ็นต์สำหรับข้อเสนอส่วนลด
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 จะพิจารณาการซื้อที่ใช้ไปแล้วหรือการซื้อที่รอดำเนินการ การซื้อที่ยกเลิก มีการคืนเงิน หรือมีการปฏิเสธการชำระเงินจะไม่นับรวมในจำนวนที่ผู้ใช้เป็นเจ้าของ เช่น
โปรแกรมรักษาหน้าจอสุดยอดจะตั้งค่าข้อเสนอส่วนลดที่มีจำนวนสูงสุดที่อนุญาตเป็น 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 มีแท็กข้อเสนอผลิตภัณฑ์
SSProductTag
- สกรีนเซฟเวอร์ตัวเลือกการซื้อมีแท็กข้อเสนอ
SSPurchaseOptionTag
- โปรแกรมรักษาหน้าจอที่มีส่วนลดมีแท็กข้อเสนอ
SSDiscountOfferTag
ในตัวอย่างนี้ วิธีการ oneTimePurchaseOfferDetails.getOfferTagsList()
สำหรับข้อเสนอตัวเลือกการซื้อแสดงผลลัพธ์เป็น SSProductTag
และ SSPurchaseOptionTag
สำหรับข้อเสนอส่วนลด เมธอดจะแสดงผล SSProductTag
, SSPurchaseOptionTag
และ SSDiscountOfferTag