1. מבוא
ב-codelab הזה תתמקדו ביצירת מוצר בחיוב חד-פעמי (OTP) ובהוספת מבצע להזמנה מראש של המוצר.
הערה: לפני שמתחילים את ה-codelab הזה, צריך למלא את טופס ההתעניינות בתוכנית הגישה המוקדמת למוצרים חד-פעמיים כדי לבקש גישה לתכונת ההזמנה מראש.
קהל
ה-codelab הזה מיועד למפתחי אפליקציות ל-Android שמכירים מוצרים חד-פעמיים ורוצים להבין איך להוסיף למוצרים החד-פעמיים שלהם מבצעים להזמנה מראש.
דרישה מוקדמת
אם אתם חדשים בנושא מוצרים חד-פעמיים, מומלץ להשלים את ה-codelab בנושא פתיחת שווקים חדשים באמצעות תמחור מוצרים אזורי.
מה תלמדו...
- איך משתמשים ב-Google Play Console כדי ליצור מבצעים להזמנה מראש של מוצרים בחיוב חד-פעמי.
- איך משתמשים בממשקי ה-API של ספריית החיובים ב-Play כדי לשלוח שאילתות לגבי מוצרים בחיוב חד-פעמי ופרטי המבצעים להזמנה מראש שקשורים אליהם.
מה צריך...
- גישה אל Google Play Console עם חשבון פיתוח. אם אין לכם חשבון פיתוח, אתם צריכים ליצור חשבון.
- אפליקציה לדוגמה ל-Codelab הזה שאפשר להוריד מ-GitHub.
- Android Studio.
2. פיתוח אפליקציה לדוגמה
בשיעור הזה תלמדו איך לנהל מוצרים חד-פעמיים באמצעות אפליקציית Android לדוגמה. אפליקציית הדוגמה מתוכננת להיות אפליקציית Android פונקציונלית לחלוטין, עם קוד מקור מלא שמציג את ההיבטים הבאים:
- שילוב האפליקציה עם PBL.
- אחזור של מוצרים בחיוב חד-פעמי ומבצעים קשורים להזמנה מראש.
- הפעלת תהליכי רכישה של תמחור אזורי.
בסרטון ההדגמה הבא אפשר לראות איך אפליקציית הדוגמה תיראה ותתנהג אחרי הפריסה וההפעלה שלה.
אם אתם כבר מכירים מוצרים בחיוב חד-פעמי ואת ספריית החיובים ב-Play (PBL), אתם יכולים להוריד את האפליקציה לדוגמה ולנסות אותה.
דרישות מוקדמות
לפני שיוצרים ומפעילים את האפליקציה לדוגמה, צריך לבצע את הפעולות הבאות:
- יוצרים חשבון פיתוח ב-Google Play Console. אם כבר יש לכם חשבון פיתוח, אתם יכולים לדלג על השלב הזה.
- יוצרים אפליקציה חדשה ב-Play Console. כשיוצרים אפליקציה, אפשר לציין כל שם אפליקציה לאפליקציה לדוגמה.
- מתקינים את Android Studio.
תכנות
המטרה של שלב ה-build הזה היא ליצור קובץ חתום של Android App Bundle של אפליקציית הדוגמה.
כדי ליצור את חבילת האפליקציה ל-Android:
- מורידים את האפליקציה לדוגמה מ-GitHub.
- יוצרים את האפליקציה לדוגמה. לפני שיוצרים את האפליקציה, משנים את שם החבילה שלה ואז יוצרים אותה. אם יש לכם חבילות של אפליקציות אחרות ב-Play Console, ודאו ששם החבילה שסיפקתם לאפליקציית הדוגמה הוא ייחודי.
הערה: בניית האפליקציה לדוגמה יוצרת רק קובץ APK שאפשר להשתמש בו לבדיקה מקומית. עם זאת, הפעלת האפליקציה לא תאחזר מוצרים ומחירים כי המוצרים לא הוגדרו ב-Play Console. - יוצרים קובץ Android App Bundle חתום.
השלב הבא הוא להעלות את חבילת האפליקציה ל-Android אל Google Play Console.
3. יצירת קוד OTP עם הזמנה מראש ב-Play Console
כדי ליצור מוצרים לרכישה חד-פעמית (OTP) ב-Google Play Console, צריך שתהיה לכם אפליקציה ב-Play Console. יוצרים אפליקציה ב-Play Console, ואז מעלים את ה-App Bundle החתום שנוצר קודם.
יצירת אפליקציה
כדי ליצור אפליקציה:
- מתחברים אל Google Play Console באמצעות חשבון המפתח.
- לוחצים על יצירת אפליקציה. ייפתח הדף יצירת אפליקציה.
- מזינים את שם האפליקציה, בוחרים את שפת ברירת המחדל ופרטים נוספים שקשורים לאפליקציה.
- לוחצים על יצירת אפליקציה. כך נוצרת אפליקציה ב-Google Play Console.
עכשיו אפשר להעלות את קובץ ה-App Bundle החתום של האפליקציה לדוגמה.
העלאת קובץ App Bundle חתום
- מעלים את ה-App Bundle החתום למסלול הפצה לבדיקה פנימית ב-Google Play Console. רק אחרי ההעלאה אפשר להגדיר את התכונות שקשורות למונטיזציה ב-Play Console.
- לוחצים על בדיקה ופרסום > בדיקה > גרסה לבדיקה פנימית > יצירת גרסה חדשה.
- מזינים שם לגרסת האפליקציה ומעלים את קובץ ה-APK החתום.
- לוחצים על הבא ואז על שמירה ופרסום.
עכשיו אפשר ליצור את המוצרים בחיוב חד-פעמי.
יצירת מוצר בחיוב חד-פעמי
עכשיו יוצרים את המוצר בחיוב חד-פעמי שרוצים שהמשתמשים ירכשו.
- פותחים את האפליקציה לדוגמה ב-Google Play Console ועוברים אל מוצרים חד-פעמיים > מוצרים > מונטיזציה באמצעות Play.
- לוחצים על יצירת מוצר בחיוב חד-פעמי.
- מזינים את פרטי המוצר הבאים:
- מזהה מוצר: מזינים מזהה ייחודי. לדוגמה,
upcoming_movie_1. - (אופציונלי) תגים: מוסיפים תגים רלוונטיים.
- שם: מזינים שם למוצר. לדוגמה,
Product Movie. - תיאור: מזינים תיאור של המוצר. לדוגמה,
Product Description. - (אופציונלי) מוסיפים תמונה של סמל: מעלים סמל שמייצג את המוצר.
- מזהה מוצר: מזינים מזהה ייחודי. לדוגמה,
- לוחצים על הבא.
- מוסיפים אפשרות רכישה ומגדירים את הזמינות שלה לפי אזור. למוצר חד-פעמי צריך להיות לפחות אפשרות רכישה אחת, שבה מוגדר אופן הענקת ההרשאה, המחיר והזמינות האזורית. ב-codelab הזה, נוסיף את האפשרות הסטנדרטית קנייה למוצר.בקטע אפשרות רכישה, מזינים את הפרטים הבאים:
- מזהה אפשרות הרכישה: מזינים מזהה ייחודי. לדוגמה,
buy-movie. - סוג הרכישה: בוחרים באפשרות קנייה.
- (אופציונלי) תגים: מוסיפים תגים ספציפיים לאפשרות הרכישה הזו.
- (אופציונלי) לוחצים על אפשרויות מתקדמות כדי להגדיר את האפשרויות המתקדמות. לצורך ה-codelab הזה, אפשר לדלג על הגדרת האפשרויות המתקדמות.
- מזהה אפשרות הרכישה: מזינים מזהה ייחודי. לדוגמה,
- לאחר מכן, צריך להגדיר את הזמינות והמחיר האזוריים של אפשרות הרכישה. בנתוני הזמינות האזורית, תציינו את האזורים שבהם המוצר שלכם זמין, כולל אזורים שבהם האפליקציה שלכם עדיין לא פורסמה. כברירת מחדל, אפשרות הרכישה תהיה זמינה בכל האזורים.בקטע זמינות ומחירים, לוחצים על עריכת הזמינות והגישה.
- בוחרים באפשרות לא זמין.
- מבטלים את הבחירה רק ב
United Statesהמדינה, ואז לוחצים על הגדרה כלא זמין. המוצר עם התשלום החד-פעמי יהיה זמין רק בUnited States. - בתפריט הנפתח כל האזורים, בוחרים באפשרות מדינות ואזורים זמינים. אמור להופיע רק הסמל
United States. - לוחצים על סמל המחיר. מוצגת תיבת דו-שיח להגדרת המחיר.
- מזינים 10 דולר ארה"ב ולוחצים על שמירה.
- לוחצים על שמירה כטיוטה.
הערה: אל תפעילו עדיין את אפשרות הרכישה. נפעיל אותו אחרי שנסיים להגדיר את המבצע להזמנה מראש. הסיבה לכך היא שאי אפשר להוסיף מבצע להזמנה מראש לאפשרות רכישה פעילה שהזמינות שלה באזורים מוגדרת.
הוספת מבצע להזמנה מראש
עכשיו מוסיפים מבצע להזמנה מראש לאפשרות הרכישה 'קנייה' שיצרתם קודם. מבצע הזמנה מראש מאפשר למשתמשים לרכוש את הפריט לפני ההשקה הרשמית שלו. הערה: מבצעים להזמנה מראש נתמכים רק באפשרות הרכישה קנייה, ואפשר להגדיר אותם רק למוצרים חדשים באזור מסוים.
הוספת מבצע להזמנה מראש כוללת את 2 השלבים הבאים:
- מכינים את אפשרות הרכישה קנייה למבצע להזמנה מראש.
- מוסיפים את המבצע להזמנה מראש לאפשרות הרכישה.
הכנת אפשרות הרכישה 'קנייה' למבצע להזמנה מראש
- פותחים את האפליקציה לדוגמה ב-Google Play Console ועוברים אל מוצרים חד-פעמיים > מוצרים > מונטיזציה באמצעות Play.
- בדף מוצרים בחיוב חד-פעמי, לוחצים על החץ שמאלה לצד המוצר (
upcoming_movie_1). כך נפתח הדף עריכת מוצר בחיוב חד-פעמי. - לוחצים על החץ שמאלה של אפשרות הרכישה
buy-movieשיצרתם קודם. ייפתח הדף עריכת אפשרות רכישה. - לוחצים על עריכת הזמינות והגישה ואז על הגדרת האזורים כזמינים עם אפשרות להזמין מראש.
- בתפריט הנפתח כל האזורים, בוחרים באפשרות מדינות ואזורים זמינים. אמור להופיע רק
United Statesשהגדרתם קודם. - בוחרים את המדינה ולוחצים על הגדרה כ'זמין להזמנה מראש בלבד'.
- לוחצים על שמירה.
שימו לב: עדיין לא הוספתם מבצע להזמנה מראש לאפשרות הרכישה. השלב הבא הוא הוספת מבצע להזמנה מראש.
הוספת מבצע להזמנה מראש
- פותחים את האפליקציה לדוגמה ב-Google Play Console ועוברים אל מוצרים חד-פעמיים > מוצרים > מונטיזציה באמצעות Play.
- בדף מוצרים חד-פעמיים, לוחצים על הוספת מבצע > הזמנה מראש למוצר הרצוי (
upcoming_movie_1). ייפתח הדף הוספת הזמנה מראש. - מזינים את פרטי ההזמנה מראש:
- מזהה ההזמנה מראש: מזינים
preorder-offer-1. - (אופציונלי) מוסיפים הנחה: אפשר לבחור באפשרות ללא, אחוז או סכום הנחה. לצורך ה-codelab הזה, בוחרים באפשרות ללא.
- (אופציונלי) תגים: מוסיפים תגים רלוונטיים.
- תאריך ושעת התחלה: מגדירים תאריך שחל לפחות 3 ימים בעתיד.
- תאריך ושעת סיום: מגדירים תאריך שחל לפחות 24 שעות אחרי תאריך ההתחלה.
- זמינות אחרי ההזמנה מראש: בוחרים אם המוצר יהיה זמין מיד אחרי תקופת ההזמנה מראש או בתאריך ובשעה ספציפיים מאוחרים יותר.
- (אופציונלי) התחייבות למחיר הנמוך ביותר: בוחרים באפשרות הזו אם רוצים שהמשתמשים יחויבו במחיר הנמוך מבין המחיר של ההזמנה מראש והמחיר במועד ההשקה. זה יכול להיות תמריץ משמעותי לקונים מוקדמים.
- מזהה ההזמנה מראש: מזינים
- לוחצים על שמירה.
- פותחים את הדף עריכת המוצר בחיוב חד-פעמי של המוצר בחיוב חד-פעמי (upcoming_movie_1).
- לוחצים על הפעלה באפשרות הרכישה של קנייה (
buy-movie). - לוחצים על הפעלה ליד המבצע להזמנה מראש (
preorder-offer-1) בקטע של אפשרות הרכישה של רכישת המוצר. המבצע להזמנה מראש יופעל ויהיה זמין בתאריך שהגדרתם קודם בפרטי ההזמנה מראש.
סרטון ליצירת מבצע להזמנה מראש
בסרטון הבא מוצגים השלבים ליצירת מבצע להזמנה מראש שמתוארים למעלה.
4. שילוב עם PBL
כדי לשלב את האפליקציה עם ספריית החיובים ב-Play (PBL), פועלים לפי השלבים הבאים:
- מוסיפים את התלות בספריית החיוב ב-Play לאפליקציית הדוגמה.
dependencies { val billing_version = "8.1.0" implementation("com.android.billingclient:billing-ktx:$billing_version") } - מאתחלים את BillingClient. BillingClient הוא ה-SDK של הלקוח שקיים באפליקציה שלכם ומתקשר עם ספריית החיובים ב-Play. בקטע הקוד הבא מוצג איך לאתחל את לקוח החיוב.
private BillingClient createBillingClient() { return BillingClient.newBuilder(activity) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) // For one-time products, add a listener to process and acknowledge the purchases. This will notify // Google the purchase was processed. // For client-only apps, use billingClient.acknowledgePurchase(). // If you have a secure backend, you must acknowledge purchases on your server using the // server-side API. // See https://developer.android.com/google/play/billing/security#acknowledge // In this sample snippet purchases aren't processed. You must // implement your business logic to process and acknowledge the purchases. .setListener((billingResult, purchases) -> {}) .enableAutoServiceReconnection() .build(); } - מתחברים ל-Google Play.בקטע הקוד הבא מוצג איך מתחברים ל-Google Play.
/** * Starts the billing connection with Google Play. This method should be called exactly once * before any other methods in this class. * * @param productList The list of products to query for after the connection is established. */ public void startBillingConnection(List<Product> productList) { billingClient.startConnection( new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { Log.d(TAG, "Billing Client Connection Successful"); queryProductDetails(productList); } else { Log.e(TAG, "Billing Client Connection Failed: " + billingResult.getDebugMessage()); listener.onBillingSetupFailed(billingResult); // Propagate the error to the listener to show a message to the user. } } @Override public void onBillingServiceDisconnected() { Log.e(TAG, "Billing Client Connection Lost"); listener.onBillingError("Billing Connection Lost"); } }); } - מאחזרים את פרטי המוצר החד-פעמיים.אחרי שמשלבים את האפליקציה עם PBL, צריך לאחזר את פרטי המוצר החד-פעמיים אל האפליקציה. בקטע הקוד הבא מוצג איך לאחזר את פרטי המוצר החד-פעמיים באפליקציה.
כשמבצעים אחזור של מוצר חד-פעמי (private void queryProductDetails(List<Product> productList) { QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { List<ProductDetails> productDetailsList = productDetailsResponse.getProductDetailsList(); listener.onProductDetailsResponse(productDetailsList); } else { Log.e(TAG, "QueryProductDetailsAsync Failed: " + billingResult.getDebugMessage()); listener.onBillingError("Query Products Failed: " + billingResult.getResponseCode()); } } }); }upcoming_movie_1בדוגמה הזו) ב-ProductDetails, מקבלים תגובה שדומה לזו: שימו לב שפרטי המבצע להזמנה מראש זמינים ב{ "productId": "upcoming_movie_1", "type": "inapp", "title": "Purrfect Mayhem: The Final Playback (Movies All Day | Play Samples)", "name": "Purrfect Mayhem: The Final Playback", "description": "Yolo and Thorne must reach the original broadcasting site to initiate the \"Final Playback\" and save the timeline. Follow them through their race against the Clockinators.", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 8500000, "priceCurrencyCode": "USD", "formattedPrice": "$8.50", "offerIdToken": "<---offerIdToken--->", "offerId": "preorder", "purchaseOptionId": "buy-option", "offerTags": [], "validTimeWindow": { "startTimeMillis": 1756771200000, "endTimeMillis": 1785542400000 }, "preorderDetails": { "preorderReleaseTimeMillis": 1785542400000, "preorderPresaleEndTimeMillis": 1785542400000 } } ] }oneTimePurchaseOfferDetailsList. ברשימה הזו יש אפשרות רכישה אחת (buy-option) שהוגדר עבורה מבצע להזמנה מראש ב-Play Console. אפשר לזהות כל אפשרות רכישה באופן ייחודי באמצעות offerIdToken. - מאחזרים את אסימון המבצע יחד עם פרטי המבצע להזמנה מראש. כדי להפעיל את תהליך החיוב בשלב 6, צריך את אסימון המבצע.
@Override public void onProductDetailsResponse(List<ProductDetails> productDetailsList) { if (productDetailsList != null && !productDetailsList.isEmpty()) { // 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(); } } } } } else { Log.e(TAG, "No product details found for " + productId); } } - מפעילים את תהליך החיוב.
/** * Launches the billing flow for the product with the given offer token. * * @param activity The activity instance from which the billing flow will be launched. * @param productDetails The product details of the product to purchase. * @param offerToken The offer token of the product to purchase. * @return The result of the billing flow. */ public void launchPurchase(Activity activity, ProductDetails productDetails, String offerToken) { ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build()); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); billingClient.launchBillingFlow(activity, billingFlowParams); }
5. בדיקת אפשרויות רכישה
לפני שמאפשרים לרכוש את המוצרים החד-פעמיים באפליקציה הפעילה, אפשר לבדוק את השילוב של PBL באמצעות בודקי רישיון וPlay Billing Lab.
כדי להבין איך אפשר לבדוק את אפשרויות הרכישה באמצעות Play Billing Lab, אפשר לעיין ב-codelab בנושא פתיחת שווקים חדשים באמצעות תמחור מוצרים לפי אזור.
6. השלבים הבאים
- איך מנתחים נטישות של רכישת מוצרים
- איך להגיע לשווקים חדשים באמצעות תמחור אזורי
- איך למקסם את השילוב של מערכת החיוב של Play
- חשוב לזכור לפעול לפי השיטות המומלצות לאימות ולעיבוד של רכישות בשרת העורפי המאובטח שלכם, ברגע שהמשתמשים מתחילים לקנות את המוצרים האלה.
מסמכי עזר
7. מעולה!
מעולה! הצלחת ליצור ב-Google Play Console מבצע להזמנה מראש של מוצר בחיוב חד-פעמי. עכשיו יש לכם הבנה מעמיקה יותר של קטלוג המוצרים הגמיש של Google Play לרכישות חד-פעמיות.
סקר
נשמח לקבל ממך משוב על ה-Codelab הזה. כדאי להקדיש כמה דקות למילוי הסקר שלנו.