פונקציות צד שרת
שתי דרכי הפעלה
Section titled “שתי דרכי הפעלה”| הכיוון | מי מפעיל | איך |
|---|---|---|
| מהחוץ פנימה | דף נחיתה, מערכת חיצונית, שרת ביניים | POST /functions/{appId}/{fn} |
| מבפנים | טריגר על שינוי נתונים | פעולה מסוג server-side-code עם functionName |
בשני המקרים הפונקציה נוגעת בנתוני המערכת (עם master key מוזרק), קוראת למערכות חיצוניות (סליקה, SMS, מרכזייה), ומשאירה עקבות ב‑_syslogTriggers וב‑_Timeline.
פעולת הטריגר מעבירה לפונקציה את הרשומה שהפעילה אותה כהקשר:
{ "actionType": "server-side-code", "actionData": { "server-side-code": { "functionName": "calculateCommission", "useQueue": true } }}מתי צריך פונקציה
Section titled “מתי צריך פונקציה”הטבלה הזו היא גם התשובה ל“הגדרה או פיתוח”:
| הצורך | למה קונפיגורציה לא מספיקה |
|---|---|
| חישובים חוצי‑רשומות, סכומי גלגול, עמלות מדורגות | טריגר פועל על רשומה אחת; אין שדות מחושבים ואין אגרגציה מובנית |
| חישוב זמן לפי ימי עסקים וחגים (SLA, חלונות שליחה) | הפרשי הזמן בטריגר הם דקות לוח שנה בלבד |
| קריאות לשער סליקה — חיוב, טוקנים, זיכויים | API חיצוני + סודות |
| טלפוניה — קליטת CDR, חיוג מהמערכת, מסך קופץ | דורש receiver לוובהוקים של ספק המרכזייה |
| מיזוג כפילויות, ולידציה מורכבת | אין מנוע דה‑דופליקציה מובנה |
| סנכרון עם מערכות חיצוניות (הנהלת חשבונות, יומנים, מרשמים) | API חיצוני, מיפוי, ניסיונות חוזרים |
| זרימות אימות לפורטל (OTP, הרשמה עצמית עם קישור לרשומה) | יצירת משתמש + שיוך תפקיד + הנפקת סשן |
פונקציות מותאמות מפותחות ונפרסות על ידי צוות MyBusiness. אי אפשר להעלות קוד צד שרת דרך ה‑API או דרך MCP, ובסביבת הפיתוח פריט הניווט Server Side Code מוסתר לחשבונות לקוח.
כל דרישה שנוחתת בטבלה שלמעלה היא פריט פיתוח, עם זמן אספקה, עלות ובעל תפקיד, ולא פריט קונפיגורציה. סווגו אותה ככזו בשלב האפיון.
לעבוד מול פונקציה קיימת
Section titled “לעבוד מול פונקציה קיימת”1 · השיגו את החוזה. לכל פונקציה מבנה קלט משלה, ואין מפרט גנרי: קבלו אותו מהצוות שפיתח, או קראו את הטריגר שקורא לה.
2 · בדקו קריאה בודדת לפני השילוב:
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"}'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();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$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 (Name → Value כאובייקט):
{ "Name": "AcceptWebLeads", "Value": { "AcceptWebLeads": true } }{ "Name": "AcceptWebToTable","Value": { "AcceptWebToTable": true } }במערכת חדשה קיימות מהקופסה רק AcceptWebLeads (דלוקה) ו‑Payment; את AcceptWebToTable ו‑AcceptWebToCaseLeads יוצרים בעצמכם. בלי השורה, הפונקציה מחזירה 400 {"error":"AcceptWebToTable is Disabled"}. ראו דגלי הפעלה.
- ב‑MCP הטבלה נקראת בחיבור Master Key (
Get-Data). - ב‑REST היא נגישה לכל אישור עם הרשאת קריאה: Master Key, API Key וגם Session Token של משתמש מורשה. מי עובר תלוי ב‑CLP של
Configבמערכת: כש‑find/getמוגדריםrequiresAuthentication: true, כל משתמש מחובר קורא את הטבלה, לא רק בעל תפקיד. קריאה אנונימית נחסמת ב‑404עםcode 101(user needs to be authenticated), ובקונפיגורציית CLP אחרת ב‑400עםcode 119. בדקו את ה‑CLP אצלכם ואל תסתמכו על קוד שגיאה מסוים. - בדיוק שורה אחת לכל דגל. כשקיימות כמה שורות עם אותו
Name, הקוד לוקח תמיד את השורה שנוצרה ראשונה. ההתנהגות דטרמיניסטית: שורה ישנה עםfalseחוסמת שורה חדשה עםtrue, והתסמין הוא400 … is Disabledבטופס.
# בדיקת דגל — 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"}'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();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$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);שלוש אזהרות
Section titled “שלוש אזהרות”- הפונקציה עוקפת הרשאות. היא רצה עם Master Key, ו‑CLP אינו מגביל אותה: פונקציה באגית נוגעת בכל דבר. קריטריון קבלה ובדיקת יומנים אינם מותרות.
- הכתיבות שלה מפעילות טריגרים כמו כל כתיבה. פונקציה שכותבת 500 רשומות מפעילה 500 שרשראות. עומק שרשרת מרבי: 3 רמות; הרמה הרביעית נחסמת ונרשמת ב‑
_syslogTriggersעםerror: "blocked! trigger step is to deep -3. source trigger: <id>". - התאמת טלפון לפי הספרות האחרונות נפוצה באינטגרציות טלפוניה ומייצרת התנגשויות בקווים משותפים. הגדירו את כלל ההתאמה במפורש במפרט.
המשך מכאן
Section titled “המשך מכאן”- getlead · web2table — הפונקציות שכל מערכת מגיעה איתן
- שגיאות ופתרון תקלות · יומנים וראיות · סביבות וגישה