Skip to main content

מה זה חיוב חד-פעמי?

חיוב חד-פעמי הוא תשלום שמתבצע פעם אחת בלבד - ללא חידוש אוטומטי.

מנוי (Subscription)

חיוב אוטומטי כל חודש/שנהדוגמאות: Netflix, Spotify, SaaS

חד-פעמי (One-Time)

תשלום יחיד, ללא חזרהדוגמאות: קורס, ספר, כרטיס לאירוע

מתי להשתמש בזה?

לקוח משלם פעם אחת ומקבל גישה לכל החיים.דוגמה: “קורס פיתוח Full-Stack - ₪499 (פעם אחת)”
eBooks, תבניות, כלים דיגיטליים, פלאגינים.דוגמה: “תבנית Landing Page - ₪149”
כנסים, סדנאות, אירועים חד-פעמיים.דוגמה: “כרטיס לכנס SaaS 2025 - ₪299”
ייעוץ, ביקורת קוד, עיצוב לוגו.דוגמה: “שעת ייעוץ עסקי - ₪500”
תרומה לפרויקט, Tip Jar, קפה למפתח.דוגמה: “קנה לי קפה ☕ - ₪15”

ההבדלים מול מנוי

מאפייןמנוי (Subscription)חד-פעמי (One-Time)
תדירות חיובאוטומטי (חודשי/שנתי)פעם אחת בלבד
ביטולהלקוח יכול לבטלאין מה לבטל
ניהולפורטל ניהול מנויאין צורך בניהול
זיהויsubscription_uidorder_uid
חידושמתחדש אוטומטיתלא מתחדש
Success URL?subscription_uid=sub_xxx?order_uid=order_xxx&email=...

איך זה עובד?

1

לקוח לוחץ 'קנה עכשיו'

הלקוח מגיע לדף המוצר ורוצה לרכוש
2

יצירת לינק תשלום

המערכת שלך יוצרת לינק תשלום אישי עבורו
3

מעבר לדף תשלום

הלקוח מועבר לדף התשלום של Splitz
4

ביצוע תשלום

הלקוח משלם (PayPal או כרטיס אשראי)
5

חזרה לאפליקציה

הלקוח מועבר חזרה עם order_uid ופרטי התשלום
6

אימות ומתן גישה

אתה מאמת שההזמנה שולמה ונותן לו גישה למוצר

הקוד המלא

דרישות:
כל הפונקציות ההתממשקות והאינטגרציה עם SPLITZ מתבצעת דרך חבילת הNPM ולא בשום פנים ואופן בצורה ישירה לAPI! המזהה לינק לתשלום ניתן להשיג מהדאשבורד בעמוד: לינקים לתשלום -> לחיצה על הלינק לתשלום ועל כפתור העתק uid בצד שמאל במסך קבלת מפתח api במסך ההגדרות -> api key שימו לב שחובה להגדיר כתובת לחזרה לאחר תשלום מוצלחה (success url) על מנת שהמערכת תדע לאן להפנות את הלקוח שלכם לאחר תשלום מוצלח - תוכלו לבצע זאת בהגדרות לינק לתשלום.

שלב 1: יצירת לינק תשלום

const SplitzClient = require('splitz-payments');

const splitz = new SplitzClient({
  apiKey: 'YOUR_API_KEY_HERE'
});

  // יצירת לינק
  const options = {
    payment_link_uid: 'xxx',
    customer_email: '[email protected]'
  };

 const result = await splitz.paymentLinks.generate(options);
 console.log(result.url);

// return the url to the frontend using res.json({....
לאחר המימוש בקוד, הלקוח חייב להגדיר בהגדרות הלינק לתשלום את הכתובת להפנייה לאחר תשלום מוצלח!

שלב 2: בדיקה האם הזמנה שולמה לאחר התשלום:

הפרמטר שייחזור בURL ששמו: order_uid יעזור לכם לזההות את ההזמנה ולאמת את התשלום. לדוגמא: https://example.com/subscriptionCallback?order_uid=xxx
const SplitzClient = require('splitz-payments');

