שילוב Stripe Billing למנויי SaaS
אתה משיק SaaS; לאחר חודש, יש לך 1000 משתמשים, כל אחד בתוכנית שונה, חלקם בתקופת ניסיון, חלקם מבטלים. ללא מערכת חיוב, מתחיל כאוס. Stripe Billing הוא פתרון מוכן שמכסה 95% מהתרחישים: מנויים, תקופות ניסיון, שדרוגים/הורדות, חיוב יחסי, שימוש מדוד, ניסיון חוזר אוטומטי במקרה של כשל תיעוד Stripe. בהשוואה למערכת שנבנית בהתאמה אישית, Stripe Billing מקצר את זמן הפיתוח מ-2–3 חודשים לשבוע עד שבועיים — זה פי 5–10 מהר יותר. זה גם ממזער שגיאות באמצעות אלגוריתמים מוכחים. אתה חוסך לפחות $15,000 בפיתוח ו-$5,000 בשנה בתמיכה. שילבנו את Stripe ביותר מ-30 פרויקטים, ומבטיחים חיוב יציב מקצה לקצה. הניסיון שלנו מאפשר לנו לחזות ולהימנע מבעיות טיפוסיות: טיפול שגוי בתקופות ניסיון, שגיאות בחיוב יחסי, כשלים ב-webhook.
מהם הגורמים המרכזיים ב-Stripe Billing?
Product → Price → Subscription → Invoice → PaymentIntent. מוצר מייצג תוכנית (Basic, Pro, Enterprise). מחירים מחוברים (חודשי/שנתי). מנוי מקשר לקוח למחיר. חשבוניות נוצרות אוטומטית. Stripe מטפל בכל המשימות השגרתיות: יצירת חשבוניות, ניסיונות תשלום, חיוב יחסי, תקופות ניסיון. אתה רק צריך להגדיר מוצרים ו-webhooks כדי לסנכרן סטטוסים. זה מקצר את זמן הפיתוח מחודשים לשבוע עד שבועיים.
שלבי יישום
שלב 1: יצירת מוצרים ומחירים
$product = \Stripe\Product::create([
'name' => 'Pro Plan',
'metadata' => ['plan_id' => 'pro'],
]);
$monthlyPrice = \Stripe\Price::create([
'product' => $product->id,
'unit_amount' => 2900,
'currency' => 'usd',
'recurring' => ['interval' => 'month'],
'lookup_key' => 'pro_monthly',
]);
$yearlyPrice = \Stripe\Price::create([
'product' => $product->id,
'unit_amount' => 27900,
'currency' => 'usd',
'recurring' => ['interval' => 'year'],
'lookup_key' => 'pro_yearly',
]); שלב 2: רישום משתמש ויצירת מנוי
זה כולל ארבעה שלבי משנה: יצירת לקוח Stripe, יצירת מנוי עם תקופת ניסיון, העברת $product = \Stripe\Product::create([ 'name' => 'Pro Plan', 'metadata' => ['plan_id' => 'pro'], ]); $monthlyPrice = \Stripe\Price::create([ 'product' => $product->id, 'unit_amount' => 2900, 'currency' => 'usd', 'recurring' => ['interval' => 'month'], 'lookup_key' => 'pro_monthly', ]); $yearlyPrice = \Stripe\Price::create([ 'product' => $product->id, 'unit_amount' => 27900, 'currency' => 'usd', 'recurring' => ['interval' => 'year'], 'lookup_key' => 'pro_yearly', ]); לפרונטאנד, ועיבוד webhooks.
$stripeCustomer = \Stripe\Customer::create([
'email' => $user->email,
'name' => $user->name,
'metadata' => ['user_id' => $user->id],
]);
$subscription = \Stripe\Subscription::create([
'customer' => $user->stripe_customer_id,
'items' => [['price' => 'pro_monthly']],
'trial_period_days' => 14,
'payment_behavior' => 'default_incomplete',
'payment_settings' => ['save_default_payment_method' => 'on_subscription'],
'expand' => ['latest_invoice.payment_intent'],
]);
$clientSecret = $subscription->latest_invoice->payment_intent->client_secret;$stripeCustomer = \Stripe\Customer::create([ 'email' => $user->email, 'name' => $user->name, 'metadata' => ['user_id' => $user->id], ]); $subscription = \Stripe\Subscription::create([ 'customer' => $user->stripe_customer_id, 'items' => [['price' => 'pro_monthly']], 'trial_period_days' => 14, 'payment_behavior' => 'default_incomplete', 'payment_settings' => ['save_default_payment_method' => 'on_subscription'], 'expand' => ['latest_invoice.payment_intent'], ]); $clientSecret = $subscription->latest_invoice->payment_intent->client_secret; פירושו שהמנוי מופעל רק לאחר תשלום ראשון מוצלח. חשוב לתקופות ניסיון חינמיות: הכרטיס מחובר אך לא מחויב.
שלב 3: טיפול בשדרוגים, הורדות וחיוב מדוד
שדרוג/הורדה עם חיוב יחסי
public function changePlan(User $user, string $newPriceLookupKey): void
{
$prices = \Stripe\Price::all(['lookup_keys' => [$newPriceLookupKey]]);
$newPrice = $prices->data[0];
$subscription = \Stripe\Subscription::retrieve($user->stripe_subscription_id);
\Stripe\Subscription::update($subscription->id, [
'items' => [[
'id' => $subscription->items->data[0]->id,
'price' => $newPrice->id,
]],
'proration_behavior' => 'create_prorations',
'billing_cycle_anchor' => 'unchanged',
]);
}בשדרוג, Stripe מזכה אוטומטית זמן שלא נוצל ומנפיק חשבונית עבור ההפרש. למנויים שנתיים, השתמש ב-payment_behavior: default_incomplete.
חיוב מדוד לתמחור מבוסס שימוש (קריאות API, אחסון):
protected array $handlers = [
'customer.subscription.created' => 'onSubscriptionCreated',
'customer.subscription.updated' => 'onSubscriptionUpdated',
'customer.subscription.deleted' => 'onSubscriptionCancelled',
'invoice.payment_succeeded' => 'onInvoicePaid',
'invoice.payment_failed' => 'onInvoicePaymentFailed',
'customer.subscription.trial_will_end'=> 'onTrialEndingSoon',
];
public function onInvoicePaymentFailed(array $event): void
{
$subscription = $event['data']['object']['subscription'];
$user = User::where('stripe_subscription_id', $subscription)->firstOrFail();
$nextRetry = $event['data']['object']['next_payment_attempt'];
Notification::send($user, new PaymentFailedNotification($nextRetry));
}public function changePlan(User $user, string $newPriceLookupKey): void { $prices = \Stripe\Price::all(['lookup_keys' => [$newPriceLookupKey]]); $newPrice = $prices->data[0]; $subscription = \Stripe\Subscription::retrieve($user->stripe_subscription_id); \Stripe\Subscription::update($subscription->id, [ 'items' => [[ 'id' => $subscription->items->data[0]->id, 'price' => $newPrice->id, ]], 'proration_behavior' => 'create_prorations', 'billing_cycle_anchor'=> 'unchanged', ]); } קובע ערך מוחלט; proration_behavior: none מוסיף לערך הנוכחי. customer.subscription.paused בטוח יותר בניסיון חוזר.
שלב 4: שילוב פורטל לקוחות לשירות עצמי
פורטל הלקוחות של Stripe מספק ממשק מוכן לניהול מנויים: שינוי כרטיסים, ביטול, צפייה בחשבוניות. אין צורך לבנות מאפס. פשוט צור resumed והפנה את המשתמש. זה חוסך עד 40 שעות של פיתוח ממשק, שבמחיר של $100 לשעה שווה חיסכון של $4,000.
שלב 5: הגדרת Webhooks לסנכרון סטטוסים
כל הלוגיקה העסקית מבוססת על webhooks, לא על תשובות API סינכרוניות. אירועים ופעולות מרכזיים:
| אירוע | פעולה |
|---|---|
protected array $handlers = [ 'customer.subscription.created' => 'onSubscriptionCreated', 'customer.subscription.updated' => 'onSubscriptionUpdated', 'customer.subscription.deleted' => 'onSubscriptionCancelled', 'invoice.payment_succeeded' => 'onInvoicePaid', 'invoice.payment_failed' => 'onInvoicePaymentFailed', 'customer.subscription.trial_will_end'=> 'onTrialEndingSoon', ]; public function onInvoicePaymentFailed(array $event): void { $subscription = $event['data']['object']['subscription']; $user = User::where('stripe_subscription_id', $subscription)->firstOrFail(); $nextRetry = $event['data']['object']['next_payment_attempt']; Notification::send($user, new PaymentFailedNotification($nextRetry)); } |
שמור past_due, הפעל משתמש |
canceled |
עדכן סטטוס במסד הנתונים |
$price = \Stripe\Price::create([ 'product' => $product->id, 'currency' => 'usd', 'recurring' => [ 'interval' => 'month', 'usage_type' => 'metered', 'aggregate_usage'=> 'sum', ], 'billing_scheme' => 'per_unit', 'unit_amount' => 1, ]); \Stripe\SubscriptionItem::createUsageRecord( $subscriptionItemId, ['quantity' => $apiCallsThisPeriod, 'action' => 'set'] ); |
סמן כבוטל |
action: set |
עדכן תאריך increment |
set |
הודע למשתמש, אל תחסום מיד |
idempotency_key |
הזכר על חיוב קרוב |
טפל גם ב-invoice.payment_failed ו-resumed אם אתה תומך בהשהיה.
$price = \Stripe\Price::create([
'product' => $product->id,
'currency' => 'usd',
'recurring' => [
'interval' => 'month',
'usage_type' => 'metered',
'aggregate_usage' => 'sum',
],
'billing_scheme' => 'per_unit',
'unit_amount' => 1,
]);
\Stripe\SubscriptionItem::createUsageRecord(
$subscriptionItemId,
['quantity' => $apiCallsThisPeriod, 'action' => 'set']
);לאינטגרציה מאובטחת, עקוב אחר רשימת הבדיקה הזו:
- אמת את חתימת האירוע (כותרת Webhook-Signature).
- השתמש ב-idempotency_key בעת יצירת מנויים.
- תעד את כל ה-webhooks לצורך ניפוי שגיאות.
- הוסף נקודת בדיקת בריאות לניטור.
- בדוק תרחישים: תשלום מוצלח, כשל, תקופת ניסיון, שדרוג.
כיצד לטפל בתשלומים שנכשלו?
Stripe מבצע אוטומטית עד 3 ניסיונות חוזרים במרווחים של 2, 3 ו-5 ימים. התפקיד שלך הוא להודיע למשתמש ולעדכן את סטטוס המנוי ל-past_due. לאחר הכשל השלישי, המנוי עובר ל-canceled. כדי להימנע מאובדן לקוחות, יישם תרחיש: כשל ראשון — אימייל, שני — התראת push, שלישי — חסימת גישה עם אפשרות חידוש. הודעה בזמן מפחיתה נטישה ב-20% בהשוואה ללא הודעה — זה פי 3 ניהול נטישה טוב יותר מאשר מעקב ידני.
השוואת מודלי חיוב: תעריף קבוע לעומת ליחידה לעומת מדורג
| פרמטר | תעריף קבוע | ליחידה | מדורג |
|---|---|---|---|
| מורכבות יישום | נמוכה | בינונית | גבוהה |
| גמישות ללקוח | נמוכה | גבוהה | בינונית |
| סיכון לשגיאות חיוב יחסי | מינימלי | בינוני | גבוה |
| מומלץ עבור | תוכניות בסיסיות | API, אחסון | Enterprise |
| עלות (הקמה) | $5,000–$7,000 | $7,000–$10,000 | $10,000–$15,000 |
הבטחת 99.9% זמינות חיוב
השתמש בלוגיקת failover: אם API של Stripe אינו זמין, שמור בקשות במטמון ונסה שוב עם backoff אקספוננציאלי. הגדר ניטור webhooks עם התראות Telegram/Slack. תמיד עבד אירועי invoice.payment_failed — הודעה בזמן מפחיתה נטישה ב-20%. בהשוואה למערכת פנימית, Stripe Billing מהיר פי 5 ליישום ואמין פי 10 בזכות תשתית מוכחת.
מה כלול באינטגרציה
- הגדרת מוצרים ומחירים ב-Stripe Dashboard.
- סקריפטי העברה לסנכרון תוכניות.
- יישום רישום ומנוי עם תקופת ניסיון.
- הגדרת Webhooks וטיפול באירועים מרכזיים.
- שילוב פורטל לקוחות.
- תיעוד API ותמיכה חודש לאחר השקה.
צור קשר להערכה מדויקת של הפרויקט שלך. אינטגרציה בסיסית עולה $5,000–$7,000 ואורכת 5 עד 10 ימי עסקים. תרחישים מורכבים (חיוב מדוד, מטבעות מרובים) עולים $10,000–$15,000 ואורכים עד 3 שבועות. קבל ייעוץ על שילוב Stripe Billing — הגדר חיוב ל-SaaS שלך ללא כאב ראש.







