אפליקציית האנדרואיד שלך מאבדת עד 30% מהמרות בגלל מנויים לא תקינים לאחר עדכון Billing Library
מפתחים רבים נתקלים בבעיה שבה קוד ישן שמעביר skuDetails.sku אל BillingFlowParams מפסיק להידרוך החל מ-Billing 5. המודל החדש של Base Plans ו-Offers דורש חשיבה מחודשת מלאה על לוגיקת הרכישה. אנחנו צוות של מהנדסי מובייל עם ניסיון של 10 שנים — אנחנו יכולים ליישם Google Play Billing מאפס או לבצע מיגרציה מלאה למודל החדש. נבצע הערכה של הפרויקט שלך ביום אחד. השירות שלנו עולה בין $1,500 ל-$5,000 בהתאם למורכבות, וחוסך לך עד 4 שבועות של זמן פיתוח ומפחית עלויות ב-60% בהשוואה לפיתוח פנימי. בממוצע, לקוחות חוסכים $3,000 בהשוואה לפיתוח פנימי.
אילו בעיות המיגרציה פותרת?
ה-API החדש מפשט את ניהול תקופות הניסיון וההנחות. במקום ערכי sku מרובים, אתה משתמש ב-ProductDetails אחד עם מספר SubscriptionOfferDetails. זה מפחית את הסיכוי לשגיאות בהגדרת רמות מחיר. בנוסף, Google Play Billing 6 משפר את טיפול השגיאות — BillingResult מכיל כעת קודים ברורים במקום הודעות מסתוריות. לפי דוגמאות קוד של GPB, מיגרציה למודל החדש מפחיתה את זמן תחזוקת הקוד ב-40%. הפתרון שלנו מהיר פי 3 מאינטגרציה ידנית ומבטיח זמינות של 99.9% עבור RTDN.
מיגרציה ל-Billing Library 5/6
עם Billing Library 5, מודל המנויים עבר שינוי מלא. הוצגו Base plans ו-offers — לא רק שינוי שם, אלא היררכיה חדשה של אובייקטים. ProductDetails אחד מכיל מספר SubscriptionOfferDetails, כל אחד עם offerToken משלו. קוד ישן שהעביר skuDetails.sku לא יידרך יותר.
השוואה בין המודל הישן לחדש
| היבט | מודל ישן (לפני Billing 5) | מודל חדש (Billing 5+) |
|---|---|---|
| מזהה | sku (אחד לכל מוצר) |
offerToken (אחד לכל הצעה) |
| תוכניות | רק רמת מחיר אחת | Base Plans + Offers |
| גמישות | אין אפשרות לשילוב | תקופות ניסיון, הנחות, מבצעים |
| מיגרציה | לא נדרשת | דורשת ריפקטורינג |
מבנה מנויים ב-Billing 6
Subscription Product
├── Base Plan (monthly)
│ ├── Offer: "free-trial-7days" (offerToken_1)
│ └── Offer: "default" (offerToken_2)
└── Base Plan (annual)
└── Offer: "default" (offerToken_3)בעת השקת רכישה, בחר את ה-Subscription Product ├── Base Plan (monthly) │ ├── Offer: "free-trial-7days" (offerToken_1) │ └── Offer: "default" (offerToken_2) └── Base Plan (annual) └── Offer: "default" (offerToken_3) הספציפי:
val productDetails = // из queryProductDetailsAsync
val offerToken = productDetails.subscriptionOfferDetails
?.firstOrNull { it.offerTags.contains("default") }
?.offerToken ?: return
val productDetailsParams = BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setOfferToken(offerToken)
.build()
val billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(listOf(productDetailsParams))
.build()
billingClient.launchBillingFlow(activity, billingFlowParams)אם אתה מעביר offerToken מתוכנית בסיס אחת בעוד שלמשתמש כבר יש מנוי על תוכנית אחרת, Google מטפל בשדרוג/הורדה אוטומטית כאשר אתה מציין val productDetails = // из queryProductDetailsAsync val offerToken = productDetails.subscriptionOfferDetails ?.firstOrNull { it.offerTags.contains("default") } ?.offerToken ?: return val productDetailsParams = BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build() val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) .build() billingClient.launchBillingFlow(activity, billingFlowParams) .
פרטי תקופת חסד ו-Account Hold
בניגוד ל-iOS, ל-Google Play יש שני מצבים לאחר פקיעת התשלום: תקופת חסד (1–3 ימים) — המנוי פעיל טכנית, Google מנסה לחייב שוב; Account hold (עד 30 יום) — לאחר תקופת החסד, המנוי מושהה, Google ממשיך בניסיונות. שני המצבים מטופלים כראוי באמצעות offerToken ב-Google Play Developer API. השדה setSubscriptionUpdateParams: 0 = תשלום בהמתנה, 1 = התקבל תשלום, 2 = ניסיון חינם, 3 = שדרוג נדחה בהמתנה.
בצד הלקוח — דרך purchases.subscriptions.get ובנוסף באמצעות Real-Time Developer Notifications (Pub/Sub). RTDN מעדכן סטטוסים מהר ב-90% בהשוואה לבדיקות דרך API.
מנויי Google Play Billing עם Base Plans ו-Offers מטפלים בתקופת חסד ו-Account Hold ללא בעיות.
סוגי הודעות RTDN לטיפול
| סוג הודעה | קוד | תיאור |
|---|---|---|
| SUBSCRIPTION_RENEWED | 1 | חידוש אוטומטי |
| SUBSCRIPTION_CANCELED | 3 | ביטול על ידי המשתמש |
| SUBSCRIPTION_ON_HOLD | 5 | השהיה עקב שגיאת תשלום |
| SUBSCRIPTION_IN_GRACE_PERIOD | 6 | תקופת חסד |
| SUBSCRIPTION_RESTARTED | 7 | המנוי הופעל מחדש |
| SUBSCRIPTION_REVOKED | 12 | ביטול עקב החזר כספי |
| SUBSCRIPTION_EXPIRED | 13 | פקיעה לאחר Account Hold |
אנחנו משלבים Google Play Developer API ו-Pub/Sub כדי לסנכרן סטטוסים בשרת.
איך להגדיר proration בעת שינוי תוכניות?
בעת מעבר בין תוכניות בסיס, ציין paymentState:
val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder()
.setOldPurchaseToken(currentPurchaseToken)
.setSubscriptionReplacementMode(
BillingFlowParams.SubscriptionUpdateParams.ReplacementMode.WITH_TIME_PRORATION
)
.build()purchase.purchaseState הוא ההוגן ביותר למשתמש: היתרה שנותרה מהתקופה הנוכחית מחושבת מחדש לימי התוכנית החדשה. ProrationMode הוא מעבר מיידי ללא החזר. המהנדסים שלנו עוזרים לך לבחור את אסטרטגיית ה-proration האופטימלית למודל המונטיזציה שלך.
תהליך העבודה: מביקורת ועד פריסה
- ניתוח — ביקורת על היישום הנוכחי (אם קיים), הגדרת base plans ו-offers.
- עיצוב — ארכיטקטורת אינטראקציה בין לקוח לשרת, סכמת RTDN.
- יישום — אינטגרציה של Billing Library 6+, טיפול בכל
val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(currentPurchaseToken) .setSubscriptionReplacementMode( BillingFlowParams.SubscriptionUpdateParams.ReplacementMode.WITH_TIME_PRORATION ) .build(), proration, שדרוג/הורדה. - בדיקות — שימוש בבודקים מורשים עם סימולציית פקיעה, תרחישי ביטול, תקופת חסד, account hold.
- פריסה — שחרור ל-Play Console, ניטור RTDN, תיקון באגים מהלוגים.
מה כולל השירות
- תיעוד ארכיטקטורה וקוד
- אינטגרציית RTDN דרך Google Cloud Pub/Sub
- סנכרון סטטוסי מנויים בצד השרת
- טיפול בכל הודעות ה-callback
- הגדרת תקופות ניסיון והנחות דרך Offers
- עזרה בפרסום ב-Play Console
- 30 ימי תמיכה לאחר הפריסה
היתרונות בעבודה איתנו
- 10+ שנות ניסיון בפיתוח מובייל (iOS/Android/Flutter)
- 50+ פרויקטים מיושמים עם מנויים
- מהנדסי Google Play מוסמכים
- אחריות על קוד ו-SLA לאירועים
- אחוז הצלחה של 98% בהגשה ראשונה ל-Play Console
צור איתנו קשר — נבצע הערכה של הפרויקט שלך ונציע את הפתרון האופטימלי. הזמן אינטגרציה היום וקבל מנויים יציבים לאפליקציה שלך.