const splitz = new SplitzClient({
  apiKey: 'YOUR_API_KEY_HERE'
});

 // בדיקת תשלום
 const isPaidResult = await splitz.orders.isPaid('order_uid');
 console.log(isPaidResult.paid); // boolean

  // שליפת הזמנה
 const orderResult = await splitz.orders.get('order_uid');
 console.log(orderResult.order.email);

// validate if the order was paid using the parmas the backend function recived.
// then return the reuslt to the frontend.

Security Checklist

1

✅ API Key בצד השרת בלבד

אל תחשוף את ה-API Key בצד הלקוח!
// ❌ לא טוב (Client-side):
const splitz = new SplitzClient({ apiKey: '...' });

// ✅ טוב (Backend Function):
// הקוד רץ בשרת, לא בדפדפן
2

✅ אמת תמיד בשרת

אל תסמוך על פרמטרים ב-URL!
// תמיד:
const status = await splitz.orders.isPaid(orderUid);
if (status.paid) {
  // תן גישה
}

סיכום

תזכורות חשובות:
  • ✅ תמיד תאמת בצד השרת עם orders.isPaid()
  • ✅ אל תחשוף API Key בצד הלקוח
  • ✅ שמור order_uid בדאטאבייס
  • ✅ שלח מייל אישור לכל תשלום
  • ✅ טפל בשגיאות בצורה ידידותית
אבטחה קריטית!קריאת ה-API חייבת להתבצע בצד השרת (Backend Function), לא בצד הלקוח!אם תחשוף את ה-API Key בצד הלקוח - הכסף שלך בסכנה! 🔒

טיפול בחזרה מדף התשלום

אחרי שהלקוח משלם, הוא חוזר לכתובת שהגדרת ב-Payment Link (עמוד ההצלחה).

הפרמטרים שחוזרים ב-URL:

?order_uid=order_xxx

אימות התשלום (קריטי!)

חובה לאמת!אל תסמוך רק על הפרמטרים ב-URL!מישהו יכול לזייף URL (?uid=order_xxx) ולקבל גישה חינם.תמיד תאמת בצד השרת שההזמנה באמת שולמה! 🔐

Order Object - מבנה נתונים

כשאתה קורא ל-splitz.orders.get(), תקבל אובייקט עם השדות הבאים:
{
  uid: string;              // מזהה ייחודי של ההזמנה
  email: string;           // אימייל הלקוח
  price: number;           // מחיר (לדוגמה: 499)
  currency: string;        // מטבע (ILS)
  status: string;          // סטטוס ההזמנה
  is_paid: boolean;        // האם שולם?
  paid_at: string | null;  // תאריך תשלום (ISO format)
  createdAt: string;       // תאריך יצירה
}

שילוב עם Lovable

אם אתה משתמש ב-Lovable, הנה prompt מוכן:
אני רוצה להוסיף כפתור "קנה עכשיו" לדף המוצר שלי.

כשלוחצים עליו:
1. יצור לינק תשלום חד-פעמי ב-Splitz
2. יעביר את הלקוח לדף התשלום
3. אחרי תשלום מוצלח - יאמת ויתן לו גישה למוצר

השתמש בחבילת NPM: splitz-payments

צור Backend Function שעושה:

```javascript
const SplitzClient = require('splitz-payments');

const splitz = new SplitzClient({
  apiKey: 'YOUR_API_KEY_HERE' // החלף!
});

// יצירת לינק תשלום
const paymentLink = await splitz.paymentLinks.generate({
  payment_link_uid: 'xxx', // החלף ל-Payment Link שלך
  customer_email: 'מייל המשתמש המחובר'
});

לאחר מכן תוכל להחזיר לצד הלקוח את הלינק שחזר מהמשתנה paymentLink
צור עמוד חדש “purchase-success” שמאמת את התשלום: אל תשתמש ב-ENV - הכנס את ה-API Key כמחרוזת ישירות. הקוד חייב להיות Backend Function, לא בצד לקוח!

---

## טיפול בשגיאות

הספרייה מספקת error classes ייעודיים:

```javascript
const { errors } = require('splitz-payments');

