ตัวเลือกและข้อเสนอการซื้อหลายรายการสำหรับผลิตภัณฑ์แบบเรียกเก็บเงินครั้งเดียว

เอกสารนี้จะอธิบายรายละเอียดการผสานรวมไอเทมแบบเรียกเก็บเงินครั้งเดียว (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 &quot;productDetails&quot; by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
    
    

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

เปิดตัวขั้นตอนการซื้อสำหรับตัวเลือกการเช่า

หากต้องการเปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการเช่า ให้ทำตามขั้นตอนต่อไปนี้

  1. ดึงข้อมูลเมตาของตัวเลือกการซื้อแบบเช่าโดยใช้เมธอด 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();
              }
            }
          }
        }
      }
    });
  2. เปิดโฟลว์การเรียกเก็บเงิน

    หากต้องการเริ่มคำขอซื้อจากแอป ให้เรียกใช้เมธอด 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 ที่เฉพาะเจาะจงสำหรับ ข้อเสนอการสั่งซื้อล่วงหน้า

เปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการสั่งจองล่วงหน้า

หากต้องการเปิดตัวขั้นตอนการซื้อสำหรับข้อเสนอการสั่งจองล่วงหน้า ให้ทำตามขั้นตอนต่อไปนี้

  1. ดึงข้อมูลเมตาของข้อเสนอการสั่งจองล่วงหน้าโดยใช้เมธอด 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();
              }
            }
          }
        }
      }
    });

  2. เปิดโฟลว์การเรียกเก็บเงิน

    หากต้องการเริ่มคำขอซื้อจากแอป ให้เรียกใช้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();
              // …
            }
          }
        }
      }
    });
    

จำนวนจำกัดที่ระดับข้อเสนอส่วนลด

คุณระบุขีดจำกัดจำนวนสูงสุดได้ที่ระดับข้อเสนอส่วนลด ซึ่งจะ ใช้ที่ระดับข้อเสนอเท่านั้น ตัวอย่างต่อไปนี้จะช่วยให้เข้าใจได้ดียิ่งขึ้น

  1. Super Screensavers มีข้อเสนอ 2 รายการสำหรับผลิตภัณฑ์โปรแกรมรักษาหน้าจอ ได้แก่ ตัวเลือกการซื้อ โปรแกรมรักษาหน้าจอและโปรแกรมรักษาหน้าจอแบบมีส่วนลด
    1. โปรแกรมรักษาหน้าจอตัวเลือกการซื้อไม่ได้ตั้งค่าจำนวนจำกัดไว้
    2. สกรีนเซฟเวอร์ส่วนลดมีจำนวนสูงสุดที่อนุญาตในระดับข้อเสนอ ตั้งค่าเป็น 3
  2. ผลิตภัณฑ์สกรีนเซฟเวอร์ไม่มีจำนวนสูงสุดที่อนุญาตในระดับผลิตภัณฑ์ ดังนั้นผู้ใช้จึงซื้อผลิตภัณฑ์นี้ได้ไม่จำกัดจำนวน
  3. ผู้ใช้มีโปรแกรมรักษาหน้าจอแบบลดราคา 1 รายการ และวางแผนที่จะซื้ออีกรายการด้วยโปรแกรมรักษาหน้าจอแบบลดราคา
  4. เมื่อดึงข้อเสนอที่ใช้ได้ 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. Super Screensaver ตั้งค่าข้อเสนอส่วนลดที่มีจำนวนสูงสุดที่อนุญาต คือ 1 รายการ เพื่อให้ผู้ใช้ซื้อโปรแกรมรักษาหน้าจอที่ลดราคาได้สูงสุด 1 รายการ

  2. ผู้ใช้ซื้อโปรแกรมรักษาหน้าจอที่ลดราคา หากผู้ใช้พยายามซื้อสกรีนเซฟเวอร์ที่ลดราคาชิ้นที่ 2 ระบบจะแสดงข้อผิดพลาดและPurchasesUpdatedListenerจะได้รับรหัสการตอบกลับ ITEM_UNAVAILABLE

  3. ผู้ใช้ขอเงินคืนสำหรับสกรีนเซฟเวอร์ที่ซื้อพร้อมส่วนลดในตอนแรก และได้รับเงินคืนเรียบร้อยแล้ว ผู้ใช้พยายามซื้อโปรแกรมรักษาหน้าจอที่ลดราคา 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