הגדרת אימות גיל (18+) על 1C-Bitrix
כשהשקנו חנות מקוונת שמוכרת אלכוהול, טבק או תרופות, נתקלנו בדרישות מחמירות של 54-FZ וסעיף 14.17 לחוק העבירות המנהליות — אימות גיל הקונה. אימות חסר עלול לגרור קנסות של עד 4.5–6.5 אלף דולר וחסימת האתר. Bitrix לא מספקת מנגנון מוכן, ולכן אנו מתכננים ומיישמים אותו במפתח סגור. במהלך השנים ביצענו יותר מ-50 אינטגרציות כאלה — מחלון מודאלי פשוט ועד זיהוי מלא דרך Gosuslugi. הגישה שלנו עובדת פי 3 מהר יותר מיישום טיפוסי הודות למודולים מוכנים ותכנית מלוטשת.
החוק הפדרלי № 171-FZ וסעיף 14.17 לחוק העבירות המנהליות של הפדרציה הרוסית דורשים ישירות ממוכרי אלכוהול וטבק לאמת את גיל הקונה. ציטוט: "מכירה קמעונאית לקטינים גוררת הטלת קנס מנהלי." לכן, מערכת האימות אינה מותרות אלא תנאי חובה.
איך לבחור את רמת האימות?
השאלה הראשונה: איזו רמת אימות לבחור? יש שלוש, וכל אחת דורשת גישה שונה.
| רמה | שיטה | אמינות | מורכבות | לוח זמנים |
|---|---|---|---|---|
| 1 — הצהרה | חלון מודאלי עם כפתורי "כן" ו"לא" | נמוכה (קוקי) | מינימלית | 2–3 ימים |
| 2 — תאריך לידה | הזנת תאריך, בדיקה מתמטית | בינונית (סשן) | נמוכה | 2–4 ימים |
| 3 — מסמכים | אינטגרציה עם ESIA, IDEX, Kontur.Check | גבוהה (דרכון) | גבוהה | 1–3 שבועות |
רמה 1 היא המהירה ביותר. הקונה מאשר את גילו בעצמו, והתוצאה נשמרת בקוקי age_verified=1 עם תוקף של 30 יום. הגנה חלשה מבחינה חוקית, אך מספיקה לחלק מהמוצרים (למשל, משקאות אנרגיה).
רמה 2 — המשתמש מזין תאריך לידה, והמערכת בודקת (today - birthdate) >= 18 years. ניתן לעקוף אותה בקלות, אך היא מעבירה את האחריות החוקית לקונה.
רמה 3 היא האמינה ביותר. שילבנו עם 171-FZ דרך ESIA REST API. אימות באמצעות נתוני דרכון הוא הסטנדרט שלנו לאלכוהול וטבק.
למה אי אפשר להסתמך רק על קוקיז?
קוקיז פגים וניתן למחוק אותם. לכן אנו מוסיפים בדיקות במספר חזיתות:
-
OnPageStart— בדיקת קוקי והצגת חלון מודאלי. -
OnBeforePrologברכיבbitrix:catalog— הגבלת גישה לקטעים מוגבלי גיל. -
OnSaleBasketItemAdd— חסימת הוספת מוצר לעגלה ללא אישור.
קוד ה-handler ב-init.php:
AddEventHandler('main', 'OnPageStart', function() { global $APPLICATION; if (!isset($_COOKIE['age_verified'])) { $APPLICATION->AddHeadScript('/local/js/age-verify.js'); $APPLICATION->SetAdditionalCSS('/local/css/age-verify.css'); } }); // age-verify.js — установка cookie при подтверждении document.cookie = 'age_verified=1; max-age=' + (86400 * 30) + '; path=/; SameSite=Lax'; הגבלה ברמת קטגוריה
ייתכן שלא נדרש אימות לכל האתר. בבלוק המידע של הקטע נוצרת תכונה AddEventHandler('main', 'OnPageStart', function() { global $APPLICATION; if (!isset($_COOKIE['age_verified'])) { $APPLICATION->AddHeadScript('/local/js/age-verify.js'); $APPLICATION->SetAdditionalCSS('/local/css/age-verify.css'); } }); (תיבת סימון). ה-handler בודק לא רק את נוכחות הקוקי אלא גם אם העמוד הנוכחי שייך לקטגוריה מוגבלת.
// OnBeforeProlog в bitrix:catalog $sectionId = $arParams['SECTION_ID']; $section = CIBlockSection::GetByID($sectionId)->Fetch(); if ($section['UF_AGE_RESTRICTED'] && !isset($_COOKIE['age_verified'])) { LocalRedirect('/age-check/?back=' . urlencode($REQUEST_URI)); } אימות בעת הוספה לעגלה
גם אם הקונה עבר אימות בכניסה, ייתכן שהקוקי פג. ה-handler // age-verify.js — установка cookie при подтверждении document.cookie = 'age_verified=1; max-age=' + (86400 * 30) + '; path=/; SameSite=Lax'; בודק אישור עדכני:
AddEventHandler('sale', 'OnSaleBasketItemAdd', function(&$arFields) { $productId = $arFields['PRODUCT_ID']; if (isAgeRestrictedProduct($productId) && !isAgeVerified()) { return new CDBResult(false, 'Подтвердите возраст для добавления товара'); } }); שמירת מצב אימות למשתמשים מחוברים
למשתמשים מחוברים, תוצאת האימות נשמרת בפרופיל — שדות UF UF_AGE_RESTRICTED (כן/לא) ו-// OnBeforeProlog в bitrix:catalog $sectionId = $arParams['SECTION_ID']; $section = CIBlockSection::GetByID($sectionId)->Fetch(); if ($section['UF_AGE_RESTRICTED'] && !isset($_COOKIE['age_verified'])) { LocalRedirect('/age-check/?back=' . urlencode($REQUEST_URI)); } (תאריך). בכניסה הבאה, הקוקי מוגדר אוטומטית ללא אימות חוזר. זה משפר את שיעור ההמרה: לפי הנתונים שלנו, 40% מהקונים לא חוזרים כשהם נאלצים לאמת שוב.
איך להגדיר אימות למשתמשים מחוברים?
שדות UF OnSaleBasketItemAdd ו-AddEventHandler('sale', 'OnSaleBasketItemAdd', function(&$arFields) { $productId = $arFields['PRODUCT_ID']; if (isAgeRestrictedProduct($productId) && !isAgeVerified()) { return new CDBResult(false, 'Подтвердите возраст для добавления товара'); } }); מתווספים לפרופיל המשתמש. באימות מוצלח הם מתמלאים, ובכניסה הבאה הקוקי מוגדר אוטומטית ללא חזרה על התהליך. אנו גם מגדירים חידוש קוקי אוטומטי דרך סוכנים אם המשתמש נשאר מחובר.
טעויות נפוצות ואיך להימנע מהן
הנה מה שנתקלנו בו עם לקוחות: שמירת מצב רק בקוקי (ניתן לעקוף בקלות), חוסר אימות ברמת העגלה (מוצרים יוצאים ללא אימות), טיפול לא נכון בפגיית קוקי (משתמשים לא יכולים להשלים רכישה), התעלמות ממשתמשים מחוברים (אימות חוזר מפחית המרה). למדנו להימנע מטעויות אלה במשך יותר מ-10 שנות עבודה עם Bitrix.
מה כלול בעבודה
- ניתוח דרישות ובחירת רמת אימות.
- תכנון תכנית ואב-טיפוס.
- פיתוח חלונות מודאליים, handlers, הגבלות.
- אינטגרציה עם ESIA או שירותים אחרים (אם נדרש).
- בדיקת כל התרחישים: כניסה, עגלה, פגיית קוקי.
- תיעוד תפעולי והדרכת צוות.
- הגדרת ניטור ותמיכה לאחר השקה.
לוח זמנים לתהליך
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח דרישות | יום אחד | בחירת רמה ותכנית אינטגרציה |
| עיצוב | 1-2 ימים | אב-טיפוס ובחירת רכיבים |
| פיתוח | 2-5 ימים | חלון מודאלי, handlers, הגבלות |
| אינטגרציית ESIA | 5-10 ימים | קריאות REST, אימות דרכון |
| בדיקות | 1-2 ימים | כל התרחישים נבדקו |
| השקה | יום אחד | הגדרת קאש וניטור |
אנו מבטיחים שהמערכת תעבור כל בדיקה של השירות הפדרלי לרגולציית אלכוהול. צרו קשר — קבלו ייעוץ והערכה מוקדמת ביום אחד. הזמינו הגדרת אימות והימנעו מסיכון קנסות.
בנוסף, אנו מחברים Bitrix24 REST API לסנכרון עם CRM ומערכות חיצוניות. המחיר מחושב באופן אישי לפי היקף ומורכבות האינטגרציה.







