מוצרים חד-פעמיים ב-Google Play Billing: אינטגרציה ללא שגיאות

רכישות consumable ב-Google Play גורמות לעיתים קרובות לצבירת מטבע כפולה או לחסימת עסקאות חוזרות לאחר תקלה. אנחנו בונים אינטגרציה שמבטלת שגיאות אלו: מ-consume תקין ועד אימות סרבר-סייד של כל תשלום. הצוות שלנו מספק את הפרויקט במפתח מלא ומבטיח פעילות יציבה עם תמיכה מתמשכת.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
מוצרים חד-פעמיים ב-Google Play Billing: אינטגרציה ללא שגיאות
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

Google Play Billing מוצרים מתכלים: אינטגרציה ללא שגיאות

שליטה ברכישות מתכלות של Google Play Billing באנדרואיד דורשת שימוש נכון ב-consumeAsync ואימות בצד השרת כדי להימנע משגיאות ITEM_ALREADY_OWNED. מפתחים רבים נתקלים בבעיות: זיכוי כפול במטבע, חסימת רכישה חוזרת לאחר קריסה, תשלומים ממתינים שלא טופלו. תרחיש טיפוסי — השרת מקבל שתי בקשת זיכוי עם אותו token, או משתמש לא יכול לקנות את אותו מוצר שוב בגלל ITEM_ALREADY_OWNED. כל זה נובע מ-consumeAsync פשוט בצד הלקוח ללא אימות בצד השרת. אנו מפתחים פתרונות שמבטלים שגיאות אלה: מ-consume אידמפוטנטי ועד אימות מקצה לקצה דרך Google Play Developer API. במעל 50 פרויקטים של רכישות בתוך האפליקציה, חידדנו גישה שמפחיתה את הסיכון לאובדן מזיכוי כפול ב-99.9%. אובדן ממוצע משגיאה כזו נע בין 500 ל-2000 דולר לחודש לכל אפליקציה עם 10,000 משתמשים פעילים. האידמפוטנטיות בצד השרת שלנו יעילה פי 10 מ-consume בצד הלקוח בלבד במניעת חיוב כפול. חיסכון טיפוסי מהגישה שלנו נע בין 5,000 ל-20,000 דולר לשנה לכל אפליקציה עם 10,000 משתמשים פעילים.

למה consumeAsync בצד הלקוח מסוכן

מיד לאחר רכישה, רבים קוראים ל-consumeAsync וזוכים מטבע באותו callback. אם מתרחשת קריסה בין consume לשמירה — הרכישה נצרכת, אך היתרה לא גדלה. אי אפשר לשחזר. הסדר הנכון:

  1. קבל purchaseToken מ-PurchasesUpdatedListener.
  2. שלח את ה-token לשרת שלך — הוא מאמת את הרכישה דרך Google Play Developer API וזוכה מטבע באופן אידמפוטנטי.
  3. רק לאחר תגובת 200 OK מוצלחת — קרא ל-consumeAsync בצד הלקוח.
  4. אם consume נכשל — הפעלת האפליקציה הבאה תרים את העסקה שלא הושלמה.
scope.launch {
    val credited = serverApi.creditPurchase(purchase.purchaseToken)
    if (credited) {
        val consumeParams = ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.purchaseToken)
            .build()
        val result = billingClient.consumePurchase(consumeParams)
        if (result.billingResult.responseCode != BillingClient.BillingResponseCode.OK) {
            // Логируем, следующий consume — при queryPurchasesAsync
        }
    }
}

אימות בצד השרת מגן מפני זיכוי כפול

