כמה אפשרויות רכישה ומבצעים למוצרים בחיוב חד-פעמי

במסמך הזה מוסבר איך לשלב את המוצרים בחיוב חד-פעמי (OTP) עם ספריית החיובים ב-Play. בנוסף, מוסבר במאמר איך לשלב אפשרויות רכישה שונות ומבצעים שקשורים למוצרים בחיוב חד-פעמי.

אתם יכולים להגדיר כמה אפשרויות רכישה ומבצעים למוצרים בחיוב חד-פעמי. לדוגמה, אפשר להגדיר אפשרות רכישה של מוצר ואפשרות להזמנה מראש של אותו מוצר בחיוב חד-פעמי.

דרישות מוקדמות

כדי להגדיר כמה מבצעים למוצרים בחיוב חד-פעמי, צריך להשתמש ב-API‏ queryProductDetailsAsync(). אין תמיכה ב-API querySkuDetailsAsync() שהוצא משימוש. מידע על השימוש ב-queryProductDetailsAsync() ובגרסה של launchBillingFlow() שמקבלת את ProductDetailsParams כקלט זמין במאמר בנושא שלבי העברת הנתונים.

שליחת שאילתה לגבי פרטי המוצר

אם הגדרתם כמה מבצעים או אפשרויות רכישה למוצר בחיוב חד-פעמי, לאובייקט ProductDetails שמוחזר על ידי השיטה queryProductDetailsAsync() יכולות להיות יותר מאפשרות רכישה אחת של מוצר בחיוב חד-פעמי. כדי לקבל את רשימת כל המבצעים שעומדים בדרישות לכל אובייקט 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 (גרסה 7 או גרסה ישנה יותר) שלא תומכים במודל החדש. כדי להגדיר תאימות לדורות קודמים, צריך לסמן לפחות אפשרות רכישה אחת מסוג 'קנייה' כתואמת לדור הקודם.

השלבים לשילוב של אפשרויות הרכישה וההשכרה עם PBL זהים. כדי להבין איך לשלב את אפשרות הרכישה עם PBL, אפשר לעיין במאמר בנושא שילוב של אפשרות רכישה להשכרה עם PBL.

אפשרות רכישה של השכרה

האפשרות 'רכישת השכרה' מאפשרת למשתמשים לגשת למוצרים בחיוב חד-פעמי למשך זמן מוגדר. אתם יכולים לציין את תקופת ההשכרה ואת תאריך התפוגה שלה. במאמר הזה מוסבר איך משלבים את אפשרות הרכישה של השכרה עם Play Billing Library‏ (PBL).

שילוב של אפשרות רכישה של השכרה עם PBL

בקטע הזה מוסבר איך לשלב את אפשרות הרכישה של השכרה עם Play Billing Library‏ (PBL). ההנחה היא שאתם מכירים את השלבים הראשוניים לשילוב PBL, כמו הוספת התלות של PBL לאפליקציה, אתחול BillingClient והתחברות ל-Google Play. החלק הזה מתמקד בהיבטים של שילוב PBL שספציפיים לאפשרות של השכרת תוכן או רכישת תוכן.

כדי להגדיר מוצרים שזמינים להשכרה, צריך להשתמש בשירות החדש monetization.onetimeproducts של Play Developer API או בממשק המשתמש של 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 Billing Library‏ (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().

הנחה

בקטע הזה מוסבר איך להגדיר מבצעים על מוצרים חד-פעמיים.

יש ארבעה פרמטרים שונים שאפשר להגדיר בהנחה על מוצר בחיוב חד-פעמי:

  • מחיר מבצע: מציינים פרטים על אחוז ההנחה או על ההנחה במחיר המקורי.

  • מדינות או אזורים שעומדים בדרישות: מציין את הזמינות של מוצרים לחיוב חד-פעמי במדינה או באזור.

  • מגבלת רכישה (אופציונלי): מאפשרת לקבוע כמה פעמים משתמש יכול לממש את אותו המבצע. אם משתמש חורג ממגבלת הרכישה, הוא לא יוכל ליהנות מהמבצע.

  • תקופה מוגבלת (אופציונלי): מציינים את התקופה שבה המבצע זמין. לא ניתן לרכוש את המבצע מחוץ לתקופת הזמן הזו.

אחזור מידע על מחיר מבצע מוזל

במקרה של מבצע עם הנחה, אפשר לאחזר את אחוז ההנחה או את ההנחה המוחלטת שמוצעת.

דוגמה 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() method כדי לקבל את חלון הזמן התקף של מבצע. האובייקט הזה מכיל את שעת ההתחלה ושעת הסיום של חלון הזמן באלפיות שנייה.

בדוגמה הבאה מוצג איך מקבלים את חלון הזמן התקף של מבצע:

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. למשתמש יש שומר מסך אחד עם הנחה, והוא מתכנן לקנות עוד אחד עם שומר המסך עם ההנחה.
  4. כשמאחזרים את המבצעים הזמינים, הערך של 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 לוקחת בחשבון רכישות שנצרכו או רכישות בהמתנה. רכישות שבוטלו, שניתן עליהן החזר כספי או שבוצע עליהן צ'ארג'בק לא נספרות במספר הפריטים שבבעלות המשתמש. לדוגמה:

  1. שומרי מסך סופר מגדירים מבצע הנחה עם הכמות המקסימלית המותרת של אחד, כך שהמשתמשים יכולים לקנות עד שומר מסך אחד בהנחה.

  2. המשתמש קונה אחד משומרי המסך בהנחה. אם המשתמש ינסה לקנות את שומר המסך השני בהנחה, תופיע שגיאה והמערכת תשלח קוד תגובה ITEM_UNAVAILABLE ל-PurchasesUpdatedListener.

  3. המשתמש מבקש החזר כספי על שומר המסך המקורי שרכש בהנחה, ומקבל את ההחזר. המשתמש מנסה לקנות אחד משומרי המסך המוזלים, והרכישה תצליח.

זכאות לפי מדינה ואזור

אתם יכולים לבחור את המדינות או האזורים שבהם המשתמשים יוכלו ליהנות ממבצע על אפשרות רכישה או ממבצע הנחה. מערכת 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 יש שתי הצעות לשומר המסך: אפשרות לרכוש את שומר המסך ואפשרות לרכוש אותו בהנחה.

  • שומר המסך 'סופר' כולל את תג מבצע המוצר SSProductTag.
  • שומר המסך של אפשרות הרכישה כולל את תג המבצע SSPurchaseOptionTag.
  • לשומר המסך עם ההנחה יש את תג המבצע SSDiscountOfferTag.

בדוגמה הזו, הפונקציה oneTimePurchaseOfferDetails.getOfferTagsList() של אפשרות הרכישה מחזירה את הערכים SSProductTag ו-SSPurchaseOptionTag. במקרה של מבצע הנחה, השיטה מחזירה את הערכים SSProductTag, SSPurchaseOptionTag ו-SSDiscountOfferTag.