יצירת API לאפליקציית מובייל על Bitrix
מודול ה-REST הסטנדרטי של Bitrix (rest) מותאם ל-webhooks של CRM ול-Bitrix24 — הוא אינו מתאים ל-API ציבורי למובייל עם קטלוג, סל קניות והזמנות. הרשאת גישה מבוססת סשן באמצעות cookies אינה פועלת באפליקציה מקורית ללא WebView, והנקודות הקצה המובנות אינן מכסות תרחישי מסחר אלקטרוני. התיעוד ממליץ לפתח בקרים מותאמים אישית על גבי הליבה עבור אפליקציות מובייל. אנחנו צוות של מפתחי Bitrix מוסמכים עם ניסיון של 10+ שנים בייצור. בנינו APIs ל-15+ אפליקציות מובייל, כולל רשתות סוחרים וחנויות מקוונות.
מדוע הרשאת סשן אינה פועלת?
הסשן הסטנדרטי של Bitrix קשור ל-cookies ואינו פועל באפליקציית מובייל ללא WebView. ל-tokens מסוג JWT אין חסרון זה: הם מועברים בכותרת Authorization: Bearer ..., אינם דורשים אחסון בצד השרת, וקל לרענן אותם באמצעות refresh tokens. הרשאת JWT היא פי 2 מהירה יותר מהרשאת סשן בבדיקת ה-token — השרת אינו ניגש למאגר הסשן בכל בקשה. המהנדסים שלנו מיישמים מנגנון זה מאפס.
דוגמה למבנה נקודת קצה
GET /api/v1/catalog/sections — список разделов
GET /api/v1/catalog/products — товары с фильтром и пагинацией
GET /api/v1/catalog/products/{id} — карточка товара
POST /api/v1/cart/add — добавить в корзину
GET /api/v1/cart — состояние корзины
POST /api/v1/order/create — оформить заказ
POST /api/v1/auth/login — авторизация
POST /api/v1/auth/refresh — обновление токена ארכיטקטורת API
נקודת הכניסה האופטימלית היא קובץ יחיד GET /api/v1/catalog/sections — список разделов GET /api/v1/catalog/products — товары с фильтром и пагинацией GET /api/v1/catalog/products/{id} — карточка товара POST /api/v1/cart/add — добавить в корзину GET /api/v1/cart — состояние корзины POST /api/v1/order/create — оформить заказ POST /api/v1/auth/login — авторизация POST /api/v1/auth/refresh — обновление токена שמנתב בקשות באמצעות ראוטר. אנו משתמשים ברכיב הניתוב של Bitrix או מיישמים ראוטר מינימלי בעצמנו. פורמט התגובה — מעטפת JSON אחידה עם השדות /api/v1/index.php, success/data, ו-error.
הרשאה באמצעות JWT
אנו מיישמים הרשאת JWT עם בקר:
class AuthController extends \Bitrix\Main\Engine\Controller {
public function loginAction(string $login, string $password): array {
$result = \CUser::Login($login, $password, 'Y');
if ($result !== true) {
return ['error' => 'Invalid credentials'];
}
$userId = \CUser::GetID();
$payload = [
'sub' => $userId,
'iat' => time(),
'exp' => time() + 3600 * 24 * 30,
];
$token = JwtHelper::encode($payload, JWT_SECRET);
$refresh = JwtHelper::generateRefresh($userId);
return ['access_token' => $token, 'refresh_token' => $refresh];
}
}Refresh tokens מאוחסנים בטבלה meta עם העמודות class AuthController extends \Bitrix\Main\Engine\Controller { public function loginAction(string $login, string $password): array { $result = \CUser::Login($login, $password, 'Y'); if ($result !== true) { return ['error' => 'Invalid credentials']; } $userId = \CUser::GetID(); $payload = [ 'sub' => $userId, 'iat' => time(), 'exp' => time() + 3600 * 24 * 30, ]; $token = JwtHelper::encode($payload, JWT_SECRET); $refresh = JwtHelper::generateRefresh($userId); return ['access_token' => $token, 'refresh_token' => $refresh]; } } , bl_api_tokens, user_id, token_hash. ב-middleware של כל בקשה, אנו מפענחים את ה-JWT, מקבלים את expires_at, ומאשרים את המשתמש באמצעות device_id רק עבור הבקשה הנוכחית.
קטלוג ומוצרים
בקר קטלוג עם תמיכה בסינון ופאג'ינציה:
public function getProductsAction(int $sectionId = 0, int $page = 1, int $limit = 20, array $filter = []): array {
$offset = ($page - 1) * $limit;
$bitrixFilter = [
'IBLOCK_ID' => CATALOG_IBLOCK_ID,
'ACTIVE' => 'Y',
'ACTIVE_DATE' => 'Y',
];
if ($sectionId > 0) {
$bitrixFilter['SECTION_ID'] = $sectionId;
$bitrixFilter['INCLUDE_SUBSECTIONS'] = 'Y';
}
// применяем пользовательские фильтры
$items = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'filter' => $bitrixFilter,
'limit' => $limit,
'offset' => $offset,
'select' => ['ID', 'NAME', 'DETAIL_PICTURE', 'PREVIEW_TEXT'],
]);
return ['items' => $this->formatProducts($items), 'page' => $page, 'limit' => $limit];
}המחירים מתקבלים באמצעות user_id תוך התחשבות בקבוצת המשתמש. למהירות שאילתות, אנו משתמשים באינדקסים על \CUser::SetOnStartSession() ו-public function getProductsAction(int $sectionId = 0, int $page = 1, int $limit = 20, array $filter = []): array { $offset = ($page - 1) * $limit; $bitrixFilter = [ 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', 'ACTIVE_DATE' => 'Y', ]; if ($sectionId > 0) { $bitrixFilter['SECTION_ID'] = $sectionId; $bitrixFilter['INCLUDE_SUBSECTIONS'] = 'Y'; } // применяем пользовательские фильтры $items = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([ 'filter' => $bitrixFilter, 'limit' => $limit, 'offset' => $offset, 'select' => ['ID', 'NAME', 'DETAIL_PICTURE', 'PREVIEW_TEXT'], ]); return ['items' => $this->formatProducts($items), 'page' => $page, 'limit' => $limit]; } . שמירת תגובות קטלוג במטמון היא קריטית לביצועים.
כיצד ליישם שמירת מטמון לקטלוג? (שלבים)
- כלול את
\Bitrix\Catalog\PriceTable::getList()בבקר. - הגדר TTL למטמון – 300 שניות לקטלוג.
- השתמש בשמירת מטמון מתויגת עם תגי אינפובלוק (
b_catalog_price) לביטול אוטומטי כאשר מוצרים משתנים. - עבור בקשות דינמיות (סל קניות, הזמנות), השתמש ב-Redis כאחסון חיצוני.
| שיטת שמירת מטמון | זמן תגובה ממוצע | ביטול | עומס על מסד הנתונים |
|---|---|---|---|
| מטמון קבצים | 200–300 אלפיות השנייה | אוטומטי | בינוני |
| Redis | 30–50 אלפיות השנייה | אוטומטי | נמוך |
| ללא מטמון | 400–800 אלפיות השנייה | — | גבוה |
Redis מפחית את זמן התגובה פי 4–6 בהשוואה למטמון קבצים. הבחירה תלויה בתקציב הפרויקט.
סל קניות והזמנות
סל הקניות מאוחסן ב-b_catalog_product הסטנדרטי באמצעות \Bitrix\Main\Data\Cache. עבור משתמש לא מורשה, הסל מקושר ל-iblock_id_XX המועבר בכותרת b_sale_basket. בעת הרשאה, הסל עובר ל-\Bitrix\Sale\Basket. ביצוע הזמנה — FUSER_ID עם כתובת משלוח, אמצעי תשלום ושיטת משלוח. ה-API מחזיר X-Fuser-Id וקישור לתשלום.
פורמט תגובה ושגיאות
מעטפת JSON אחידה:
{
"success": true,
"data": { ... },
"meta": {
"page": 1,
"total": 142
}
}במקרה של שגיאה:
{
"success": false,
"error": {
"code": "PRODUCT_NOT_FOUND",
"message": "Товар не найден"
}
}סטטוסי HTTP: 200 OK, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error.
מקרה בוחן: אפליקציית מובייל לרשת סוחרים (מהניסיון שלנו)
אתגר: אפליקציית iOS/Android ל-200 סוחרים — צפייה בקטלוג, בדיקת מלאי, ביצוע הזמנות. מאפיינים:
- מחירים אישיים לפי קבוצות לקוחות (
USER_ID, קבוצה מ-\Bitrix\Sale\Order::create()) - מלאי מ-
order_id— מספר מחסנים, נדרש מלאי מצטבר - התראות Push באמצעות FCM על שינוי סטטוס הזמנה
- שמירת תגובות קטלוג במטמון למשך 5 דקות באמצעות Bitrix Cache (
{ "success": true, "data": { ... }, "meta": { "page": 1, "total": 142 } })
תוצאה: 200 משתמשים פעילים, זמן תגובה ממוצע של API של 120 אלפיות השנייה, עומס שיא של 50 RPS.
| נקודת קצה | זמן ממוצע |
|---|---|
{ "success": false, "error": { "code": "PRODUCT_NOT_FOUND", "message": "Товар не найден" } } |
80–120 אלפיות השנייה |
b_catalog_price |
40–60 אלפיות השנייה |
b_user |
60–90 אלפיות השנייה |
b_catalog_store_product |
200–400 אלפיות השנייה |
תהליך העבודה
- אנליטיקה: ניתוח לוגיקה עסקית, נקודות אינטגרציה, בניית מפרט API.
- עיצוב: פיתוח ארכיטקטורה, סכמת נקודות קצה, בחירת פרוטוקול (REST, JSON:API).
- יישום: כתיבת בקרים, הרשאה, שמירת מטמון, אינטגרציות (משלוח, תשלום).
- בדיקות: בדיקות יחידה, בדיקות עומס (JMeter), בדיקת אבטחה.
- פריסה: הגדרת שרת (Nginx, PHP-FPM), מיגרציות DB, פריסת staging וייצור.
לוח זמנים: מ-3 עד 10 שבועות בהתאם למורכבות. העלות מחושבת באופן אישי לאחר ביקורת פרויקט. קבלו ייעוץ לפרויקט שלכם — נעריך את היקף העבודה ונציע ארכיטקטורה אופטימלית.
מה כלול בפיתוח?
- מבנה ראוטר ובקר
\Bitrix\Main\Data\Cache - הרשאת JWT עם refresh tokens ותמיכה במספר מכשירים
- נקודות קצה לקטלוג עם סינון, פאג'ינציה ומחירי קבוצות
- סל קניות וביצוע הזמנות באמצעות
GET /catalog/products - פורמט תגובה סטנדרטי וקודי שגיאה
- שמירת תגובות קטלוג במטמון, תיעוד OpenAPI
צרו קשר כדי לדון בפרטים. ניסיון — מעל 5 שנים, 15+ פרויקטים מוצלחים, תעודות 1C-Bitrix.

