במאמר הזה מוסבר איך לשלב את המוצרים בחיוב חד-פעמי (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 (PBL).
שילוב של אפשרות רכישה להשכרה עם PBL
בקטע הזה מוסבר איך לשלב את אפשרות הרכישה של השכרה עם ספריית החיובים ב-Play (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.getSubscriptionOfferDetails() // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( 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.getSubscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
הפונקציה
offerTokenהיא חלק מהפונקציהOneTimePurchaseOfferDetails. כשמציגים את המבצע למשתמש, צריך לוודא שמגדירים את הפרמטרים של תהליך החיוב עם טוקן המבצע הנכון שאפשר לקבל באמצעות השיטהoneTimePurchaseOfferDetails.getOfferToken().
מבצע בהזמנה מראש
התכונה 'הזמנה מראש' מאפשרת לכם להגדיר מוצרים בחיוב חד-פעמי לרכישה לפני שהפריט מושק. כשמשתמש מזמין מראש את המוצר שלכם, הוא מסכים לשלם על הפריט כשהמוצר יושק, אלא אם הוא יבטל את ההזמנה מראש לפני תאריך ההשקה. בתאריך הפרסום, הקונה יחויב ו-Play ישלח לו הודעה באימייל שהפריט פורסם.
במאמר הזה מוסבר איך לשלב את האפשרות לרכישה בהזמנה מראש עם ספריית החיובים ב-Play (PBL).
שילוב מבצע בהזמנה מראש עם PBL
בקטע הזה מוסבר איך לשלב את מבצע ההזמנה מראש עם ספריית החיובים ב-Play (PBL). המדריך הזה מיועד למפתחים שכבר מכירים את השלבים הראשוניים בשילוב של PBL, כמו הוספת התלות של PBL לאפליקציה, הפעלה של BillingClient והתחברות ל-Google Play. החלק הזה מתמקד בהיבטים של שילוב PBL שספציפיים למבצע בהזמנה מראש.
הפעלת תהליך רכישה של מבצע להזמנה מראש
כדי להפעיל תהליך רכישה של מבצע להזמנה מראש, מבצעים את השלבים הבאים:
אפשר לאחזר את המטא-נתונים של המבצע להזמנה מראש באמצעות השיטה
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 לוקחת בחשבון רכישות שנצרכו או רכישות בהמתנה. רכישות שבוטלו, שניתן עליהן החזר כספי או שבוצע עליהן צ'ארג'בק לא נספרות במספר הפריטים שבבעלות המשתמש. לדוגמה:
שומרי מסך סופר מגדירים מבצע הנחה עם הכמות המקסימלית המותרת של אחד, כך שהמשתמשים יכולים לקנות עד שומר מסך אחד בהנחה.
המשתמש קונה אחד משומרי המסך בהנחה. אם המשתמש ינסה לקנות את שומר המסך השני בהנחה, תתרחש שגיאה והמערכת
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 יש שתי הצעות לשומר המסך: שומר מסך עם אפשרות רכישה ושומר מסך עם הנחה.
- שומר המסך 'סופר' כולל את תג מבצע המוצר
SSProductTag. - שומר המסך של אפשרות הרכישה כולל את תג המבצע
SSPurchaseOptionTag. - לשומר המסך עם ההנחה יש את תג המבצע
SSDiscountOfferTag.
בדוגמה הזו, ה-method oneTimePurchaseOfferDetails.getOfferTagsList() של מבצע אפשרות הרכישה מחזיר את הערכים SSProductTag ו-SSPurchaseOptionTag. במקרה של מבצע הנחה, השיטה מחזירה את הערכים SSProductTag, SSPurchaseOptionTag ו-SSDiscountOfferTag.