פיתוח אפליקציית מימון המונים למובייל
לפני כמה שנים, אחת מפלטפורמות המימון ההמוני שלנו נתקלה בבעיה: בשעה האחרונה של קמפיין, מספר בקשות התמיכה המקבילות גדל פי עשרה, ומסד הנתונים לא יכול היה להתמודד עם העסקאות—חלק מהתשלומים נתקעו בסטטוס ממתין, ותומכים חוו חיובים כפולים. לאחר ביקורת, שכתבנו את מנגנון האישור והוספנו sharding לפי authorization hold. הטעות הזו עלתה ללקוח בנזק מוניטיני משמעותי—ועזרה לנו לחדד את הארכיטקטורה שבה אנו משתמשים כיום בכל הפרויקטים. במאמר זה, נבחן את המרכיבים המרכזיים שהופכים MVP לפלטפורמה ברמת ייצור: ממודלי escrow ועד תשלומים מהירים. אנו נשענים על ניסיון מ-50+ פתרונות fintech ו-marketplace, מעל 8 שנים בפיתוח מובייל, ורקורד של מסירת 50+ פרויקטים ברחבי העולם.
כיצד ליישם ניכוי כספים מותנה ואמין?
הכול או כלום (AoN) — כספים מנוכים רק כאשר היעד מושג. אם הקמפיין לא עומד ביעד, כל התשלומים מוחזרים. יישום: בעת תמיכה, אנו מבצעים capture על הכרטיס (כספים מוקפאים אך לא מחויבים). בהצלחת הקמפיין — void, בכישלון — # Stripe: создание PaymentIntent с capture_method=manual import stripe def back_project(user_id: str, project_id: str, amount: int, reward_tier_id: str) -> dict: payment_intent = stripe.PaymentIntent.create( amount=amount, currency="usd", capture_method="manual", # не списывать сразу metadata={ "user_id": user_id, "project_id": project_id, "reward_tier_id": reward_tier_id }, confirm=False # подтвердим на клиенте ) return {"client_secret": payment_intent.client_secret} def capture_all_backers(project_id: str): """Вызывается при успешном завершении кампании""" backers = db.get_backers(project_id, status="authorized") for backer in backers: stripe.PaymentIntent.capture(backer.payment_intent_id) db.update_backer_status(backer.id, "captured") def refund_all_backers(project_id: str): """Вызывается при провале кампании""" backers = db.get_backers(project_id, status="authorized") for backer in backers: stripe.PaymentIntent.cancel(backer.payment_intent_id) db.update_backer_status(backer.id, "cancelled") . ארכיטקטורת מסד הנתונים המפוצלת שלנו מתמודדת עם פי 10 יותר עסקאות מקבילות מאשר הגדרה מונוליטית רגילה.
# Stripe: создание PaymentIntent с capture_method=manual
import stripe
def back_project(user_id: str, project_id: str, amount: int, reward_tier_id: str) -> dict:
payment_intent = stripe.PaymentIntent.create(
amount=amount,
currency="usd",
capture_method="manual", # не списывать сразу
metadata={
"user_id": user_id,
"project_id": project_id,
"reward_tier_id": reward_tier_id
},
confirm=False # подтвердим на клиенте
)
return {"client_secret": payment_intent.client_secret}
def capture_all_backers(project_id: str):
"""Вызывается при успешном завершении кампании"""
backers = db.get_backers(project_id, status="authorized")
for backer in backers:
stripe.PaymentIntent.capture(backer.payment_intent_id)
db.update_backer_status(backer.id, "captured")
def refund_all_backers(project_id: str):
"""Вызывается при провале кампании"""
backers = db.get_backers(project_id, status="authorized")
for backer in backers:
stripe.PaymentIntent.cancel(backer.payment_intent_id)
db.update_backer_status(backer.id, "cancelled")בעיה: האישור על הכרטיס מוגבל בזמן — עבור Stripe זה 7 ימים לרוב הכרטיסים, מקסימום 31 ימיםתיעוד Stripe: "החזקות אישור". קמפיינים ארוכים מ-30 יום לא יכולים להחזיק את האישור לאורך כל התקופה. פתרון: חיוב מיידי (מודל Keep-it-All) או אישור מחדש זמן קצר לפני פקיעת התוקף.
Keep-it-All (KiA) — כספים מנוכים מיד בעת התמיכה, ללא קשר להשגת היעד. טכנית פשוט יותר, אך פחות אטרקטיבי עבור תומכים. פופולרי לפרויקטים צדקה ויצירתיים. לפי Statista, קמפיינים מסוג AoN מגייסים בממוצע 40% יותר כספים מאשר KiA, ולכן עבור פרויקטים מסחריים אנו ממליצים על המודל הראשון. שיעור ההצלחה לקמפיינים מסוג AoN הוא סביב 80% עבור פרויקטים מוכנים היטב.
| פרמטר | הכול או כלום | Keep-it-All |
|---|---|---|
| רגע החיוב | בהצלחת הקמפיין | מיד בעת התמיכה |
| אמון התומך | גבוה | בינוני |
| מורכבות היישום | גבוהה (אישור, פקיעות) | נמוכה |
| מתאים ל | פרויקטים מסחריים | צדקה, יצירתי |
מדוע AoN עדיף לפרויקטים גדולים?
לפי Stripe, כ-70% מקמפיינים מוצלחים של מימון המונים משתמשים ב-AoN. תומכים מרגישים בטוחים יותר בידיעה שהכסף שלהם לא יאבד אם היעד לא יושג.רמות תגמול
כל פרויקט מציע מספר רמות: "תמיכה" ב-$10, "גישה מוקדמת" ב-$50, "חבילה בלעדית" ב-$200. לכל רמה יש מספר מוגבל של מקומות ותפוסה נוכחית.
// iOS: экран выбора уровня вознаграждения
struct RewardTierView: View {
let tier: RewardTier
let onSelect: () -> Void
var body: some View {
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("$\(tier.amount)")
.font(.title2.bold())
Spacer()
if let limit = tier.backerLimit {
Text("\(tier.backerCount)/\(limit) поддержали")
.font(.caption)
.foregroundColor(tier.isSoldOut ? .red : .secondary)
}
}
Text(tier.title).font(.headline)
Text(tier.description).font(.body).foregroundColor(.secondary)
if let estimatedDelivery = tier.estimatedDelivery {
Label("Доставка: \(estimatedDelivery)", systemImage: "shippingbox")
.font(.caption)
}
Button(tier.isSoldOut ? "Разобрано" : "Выбрать уровень") {
if !tier.isSoldOut {
onSelect()
}
}
.disabled(tier.isSoldOut)
}
.padding()
.background(.regularMaterial)
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}מקומות מוגבלים דורשים נעילה פסימית על השרת: בעת עיבוד תמיכה, אנו נועלים את שורת // iOS: экран выбора уровня вознаграждения struct RewardTierView: View { let tier: RewardTier let onSelect: () -> Void var body: some View { VStack(alignment: .leading, spacing: 8) { HStack { Text("$\(tier.amount)") .font(.title2.bold()) Spacer() if let limit = tier.backerLimit { Text("\(tier.backerCount)/\(limit) поддержали") .font(.caption) .foregroundColor(tier.isSoldOut ? .red : .secondary) } } Text(tier.title).font(.headline) Text(tier.description).font(.body).foregroundColor(.secondary) if let estimatedDelivery = tier.estimatedDelivery { Label("Доставка: \(estimatedDelivery)", systemImage: "shippingbox") .font(.caption) } Button(tier.isSoldOut ? "Разобрано" : "Выбрать уровень") { if !tier.isSoldOut { onSelect() } } .disabled(tier.isSoldOut) } .padding() .background(.regularMaterial) .clipShape(RoundedRectangle(cornerRadius: 12)) } } כדי לבדוק ולהפחית את המונה בעסקה אחת.
התקדמות הקמפיין ומכניקות חברתיות
דף הפרויקט הוא התוכן המרכזי. פס התקדמות המציג כספים שגויסו, ספירה לאחור לסוף הקמפיין, עדכונים מהמחבר, ותגובות תומכים.
מבחינה טכנית, הרגע העמוס ביותר: היום האחרון של הקמפיין. כל התומכים בודקים את ההתקדמות בו זמנית. WebSocket לעדכונים בזמן אמת או polling אגרסיבי (כל 10 שניות בשעות האחרונות) — עם מטמון CDN.
// Android: WebSocket для живого обновления прогресса
class CampaignProgressViewModel(
private val campaignId: String,
private val wsClient: WebSocketClient
) : ViewModel() {
val progress = MutableStateFlow<CampaignProgress?>(null)
init {
wsClient.connect("wss://api.yourplatform.com/campaigns/$campaignId/live")
viewModelScope.launch {
wsClient.messages.collect { message ->
val update = json.decodeFromString<CampaignProgressUpdate>(message)
progress.value = update.progress
}
}
}
override fun onCleared() {
wsClient.disconnect()
}
} עדכוני פרויקט ותקשורת עם תומכים
המחבר מפרסם עדכונים על ההתקדמות. תומכים מקבלים התראות push עבור כל עדכון חדש. פילוח: הודעה רק לאלה שתמכו בפרויקט הספציפי. שיעורי פתיחה להתראות push ממוקדות עומדים בממוצע על 25%.
הודעות מבוססות נושאים ב-FCM אינן מתאימות לכך — אנו זקוקים לשידורים ממוקדים דרך רשימת נמענים בצד השרת. עבור כל פרויקט, אנו שומרים רשימה של reward_tier של התומכים.
כיצד פועל אימות המחבר (KYC) ומדוע הוא קריטי?
גיוס כספים פומבי מושך פרויקטים הונאתיים. הגנה בסיסית:
- ניהול ידני של פרויקטים חדשים לפני פרסום — 90% מהפרויקטים עוברים תוך 24 שעות.
- אימות זהות המחבר באמצעות KYC (דרכון + סלפי) — חובה למשיכת כספים. זה מפחית הגשות הונאתיות ב-70% בהשוואה לפלטפורמות ללא בדיקות זהות.
- מגבלות משיכה אוטומטיות עד לאישור KYC.
תהליך האימות שלב אחר שלב:
- המחבר ממלא את הפרופיל שלו באפליקציה.
- לוחץ על "אימות" — המערכת מייצרת accessToken עבור ספק ה-KYC.
- SDK מקורי (Sumsub, Veriff, או Onfido) נפתח, שבו המחבר מצלם את הדרכון שלו וסלפי.
- ה-SDK שולח נתונים לספק, שבודק את המסמכים ומחזיר סטטוס.
- אם הסטטוס הוא
// Android: WebSocket для живого обновления прогресса class CampaignProgressViewModel( private val campaignId: String, private val wsClient: WebSocketClient ) : ViewModel() { val progress = MutableStateFlow<CampaignProgress?>(null) init { wsClient.connect("wss://api.yourplatform.com/campaigns/$campaignId/live") viewModelScope.launch { wsClient.messages.collect { message -> val update = json.decodeFromString<CampaignProgressUpdate>(message) progress.value = update.progress } } } override fun onCleared() { wsClient.disconnect() } }, המחבר יכול לבקש משיכה. אםdevice_tokens, הוא נשלח לאימות חוזר עם הערה.
אינטגרציה עם ספקי KYC: Sumsub, Veriff, Onfido. אפליקציית המובייל יוזמת KYC דרך ה-SDK של הספק — כל התהליך בממשק מקורי. אנו מבטיחים אבטחת מידע — כל ה-SDKs מוסמכים.
// iOS: Sumsub KYC flow
import IdensicMobileSDK
let sdk = SNSMobileSDK.build(
accessToken: kycAccessToken
)
.withHandlers(
onStatusDidChange: { [weak self] sdk, prevStatus in
if sdk.mainState == .approved {
self?.onKYCApproved()
}
},
onEvent: { sdk, event in
}
)
.assemble()
sdk.present(from: self) משיכות למחברים
לאחר קמפיין מוצלח, המחבר רוצה לגשת לכסף. תהליך המשיכה:
- KYC עבר → יכול לבקש משיכה
- הפלטפורמה מנכה את העמלה שלה (בדרך כלל 6–8%)
- היתרה נמשכת דרך Stripe Connect (תשלום לחשבון בנק) או העברה בינלאומית
Stripe Connect הוא הסטנדרט עבור marketplaces עם משיכות. כל מחבר הוא חשבון מחובר נפרד.
מה כוללת העבודה שלנו
- ניתוח דרישות ועיצוב ארכיטקטוני
- פיתוח ל-iOS (Swift 5.9+, SwiftUI) ואנדרואיד (Kotlin, Jetpack Compose)
- אינטגרציה של תשלומים (Stripe, Braintree) וספקי KYC
- הגדרת התראות push (FCM/APNs), deep linking, App Tracking Transparency
- ניהול תוכן ואלגוריתמים נגד הונאות
- פריסה ל-App Store ו-Google Play, בדיקות ותמיכה
מה אתה מקבל (תוצרים)
- תיעוד טכני (מפרטי API, דיאגרמות ארכיטקטורה)
- קוד מקור מלא עם צינורות CI/CD
- פאנל ניהול לניהול פרויקטים ואנליטיקה
- הדרכה למנהלים על שימוש בפאנל
- תמיכה לאחר השקה למשך 3 חודשים, כולל תיקוני באגים וניטור ביצועים
ציר זמן פיתוח לאפליקציית מימון המונים למובייל
| היקף | משך |
|---|---|
| גרסה בסיסית: גלישה בפרויקטים, תמיכה, תשלום, היסטוריה | 6–8 שבועות |
| לוח מחברים: יצירת פרויקט, עדכונים, אנליטיקה | +3–4 שבועות |
| הכול או כלום עם escrow ולכידה/החזר אוטומטיים | +2 שבועות |
| KYC ותשלום Stripe Connect | +2–3 שבועות |
פתרון מלא כולל כל התכונות אורך בדרך כלל 12–16 שבועות. עלות הפיתוח ל-MVP בסיסי מתחילה ב-$75,000. אנו מספקים הערכה חינמית לאחר ניתוח הדרישות שלך.
עם ניסיון של 8+ שנים ו-50+ פרויקטים פינטק שנמסרו, הצוות שלנו מבטיח פתרונות חזקים וניתנים להרחבה. צור קשר להערכה חינמית וציר זמן — אנו מציעים פיתוח מקצה לקצה, מארכיטקטורה ועד פריסה, ומטפלים בפרויקט שלך במפתח אחד.







