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

เอกสารนี้จะอธิบายรายละเอียดการผสานรวมไอเทมแบบเรียกเก็บเงินครั้งเดียว (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 (PBL)

ผสานรวมตัวเลือกการซื้อเช่ากับ PBL

ส่วนนี้จะอธิบายวิธีผสานรวมตัวเลือกการซื้อเช่ากับคลังการเรียกเก็บเงินของ Play (PBL) บทความนี้ถือว่าคุณคุ้นเคยกับขั้นตอนเบื้องต้นในการผสานรวม PBL เช่น การเพิ่มการพึ่งพา PBL ลงในแอป การเริ่มต้นBillingClient และการเชื่อมต่อกับ Google Play ส่วนนี้มุ่งเน้นที่การผสานรวม PBL สำหรับตัวเลือกการเช่าซื้อโดยเฉพาะ

หากต้องการกำหนดค่าผลิตภัณฑ์ที่พร้อมให้เช่า คุณจะต้องใช้บริการmonetization.onetimeproductsใหม่ของ Play Developer API หรือ UI ของ Play Developer Console หากต้องการใช้บริการ คุณสามารถเรียกใช้ 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 (PBL)

ผสานรวมข้อเสนอการสั่งจองล่วงหน้ากับ PBL

ส่วนนี้จะอธิบายวิธีผสานรวมข้อเสนอการสั่งจองล่วงหน้ากับคลังการเรียกเก็บเงินของ Play (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: ดึงข้อมูลส่วนลดสุทธิของข้อเสนอที่มีส่วนลด

ตัวอย่างต่อไปนี้แสดงวิธีรับราคาเต็มเดิมของข้อเสนอที่มีส่วนลดและส่วนลดสัมบูรณ์ในหน่วยไมโคร โปรดทราบว่าระบบจะแสดงส่วนลดสัมบูรณ์ในข้อมูล 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();
              // …
            }
          }
        }
      }
    });
    

สินค้ามีจำนวนจำกัดในระดับข้อเสนอส่วนลด

คุณสามารถระบุขีดจำกัดจำนวนสูงสุดที่ระดับข้อเสนอส่วนลด ซึ่งจะมีผลเฉพาะที่ระดับข้อเสนอเท่านั้น ตัวอย่างที่แสดงให้เห็นมีดังนี้

  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. โปรแกรมรักษาหน้าจอสุดยอดจะตั้งค่าข้อเสนอส่วนลดที่มีจำนวนสูงสุดที่อนุญาตเป็น 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 มีแท็กข้อเสนอผลิตภัณฑ์ SSProductTag
  • สกรีนเซฟเวอร์ตัวเลือกการซื้อมีแท็กข้อเสนอ SSPurchaseOptionTag
  • โปรแกรมรักษาหน้าจอที่มีส่วนลดมีแท็กข้อเสนอ SSDiscountOfferTag

ในตัวอย่างนี้ วิธีการ oneTimePurchaseOfferDetails.getOfferTagsList() สำหรับข้อเสนอตัวเลือกการซื้อแสดงผลลัพธ์เป็น SSProductTag และ SSPurchaseOptionTag สำหรับข้อเสนอส่วนลด เมธอดจะแสดงผล SSProductTag, SSPurchaseOptionTag และ SSDiscountOfferTag