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