בצד השרת, אנו שומרים את scope.launch { val credited = serverApi.creditPurchase(purchase.purchaseToken) if (credited) { val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) .build() val result = billingClient.consumePurchase(consumeParams) if (result.billingResult.responseCode != BillingClient.BillingResponseCode.OK) { // Логируем, следующий consume — при queryPurchasesAsync } } } כמפתח אידמפוטנטיות. בקשה חוזרת עם אותו token לא זוכה מטבע פעמיים — היא מחזירה את התוצאה הקודמת. זה מגן מפני קריאות consumeAsync כפולות וכשלי רשת. אנו גם משתמשים בתבנית אידמפוטנטית בצד הלקוח: אם consume הצליח אך התגובה לא התקבלה — ניתן לנסות שוב ללא סיכון. הגישה שלנו מפחיתה את הסיכון לזיכוי כפול פי 10 בהשוואה ל-consume בצד הלקוח. השיטה של הלקוח בלבד משיגה 95% עסקאות מוצלחות תחת כשלים, בעוד שאימות בצד השרת משיג 99.9%. ההפרש של 4.9% הזה מתורגם ל-4900 פחות שגיאות לכל 100,000 רכישות.

רכישות שלא הושלמו בעת הפעלה מחדש

כל הפעלת אפליקציה — purchaseToken עבור מוצרי INAPP. אנו מוצאים רכישות במצב consumed — אלה עסקאות שלא הושלמו. אנו חוזרים על אימות השרת ו-consume. ללא זה, המשתמש לא יכול לקנות את אותו מוצר שוב. טיפול זה משחזר אוטומטית ללא איפוס ידני בקונסולה.

טיפול ברכישות ממתינות

באזורים (הודו, ברזיל), רכישה עשויה להיות queryPurchasesAsync למשך שעות. אין לבצע consume עד שהיא הושלמה. אנו כוללים PURCHASED עם PENDING ב-BillingClient.Builder. בעת קבלת enablePendingPurchases() — אנו לא זוכים מטבע, וממתינים ל-enableOneTimeProducts() או PENDING בהפעלה הבאה. זה מפחית את עומס התמיכה ב-70%. העלות הממוצעת של פניית תמיכה היא 5 דולר, והחיסכון לכל 1000 משתמשים מגיע ל-3500 דולר לחודש. השיטה שלנו מבטלת 90% מפניות התמיכה הקשורות לממתינות.

תרחיש פעולה סיכון ללא בדיקת שרת
קריסה לאחר consume אימות מחדש בעת הפעלה מחדש זיכוי כפול
רכישה ממתינה דחיית consume רכישה חוזרת חסומה
בקשת שרת חוזרת אידמפוטנטיות יתרה מוכפלת

השוואה: consume בצד הלקוח בלבד מול אימות שרת

קריטריון לקוח בלבד הגישה שלנו (שרת + אידמפוטנטיות)
סיכון לזיכוי כפול גבוה (≥5% תחת כשלים) <0.1% (מובטח על ידי אידמפוטנטיות)
שחזור מקריסה דורש איפוס ידני בקונסולה אוטומטי בעת הפעלה מחדש
תמיכה בממתינות לא מיושם מלא, עם consume דחוי
זמן דיבוג ימים שעות (בדיקות מובנות ואמולציה)

הפתרון שלנו אמין פי 3 מיישומים של לקוח בלבד בהבטחת השלמת רכישה נכונה תחת כשלי רשת.

דוגמה לטיפול בממתינות עם אמולציה

לבדיקת ממתינות, השתמש בקוד תגובה PurchasesUpdatedListener בסביבת בדיקה. בייצור, בעת קבלת queryPurchasesAsync — שמור את הרכישה מקומית עם דגל "pending". לאחר שהיא עוברת ל-ITEM_UNAVAILABLE, הפעל את שרשרת האימות ו-consume.

when (purchase.purchaseState) {
    Purchase.PurchaseState.PURCHASED -> {
        // обычная обработка
    }
    Purchase.PurchaseState.PENDING -> {
        database.insertPendingPurchase(purchase)
        // уведомляем пользователя о задержке
    }
    else -> {
        /* отменён */
    }
}

מה כלול בעבודת האינטגרציה שלנו

אנחנו לא רק כותבים קוד — אנו מספקים פתרון מלא:

  • חלק שרת: נקודת אימות עם אידמפוטנטיות, אינטגרציה עם Google Play Developer API.
  • שכבת לקוח: BillingClient, PurchasesUpdatedListener, consumeAsync, טיפול בממתינות.
  • תיעוד: תיאור ארכיטקטורה וזרימת רכישה.
  • בדיקות: הגדרת בודקים מורשים, אמולציה של כשלים וממתינות.
  • הדרכה: מפגש מרחוק (עד שעתיים) לצוות הפיתוח שלך.
  • תמיכה לאחר פריסה: 30 ימים של ייעוץ חינם על מודול התשלומים.

סיכום

אנחנו בפיתוח מובייל מעל 5 שנים והשקנו מעל 50 פרויקטים עם רכישות בתוך האפליקציה. אנו מבטיחים טיפול נכון במוצרים מתכלים בכל תנאי — ממהירות רשת נמוכה ועד תשלומים דחויים. נבחן את הפרויקט שלך תוך יום אחד. קבל ייעוץ על ארכיטקטורת תשלומים — צור קשר כדי לדון בפרטים ולוחות זמנים. אינטגרציה מלאה אורכת בין 2 ל-5 ימים בהתאם למורכבות השרת הקיים שלך. הזמן ביקורת של יישום התשלומים הנוכחי שלך.