לאחר אישור התשלום, משתמשים נתקלים לעיתים קרובות בעיכובים בגישה עקב עיבוד תשלומים אסינכרוני. מצבי מרוץ בין webhooks לבין סשנים של הפניות גורמים לחוסר סנכרון בסטטוס — ההרשמה לא נוצרת למרות שהתשלום הצליח. ב-20+ פרויקטים, פתרנו זאת עם מטפלי webhook אידמפוטנטיים ותורים. זמן הגישה הממוצע הוא 2.3 שניות, והירידה בביטולים היא עד 25% הודות לגישה מיידית לאחר אימות. עלות האינטגרציה מחושבת באופן פרטני ובדרך כלל נמוכה ב-15–20% מממוצע השוק מכיוון שאנו משתמשים ברכיבים מוכחים. אנו מבטיחים שהתוכן שלך מוגן ומשתמשים מקבלים גישה ללא עיכובים.
כיצד להימנע ממצבי מרוץ במתן גישה
טעות אופיינית היא מתן גישה סינכרונית לאחר הפניה משער התשלום. המשתמש לוחץ על הכפתור, מגיע לדף ההצלחה, מקבל גישה — אבל התשלום לא עבר. יש להנפיק גישה רק דרך webhook, אחרת העסק מפסיד הכנסות. אנו מבטיחים לוגיקה נכונה: ההרשמה נוצרת רק לאחר אימות תשלום דרך Stripe webhook signature verification.
ארכיטקטורה:
[Пользователь] → [Checkout] → [Payment Gateway] ↓ [Webhook Handler] ↓ [Enrollment Service] → [DB: enrollments] ↓ [Access Control Layer] ↓ [LMS / Video Delivery / Downloads] קריטי הוא מטפל ה-webhook — הוא יוצר את רשומת הגישה לאחר אישור התשלום. אידמפוטנטיות: רשומת ההרשמה נוצרת עם אינדקס ייחודי על [Пользователь] → [Checkout] → [Payment Gateway] ↓ [Webhook Handler] ↓ [Enrollment Service] → [DB: enrollments] ↓ [Access Control Layer] ↓ [LMS / Video Delivery / Downloads] , קריאה שנייה פשוט מחזירה את הרשומה הקיימת.
השוואת שערי תשלום: Stripe לעומת YooKassa
| שער תשלום | זמן עיבוד webhook | הגנה מפני כפילויות | עלות אינטגרציה יחסית |
|---|---|---|---|
| Stripe | ~1 שנייה | אידמפוטנטיות מובנית | קו בסיס |
| YooKassa | ~2–3 שניות | דרך מפתח תשלום ייחודי | גבוהה ב-30% |
עיבוד ה-webhook של Stripe מהיר פי ~2 מזה של YooKassa, וזה קריטי בעומס גבוה. לשוק הרוסי, YooKassa עדיף בשל לוקליזציה ותמיכה באמצעי תשלום פופולריים.
מדוע כתובות URL חתומות אינן מבטיחות אבטחה ללא תצורה נכונה
אם אורך החיים של כתובת ה-URL ארוך מדי או לא מקושר למשתמש ספציפי, תוכן עלול לדלוף. אנו משתמשים בכתובות URL חתומות עם תוקף של שעתיים וקשירה לכתובת IP. לקורסי פרימיום, אנו משתמשים ב-Mux עם סטרימינג אדפטיבי (HLS) ואסימוני נגינה חתומים.
$url = $s3->createPresignedRequest( $s3->getCommand('GetObject', [ 'Bucket' => 'courses-bucket', 'Key' => "courses/{$courseId}/lesson-{$lessonId}.mp4", ]), '+2 hours' )->getUri(); לפרטים נוספים על כתובות URL חתומות, עיין בתיעוד הרשמי של AWS.
ניהול גישה והתקדמות
טבלת (user_id, course_id):
| שדה | סוג | תיאור |
|---|---|---|
| id | uuid | מפתח ראשי |
| user_id | bigint | FK → users |
| course_id | bigint | FK → courses |
| payment_id | varchar | מזהה עסקה משער התשלום |
| expires_at | timestamp | NULL = ללא הגבלה |
| status | enum | active / suspended / refunded |
| created_at | timestamp | תאריך רכישה |
Middleware בכל נתיב מוגן בודק רשומה פעילה:
// Laravel Gate Gate::define('access-course', function (User $user, Course $course) { return $user->enrollments() ->where('course_id', $course->id) ->where('status', 'active') ->where(function ($q) { $q->whereNull('expires_at') ->orWhere('expires_at', '>', now()); }) ->exists(); }); התקדמות הלמידה מנוטרת דרך $url = $s3->createPresignedRequest( $s3->getCommand('GetObject', [ 'Bucket' => 'courses-bucket', 'Key' => "courses/{$courseId}/lesson-{$lessonId}.mp4", ]), '+2 hours' )->getUri(); . תעודה נוצרת אוטומטית כאשר enrollments עבור כל השיעורים בקורס.
מנגנונים נוספים
תצוגה מקדימה חינמית (גישת ניסיון)
1–2 השיעורים הראשונים פתוחים בדרך כלל ללא תשלום. דגל `is_free_preview` ברמת השיעור, נבדק ב-middleware. אם השיעור אינו חינמי ואין הרשמה, המשתמש מופנה לדף הרכישה.החזרים
בהחזר, Stripe שולח `charge.refunded`. אנו משנים את `enrollments.status = 'refunded'`, והמשתמש מאבד גישה מיידית. עבור YooKassa, נעשה שימוש ב-webhook דומה `payment.canceled`.ניטור ובדיקות
כדי להבטיח אמינות, אנו מגדירים ניטור של הודעות webhook: כל כשל מתועד, והצוות מקבל התראה בטלגרם. זה מאפשר לנו להגיב לבעיות לפני שהן משפיעות על משתמשים. לפני ההשקה, אנו מבצעים בדיקות עומס — אנו יוצרים 100+ תשלומים מקבילים ומאמתים שכל ההרשמות נוצרות כראוי ללא מצבי מרוץ.
מה כלול בתוצאה
- אינטגרציה עם שער תשלום (Stripe, YooKassa, Robokassa) עם טיפול ב-webhook
- מערכת הרשמה עם בדיקת גישה דרך middleware
- אספקת וידאו מאובטחת (כתובות URL חתומות / Mux)
- מעקב התקדמות עם שמירת אחוז צפייה
- יצירת תעודות PDF
- לוח בקרה לניהול הרשמות והחזרים
- תיעוד API ומדריך תפעול
- תמיכה טכנית במהלך ההשקה
- ניטור webhook והתראות על כשלים
לוחות זמנים לביצוע
| שלב | זמן |
|---|---|
| אינטגרציית Stripe בסיסית + הרשמה | 2–3 ימים |
| אספקת וידאו מאובטחת (S3 signed URL) | 1–2 ימים |
| מעקב התקדמות + סרגל התקדמות בממשק | 1–2 ימים |
| תעודות (יצירת PDF) | יום אחד |
| אינטגרציית YooKassa / שער שני | 1–2 ימים |
| לוח בקרה (הרשמות, הכנסות) | 2–3 ימים |
גרסה מינימלית כוללת — 7–10 ימי עסקים במפתח פתוח. הזמינו אינטגרציית תשלום לקורס שלכם — זה יגביר המרה ויפחית עומס תמיכה. קבלו ייעוץ לבחירת שער תשלום וארכיטקטורת גישה.