try {
  const status = await splitz.orders.isPaid('order_xxx');
  
} catch (error) {
  if (error instanceof errors.NotFoundError) {
    console.error('❌ הזמנה לא נמצאה');
    alert('ההזמנה לא קיימת במערכת. צור קשר עם התמיכה.');
    
  } else if (error instanceof errors.AuthenticationError) {
    console.error('❌ API key לא תקין');
    
  } else if (error instanceof errors.ForbiddenError) {
    console.error('❌ אין הרשאה לגשת להזמנה זו');
    
  } else if (error instanceof errors.SplitzAPIError) {
    console.error('❌ שגיאת API:', error.message);
    console.error('סטטוס:', error.statusCode);
  }
}

סוגי שגיאות:

  • SplitzAPIError - שגיאה כללית מה-API
  • ValidationError - פרמטרים לא תקינים
  • AuthenticationError - API key לא תקין או חסר
  • NotFoundError - משאב לא נמצא (404)
  • ForbiddenError - אין הרשאה (403)

Troubleshooting

הבעיה: הקוד לא מפנה נכון.הפתרון:
// ✅ נכון:
window.location.href = paymentLink.url;

// ❌ לא יעבוד (רק מדפיס):
console.log(paymentLink.url);
הבעיה: עמוד ההצלחה לא מוגדר ב-Payment Link.הפתרון:
  1. היכנס ל-Dashboard → לינקים לתשלום
  2. ערוך את הלינק
  3. הוסף “כתובת הפניה לאחר תשלום” (Success URL)
  4. לדוגמה: https://myapp.com/purchase-success
הבעיה: ה-order_uid לא נכון או לא קיים.הפתרון:
  1. בדוק שאתה קורא נכון את הפרמטר:
const orderUid = urlParams.get('uid') || urlParams.get('order_uid');
  1. וודא שהפרמטר באמת קיים ב-URL
  2. בדוק ב-Dashboard → הזמנות אם ההזמנה קיימת
הבעיה: PayPal עדיין מעבד את התשלום.הפתרון: זה נורמלי - לפעמים לוקח 1-2 דקות.תצג ללקוח:
"התשלום בתהליך אישור... נודיע לך כשזה יושלם!"
חכה 30 שניות ונסה שוב, או השתמש ב-Webhook.
הבעיה: הקוד לא נתן לו גישה אוטומטית.הפתרון:
  1. בדוק ב-Dashboard → הזמנות - האם התשלום מופיע כ-Paid?
  2. בדוק את הקונסול (F12) - יש שגיאות JavaScript?
  3. ודא שהקוד של grantAccess() רץ
  4. בדוק שהנתונים נשמרו בדאטאבייס
  5. השתמש ב-Webhook כפתרון גיבוי

שאלות נפוצות

כן. אתה יכול להחזיר כסף ישירות מה-Dashboard.הזמנות → בחר הזמנה → החזר כסףהכסף יחזור ללקוח תוך 5-10 ימי עסקים.
  • isPaid() - בדיקה מהירה, מחזיר רק { paid: true/false }
  • get() - מחזיר את כל פרטי ההזמנה (מייל, מחיר, תאריכים וכו’)
מתי להשתמש במה:
  • רק רוצה לדעת אם שולם? → isPaid()
  • צריך פרטים נוספים? → get()
בהחלט! פשוט השתמש ב-Payment Links שונים:
  • pl_subscription_monthly למנויים
  • pl_course_onetime לקורסים חד-פעמיים
התשלומים יופיעו ב-Dashboard בנפרד.
ב-Dashboardהזמנותתראה:
  • כל התשלומים (מנויים + חד-פעמיים)
  • סטטוס (Paid / Pending)
  • סכומים
  • מיילים של לקוחות
  • Export ל-Excel
זה לא אמור לקרות (הלינך תקף רק לתשלום אחד).אם זה קרה בכל זאת - פשוט תחזיר כסף על אחד התשלומים מה-Dashboard.
כן, מומלץ מאוד!זה מאפשר לך:
  • לעקוב אחרי מי שילם
  • למנוע duplicate purchases
  • לתת support (הלקוח אומר “שילמתי ואין לי גישה”)
  • לעשות refund אם צריך
await db.purchases.create({
  user_id: userId,
  order_uid: order.uid,
  email: order.email,
  amount: order.price,
  purchased_at: order.paid_at
});