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

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

אפשרויות רכישה ומבצעים

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

‫Google Play תומך באפשרויות הרכישה הבאות של מוצרים בחיוב חד-פעמי:

  • אפשרות רכישה לקנייה
  • אפשרות רכישה להשכרה

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

‫Google Play תומך בהצעות הרכישה הבאות של מוצרים בחיוב חד-פעמי:

  • מבצע להזמנה מראש (נתמך רק באפשרות הרכישה 'קנייה')
  • מבצע הנחה (נתמך גם באפשרויות רכישה וגם באפשרויות השכרה)

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

אפשרות הרכישה 'קנייה' מייצגת רכישה רגילה ומוחלטת של המוצר בחיוב חד-פעמי. יש בו שדה אופציונלי בשם legacyCompatible, שמציין אם אפשרות הרכישה הזו תהיה זמינה בתהליכים ישנים יותר של ספריית החיוב ב-Play (גרסה 7 או גרסה ישנה יותר) שלא תומכים במודל החדש. כדי להבטיח תאימות לדורות קודמים, צריך לסמן לפחות אפשרות רכישה אחת מסוג 'קנייה' כתואמת לדור הקודם.

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

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

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

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

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

כדי להגדיר מוצרים שזמינים להשכרה, צריך להשתמש בשירות החדש monetization.onetimeproducts של Play Developer API או בממשק המשתמש של Play Developer Console. כדי להשתמש בשירות, אפשר לקרוא ישירות ל-API בארכיטקטורת REST או להשתמש בספריית הלקוח של 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. כשמציגים את המבצע למשתמש, צריך לוודא שמגדירים את הפרמטרים של תהליך החיוב עם טוקן המבצע הנכון שאפשר לקבל באמצעות method מסוג 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. כשמציגים את המבצע למשתמש, צריך לוודא שמגדירים את הפרמטרים של תהליך החיוב עם טוקן המבצע הנכון שאפשר לקבל באמצעות method מסוג 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();
            }
            // …
          }
        }
      }
    });
    

קבלת חלון הזמן התקף של מבצע

אפשר להשתמש ב-method‏ 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. למשתמש יש שומר מסך אחד עם הנחה, והוא מתכנן לקנות עוד אחד עם שומר המסך עם ההנחה.
  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. המשתמש קונה אחד משומרי המסך בהנחה. אם המשתמש ינסה לקנות את שומר המסך השני בהנחה, תתרחש שגיאה וקוד התגובה PurchasesUpdatedListener יקבל ITEM_UNAVAILABLE.

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

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

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