במסמך הזה מוסבר איך לשלב מוצרים חד-פעמיים (OTP) עם ספריית החיובים ב-Play. בנוסף, מוסבר איך לשלב מבצעים ואפשרויות רכישה שונות שקשורים למוצרים שלכם בחיוב חד-פעמי.
אתם יכולים להגדיר כמה אפשרויות רכישה ומבצעים למוצרים חד-פעמיים. לדוגמה, אפשר להגדיר אפשרות רכישה וגם מבצע להזמנה מראש של אותו מוצר חד-פעמי.
דרישות מוקדמות
כדי להגדיר כמה מבצעים למוצרים בחיוב חד-פעמי, צריך להשתמש ב-API queryProductDetailsAsync()
. אין תמיכה ב-API querySkuDetailsAsync()
שהוצא משימוש. מידע על השימוש ב-queryProductDetailsAsync()
ועל הגרסה של launchBillingFlow()
שמקבלת את ProductDetailsParams
כקלט זמין בשלבי ההעברה.
שליחת שאילתה לגבי פרטי המוצר
אם הגדרתם כמה מבצעים או אפשרויות רכישה למוצר החד-פעמי, לאובייקט ProductDetails
שמוחזר על ידי השיטה queryProductDetailsAsync()
יכולות להיות יותר מאפשרות רכישה אחת (או יותר מאפשרות שכירות אחת) לכל מוצר חד-פעמי. כדי לקבל את רשימת כל המבצעים שעומדים בדרישות לכל אובייקט ProductDetails
, משתמשים בשיטה getOneTimePurchaseOfferDetailsList()
. רק מבצעים ואפשרויות רכישה שהמשתמש עומד בדרישות שלהם יוחזרו כחלק מהרשימה הזו. הקוד שלכם ב-method 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 יש תמיכה באפשרויות הרכישה הבאות למוצרים חד-פעמיים:
- רכישת אפשרות הרכישה
- אפשרות רכישה ב-Rent
מבצעים מתייחסים לסכימת תמחור שאפשר ליצור למוצרים חד-פעמיים. לדוגמה, אתם יכולים ליצור מבצע הנחה למוצר החד-פעמי.
ב-Google Play יש תמיכה באפשרויות הרכישה הבאות של מוצרים חד-פעמיים:
- מבצע להזמנה מראש (האפשרות הזו נתמכת רק באפשרות הרכישה 'קנייה')
- הצעה בהנחה (האפשרות הזו נתמכת גם ברכישה וגם בהשכרה)
רכישת אפשרות הרכישה
אפשרות הרכישה 'קנייה' מייצגת רכישה רגילה של המוצר החד-פעמי. יש בו שדה אופציונלי בשם legacyCompatible, שמציין אם אפשרות הרכישה הזו תהיה זמינה בתהליכים ישנים יותר של ספריית החיוב ב-Play (גרסה 7 ואילך) שלא תומכים במודל החדש. כדי לשמור על תאימות לאחור, צריך לסמן לפחות אפשרות רכישה אחת כתואמת לדור הקודם.
השלבים לשילוב של אפשרויות הרכישה (קנייה והשכרה) עם PBL זהים. במאמר שילוב אפשרות רכישה לטווח ארוך עם PBL מוסבר איך משתמשים ב-PBL עם אפשרות רכישה לטווח ארוך.
אפשרות רכישה ב-Rent
אפשרות הרכישה ב-Rent מאפשרת למשתמשים לגשת למוצרים בחיוב חד-פעמי למשך פרק זמן מסוים. אפשר לציין את תקופת ההשכרה ואת תאריך התפוגה שלה. במסמך הזה מוסבר איך לשלב את אפשרות הרכישה לתקופה מוגבלת עם Play Billing Library (PBL).
שילוב של אפשרות הרכישה 'השכרה' עם PBL
בקטע הזה נסביר איך לשלב את אפשרות הרכישה לטווח קצר עם Play Billing Library (PBL). ההנחה היא שאתם מכירים את שלבי השילוב הראשוניים של PBL, כמו הוספת התלות ב-PBL לאפליקציה, אתחול של BillingClient וחיבור ל-Google Play. הקטע הזה מתמקד בהיבטים של שילוב PBL שספציפיים לאפשרות הרכישה 'לשכירה'.
כדי להגדיר מוצרים שזמינים להשכרה, תצטרכו להשתמש בשירות החדש monetization.onetimeproducts
של Play Developer API או בממשק המשתמש של Play Developer Console. כדי להשתמש בשירות, אפשר לקרוא ישירות ל-API ל-REST או להשתמש בספריית הלקוח של Java.
הפעלת תהליך רכישה לאפשרות ההשכרה
כדי להפעיל תהליך רכישה של מבצע שכירות:
אחזור המטא-נתונים של אפשרות הרכישה לדייר באמצעות השיטה
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
.בדוגמה הבאה מוסבר איך לקבל את המטא-נתונים של רכישת השכירות:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a rent purchase option. if (oneTimePurchaseOfferDetails.getRentalDetails() != null) { // process the returned RentalDetails OneTimePurchaseOfferDetails.RentalDetails rentalDetails = oneTimePurchaseOfferDetails.getRentalDetails(); // Get rental period in ISO 8601 format. String rentalPeriod = rentalDetails.getRentalPeriod(); // Get rental expiration period in ISO 8601 format, if present. if (rentalDetails.getRentalExpirationPeriod() != null) { String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod(); } // Get offer token String offerToken = oneTimePurchaseOfferDetails.getOfferToken(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
מפעילים את תהליך החיוב.
כדי להתחיל בקשת רכישה מהאפליקציה, צריך להפעיל את השיטה
launchBillingFlow()
מהשרשור הראשי של האפליקציה. השיטה מקבלת הפניה לאובייקטBillingFlowParams
שמכיל את האובייקט הרלוונטיProductDetails
שהתקבל מהקריאה ל-queryProductDetailsAsync()
. כדי ליצור אובייקטBillingFlowParams
, משתמשים במחלקהBillingFlowParams.Builder
. חשוב לזכור שצריך להגדיר את אסימון המבצע שתואם למבצע שבחר המשתמש כשיוצרים את האובייקטBillingFlowParams
. אם המשתמש עומד בדרישות לרכישת השכרה, הוא יקבל הצעה עם RentalDetails ו-offerId ב-queryProductDetailsAsync()
.הדוגמה הבאה מראה איך מפעילים את תהליך החיוב:
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
אפשר למצוא את
offerToken
כחלק מ-OneTimePurchaseOfferDetails
. כשמציגים את המבצע למשתמש, חשוב להגדיר את הפרמטרים של תהליך החיוב באמצעות אסימון המבצע הנכון, שאפשר לקבל מהשיטהoneTimePurchaseOfferDetails.getOfferToken()
.
מבצע להזמנה מראש
הזמנה מראש מאפשרת לכם להגדיר מוצרים חד-פעמיים לרכישה לפני שהם יושקו. כשמשתמש מבצע הזמנה מראש של המוצר, הוא מסכים לשלם על הפריט כשהמוצר יושק, אלא אם הוא מבטל את ההזמנה מראש לפני תאריך ההשקה. בתאריך הפרסום, הקונה יחויב ומערכת Play תודיע לו באימייל שהפריט זמין.
במסמך הזה מוסבר איך לשלב את ההצעה לרכישה מראש עם Play Billing Library (PBL).
שילוב מבצע להזמנה מראש עם PBL
בקטע הזה נסביר איך לשלב את המבצע להזמנה מראש עם Play Billing Library (PBL). ההנחה היא שאתם מכירים את שלבי השילוב הראשוניים של PBL, כמו הוספת התלות ב-PBL לאפליקציה, אתחול של BillingClient וחיבור ל-Google Play. הקטע הזה מתמקד בהיבטים של שילוב PBL שספציפיים להצעה של ההזמנה מראש.
הפעלת תהליך רכישה למבצע להזמנה מראש
כדי להפעיל תהליך רכישה להזמנה מראש, מבצעים את הפעולות הבאות:
אחזור המטא-נתונים של המבצע להזמנה מראש באמצעות השיטה
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
. בדוגמה הבאה מוסבר איך לקבל את המטא-נתונים של מבצע ההזמנה מראש:Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a preorder offer. if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) { // process the returned PreorderDetails OneTimePurchaseOfferDetails.PreorderDetails preorderDetails = oneTimePurchaseOfferDetails.getPreorderDetails(); // Get preorder release time in millis. long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis(); // Get preorder presale end time in millis. long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis(); // Get offer ID String offerId = oneTimePurchaseOfferDetails.getOfferId(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
מפעילים את תהליך החיוב.
כדי להתחיל בקשת רכישה מהאפליקציה, צריך להפעיל את השיטה
launchBillingFlow()
מהשרשור הראשי של האפליקציה. השיטה הזו מקבלת הפניה לאובייקטBillingFlowParams
שמכיל את האובייקט הרלוונטיProductDetails
שהתקבל מהקריאה ל-queryProductDetailsAsync(). כדי ליצור אובייקטBillingFlowParams
, משתמשים ב-BillingFlowParams.Builder class
. חשוב לזכור שצריך להגדיר את אסימון המבצע התואם למבצע שבחר המשתמש כשיוצרים את האובייקטBillingFlowParams
. אם משתמש עומד בדרישות להזמנה מראש, הוא יקבל הצעה עם PreorderDetails ו-offerId בשיטהqueryProductDetailsAsync()
.הדוגמה הבאה מראה איך מפעילים את תהליך החיוב:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
אפשר למצוא את
offerToken
כחלק מ-OneTimePurchaseOfferDetails
. כשמציגים את המבצע למשתמש, חשוב להגדיר את הפרמטרים של תהליך החיוב באמצעות אסימון המבצע הנכון, שאפשר לקבל מהשיטהoneTimePurchaseOfferDetails.getOfferToken()
.
הצעה בהנחה
בקטע הזה מוסבר איך מגדירים מבצעים של הנחות על מוצרים חד-פעמיים.
יש ארבעה פרמטרים שונים שאפשר להגדיר בהצעה של הנחה חד-פעמית על מוצר:
מחיר המבצע המוזל: מציינים את אחוז ההנחה או את הסכום המוחלט של ההנחה מהמחיר המקורי.
דרישות הסף למדינות או לאזורים: מציינים את הזמינות של מוצרים מיוחדים לחיוב חד-פעמי במדינה או באזור.
מגבלת רכישה (אופציונלי): מאפשרת לכם לקבוע כמה פעמים משתמש יכול לממש את אותו מבצע. אם משתמש חורג ממגבלת הרכישה, הוא לא יוכל לממש את המבצע.
לזמן מוגבל (אופציונלי): ציון פרק הזמן שבו המבצע זמין. מחוץ לתקופה הזו, לא ניתן לרכוש את המבצע.
אחזור פרטי המחיר של מבצע מוזל
במבצע מוזל, אפשר לאחזר את אחוז ההנחה או את ההנחה המוחלטת.
דוגמה 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(); // … } } } } });
כמות מוגבלת ברמת המבצע
אפשר לציין את מגבלת הכמות המקסימלית ברמת המבצע, והיא תחול רק ברמת המבצע. דוגמה להמחשה:
- ב-Super screensavers יש 2 מבצעים למוצר שומר המסך: שומר מסך לרכישה ושומר מסך בהנחה.
- לא מוגדרת כמות מוגבלת של שומר המסך עם אפשרות הרכישה.
- במסך האישי של המבצע, המספר המקסימלי של שומר המסך עם ההנחה מוגדר ל-3.
- למוצר של מסך ההפעלה אין כמות מקסימלית מותרת ברמת המוצר, כך שמשתמשים יכולים לקנות כמויות בלתי מוגבלות של המוצר הזה.
- למשתמש יש שומר מסך אחד עם הנחה, והוא מתכנן לקנות עוד אחד עם שומר המסך עם ההנחה.
- כשמאחזרים את המבצעים הזמינים, הערך של 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 מביאה בחשבון רכישות שנעשה בהן שימוש או רכישות בהמתנה. רכישות שבוטלו, הוחזר עליהן כסף או בוצעה עליהן החזר כספי לא נספרות במסגרת הכמות שבבעלות המשתמש. לדוגמה:
ב-Super screensavers מגדירים מבצע הנחה עם כמות מקסימלית של יחידה אחת, כך שמשתמשים יכולים לקנות עד שומר מסך אחד בהנחה.
המשתמש קונה אחד משומרי המסך בהנחה. אם המשתמש ינסה לקנות את שומר המסך השני בהנחה, תוצג לו הודעת שגיאה ו
PurchasesUpdatedListener
יקבל את קוד התגובה ITEM_UNAVAILABLE.המשתמש מבקש החזר כספי על מסך האשנכל שרכש במקור בהנחה, ומקבל את ההחזר הכספי. המשתמש ינסה לקנות אחד משומר המסך בהנחה, והרכישה תתבצע.
תנאי הזכאות לפי מדינה ואזור
אתם יכולים לבחור את המדינות או האזורים שבהם המבצע על אפשרות הרכישה או המבצע על ההנחה יהיו זמינים למשתמשים. מערכת 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 screensaver מוגדר התג של מבצע המוצר
SSProductTag
. - שומר המסך של אפשרות הרכישה כולל את תג המבצע
SSPurchaseOptionTag
. - שומר המסך של ההנחה כולל את תג המבצע
SSDiscountOfferTag
.
בדוגמה הזו, השיטה oneTimePurchaseOfferDetails.getOfferTagsList()
של המבצע של אפשרות הרכישה מחזירה את הערכים SSProductTag
ו-SSPurchaseOptionTag
. לגבי המבצע להנחה, השיטה מחזירה את הערכים SSProductTag
, SSPurchaseOptionTag
ו-SSDiscountOfferTag
.