דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

פונקציות צד שרת

עודכן 30.08.2026
POST https://api.mbapps.co.il/functions/{appId}/{functionName}
הכיוון מי מפעיל איך
מהחוץ פנימה דף נחיתה, מערכת חיצונית, שרת ביניים POST /functions/{appId}/{fn}
מבפנים טריגר על שינוי נתונים פעולה מסוג server-side-code עם functionName

ובשני המקרים הפונקציה יכולה לגעת בנתוני המערכת (עם master key מוזרק), לקרוא למערכות חיצוניות (סליקה, SMS, מרכזייה), ולהשאיר עקבות ב‑_syslogTriggers וב‑_Timeline.

מהחוץ פנימה — קריאת HTTP ישירה. זה המסלול של טפסים ואינטגרציות. מבפנים — פעולת טריגר מסוג server-side-code, שמעבירה לפונקציה את הרשומה שהפעילה אותה כהקשר:

JSON
{
"actionType": "server-side-code",
"actionData": {
"server-side-code": { "functionName": "calculateCommission", "useQueue": true }
}
}

התשובה הזו היא גם התשובה ל“האם זו הגדרה או פיתוח”:

הצורך למה קונפיגורציה לא מספיקה
חישובים חוצי‑רשומות, סכומי גלגול, עמלות מדורגות טריגר פועל על רשומה אחת; אין שדות מחושבים ואין אגרגציה מובנית
חישוב זמן לפי ימי עסקים וחגים (SLA, חלונות שליחה) הפרשי הזמן בטריגר הם דקות לוח שנה בלבד
קריאות לשער סליקה — חיוב, טוקנים, זיכויים API חיצוני + סודות
טלפוניה — קליטת CDR, חיוג מהמערכת, מסך קופץ דורש receiver לוובהוקים של ספק המרכזייה
מיזוג כפילויות, ולידציה מורכבת אין מנוע דה‑דופליקציה מובנה
סנכרון עם מערכות חיצוניות (הנהלת חשבונות, יומנים, מרשמים) API חיצוני, מיפוי, ניסיונות חוזרים
זרימות אימות לפורטל (OTP, הרשמה עצמית עם קישור לרשומה) יצירת משתמש + שיוך תפקיד + הנפקת סשן

לעבוד מול פונקציה קיימת

Section titled “לעבוד מול פונקציה קיימת”

1 · השיגו את החוזה. לכל פונקציה מבנה קלט משלה. אין מפרט גנרי: קבלו אותו מהצוות שפיתח אותה, או קראו את הטריגר שקורא לה.

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

Bash
curl -sS -i -X POST "https://api.mbapps.co.il/functions/${APP_ID}/${FN}" \
-H "Content-Type: application/json" \
-H "X-Parse-Application-Id: ${APP_ID}" \
-d '{"exampleKey":"exampleValue"}'
JavaScript
const APP_ID = process.env.APP_ID, FN = process.env.FN;
const res = await fetch(`https://api.mbapps.co.il/functions/${APP_ID}/${FN}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APP_ID,
},
body: JSON.stringify({ exampleKey: 'exampleValue' }),
});
console.log(res.status);
const data = await res.json();
Python
import os, requests
APP_ID = os.environ["APP_ID"]
FN = os.environ["FN"]
res = requests.post(
f"https://api.mbapps.co.il/functions/{APP_ID}/{FN}",
headers={
"Content-Type": "application/json",
"X-Parse-Application-Id": APP_ID,
},
json={"exampleKey": "exampleValue"},
)
print(res.status_code)
data = res.json()
PHP
<?php
$appId = getenv('APP_ID');
$fn = getenv('FN');
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/functions/$appId/$fn",
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Parse-Application-Id: $appId",
],
CURLOPT_POSTFIELDS => json_encode(["exampleKey" => "exampleValue"]),
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);

3 · חפשו את הראיות אחרי הריצה:

מה לבדוק איפה
האם הפונקציה רצה בכלל, והאם נכשלה _syslogTriggers — כשהופעלה מטריגר; שדה error
מה השתנה בנתונים _Timeline — אם הטבלה מנוטרת. שורה שנכתבה מפונקציה נושאת Referer: "server-side-code:<functionName>", וזו הדרך הטובה ביותר לזהות שהפונקציה נגעה ברשומה
האם הקריאה בכלל הגיעה מבחוץ _RequestLog (path, method, statusCode, usingMK, ip, duration…) — מתמלא באיחור: כשעה אחרי הקמת מערכת חדשה המחלקה עדיין אינה מוגדרת, וכעבור כמה שעות היא כבר מכילה אלפי שורות מתוארכות מרגע ההקמה. אל תסיקו “הקריאה לא הגיעה” מיומן ריק. ראו יומנים

פירוט: יומנים וראיות.

טבלת Config — מאיפה הפונקציה קוראת הגדרות

Section titled “טבלת Config — מאיפה הפונקציה קוראת הגדרות”

פונקציות קוראות מפתחות ספקים ודגלי תכונה מטבלת Config (NameValue כאובייקט):

JSON
{ "Name": "AcceptWebLeads", "Value": { "AcceptWebLeads": true } }
{ "Name": "AcceptWebToTable","Value": { "AcceptWebToTable": true } }

במערכת חדשה קיימות מהקופסה רק AcceptWebLeads (דלוקה) ו‑Payment; את AcceptWebToTable ו‑AcceptWebToCaseLeads יוצרים בעצמכם — בלי השורה, הפונקציה מחזירה 400 {"error":"AcceptWebToTable is Disabled"}. ראו דגלי הפעלה.

Bash
# בדיקת דגל — Master Key, API Key, או Session Token של משתמש מורשה
curl -sS -G "https://api.mbapps.co.il/parse/classes/Config" \
-H "X-Parse-Application-Id: $APP_ID" \
-H "X-Parse-Master-Key: $MASTER_KEY" \
--data-urlencode 'where={"Name":"AcceptWebToTable"}'
JavaScript
const APP_ID = process.env.APP_ID, MASTER_KEY = process.env.MASTER_KEY;
const params = new URLSearchParams({
where: '{"Name":"AcceptWebToTable"}',
});
const res = await fetch(`https://api.mbapps.co.il/parse/classes/Config?${params}`, {
headers: {
'X-Parse-Application-Id': APP_ID,
'X-Parse-Master-Key': MASTER_KEY,
},
});
const data = await res.json();
Python
import os, requests
APP_ID = os.environ["APP_ID"]
MASTER_KEY = os.environ["MASTER_KEY"]
res = requests.get(
"https://api.mbapps.co.il/parse/classes/Config",
headers={
"X-Parse-Application-Id": APP_ID,
"X-Parse-Master-Key": MASTER_KEY,
},
params={
"where": '{"Name":"AcceptWebToTable"}',
},
)
data = res.json()
PHP
<?php
$appId = getenv('APP_ID');
$masterKey = getenv('MASTER_KEY');
$query = http_build_query([
'where' => '{"Name":"AcceptWebToTable"}',
]);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Config?$query",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Parse-Application-Id: $appId",
"X-Parse-Master-Key: $masterKey",
],
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
  1. הפונקציה עוקפת הרשאות. היא רצה עם Master Key, ולכן CLP אינו מגביל אותה. פונקציה באגית יכולה לגעת בכל דבר — קריטריון קבלה ובדיקת יומנים אינם מותרות.
  2. הכתיבות שלה מפעילות טריגרים כמו כל כתיבה אחרת. פונקציה שכותבת 500 רשומות מפעילה 500 שרשראות. עומק שרשרת מרבי: 3 רמות — הרמה הרביעית נחסמת ונרשמת ב‑_syslogTriggers עם error: "blocked! trigger step is to deep -3. source trigger: <id>".
  3. התאמת טלפון לפי הספרות האחרונות היא דפוס נפוץ באינטגרציות טלפוניה — ומייצרת התנגשויות בקווים משותפים. הגדירו את כלל ההתאמה במפורש במפרט.