הגדרת אימות טלפון בתשלום ב-1C-Bitrix

הגדרת אימות טלפון בתשלום ב-1C-Bitrix כל הזמנה עשירית בחנות מקוונת של Bitrix מכילה מספר טלפון מזויף. רמאים משתמשים במספרים וירטואליים חד-פעמיים כדי לבצע הזמנות עם נתונים מזויפים - מה שמוביל להפסדים בלוגיסטיקה והחזרות. לדוגמה, בחנות מקוונת אחת, הזמנות הונאה...
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
הגדרת אימות טלפון בתשלום ב-1C-Bitrix
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    פיתוח אתר לחברת FIXPER
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • image_crm_dolbimby_434_0.webp
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1164

הגדרת אימות טלפון בעת תשלום ב-1C-Bitrix

כל הזמנה עשירית בחנות מקוונת של Bitrix מכילה מספר טלפון מזויף. רמאים משתמשים במספרים וירטואליים חד-פעמיים כדי לבצע הזמנות עם נתונים מזויפים — דבר שמוביל להפסדים בלוגיסטיקה והחזרות. לדוגמה, בחנות מקוונת אחת, הזמנות הונאה היוו 12% מסך הנפח, וגרמו להפסדים של למעלה מ-$2.7k–3.9k בחודש על משלוחים לא מוצדקים. אימות טלפון OTP בשלב התשלום פותר בעיה זו: הקונה חייב לאשר את המספר על ידי הזנת קוד מה-SMS. ללא אישור, ההזמנה לא מתבצעת. אנו מיישמים הגנה כזו במפתח מלא, תוך התאמה לכל לוגיקת הזמנה. בקשו יישום — ושכחו מהזמנות מזויפות.

אימות OTP עוזר לסנן לא רק רמאים אלא גם שגיאות הקלדה מקריות. אם הלקוח טועה בספרה, הוא מיד מבחין שה-SMS לא הגיע ויכול לתקן את המספר לפני ביצוע ההזמנה. זה מפחית את מספר ההזמנות ה'אבודות' עקב פרטי קשר שגויים.

כיצד להגדיר אימות טלפון בעת תשלום?

אימות SMS חוסם עד 95% מההזמנות המשתמשות במספרים וירטואליים. עבור לקוחות אמיתיים, התהליך אורך לא יותר מ-20 שניות. המפתח הוא למנוע ניחוש קוד וספאם. ביישום שלנו:

  • מגבלת שליחה: לא יותר מ-3 SMS למספר בתוך 10 דקות (מונה ב-Bitrix\Main\Application::getInstance()->getManagedCache()).
  • גיבוב קוד: password_hash עם PASSWORD_DEFAULT — גם במקרה של דליפת סשן, לא ניתן לשחזר את הקוד.
  • מחיקה אוטומטית של נתונים לאחר הזמנה מוצלחת או פקיעת טיימר (5 דקות).

אמצעים אלה הופכים ניחוש קוד לבלתי אפשרי כמעט: עם שלושה ניסיונות כל 10 דקות, ההסתברות לנחש קוד בן 6 ספרות (1,000,000 צירופים) היא 0.0003%. היישום המותאם שלנו אמין פי 5 ממודולים מוכנים מבחינת מהירות תגובה לפעילות חשודה. אפקט נוסף הוא הפחתת עלויות תפעוליות להחזרות בעד $1.8k–2.6k בחודש.

מדוע פיתוח מותאם עדיף על מודול מוכן?

מודולי OTP מוכנים מה-Marketplace כוללים לעיתים קרובות פונקציונליות מיותרת ולא תמיד מתחשבים במאפייני החנות שלך — לדוגמה, אינטגרציה עם 1C או עבודה עם הנחות. פיתוח מותאם נותן לך שליטה מלאה על הקוד ואינטגרציה קלה עם אירועים ותהליכים עסקיים קיימים. אתה מקבל בדיוק מה שאתה צריך, ללא תלות מיותרת. חיסכון בזמן על שינויים בהשוואה למודול סטנדרטי מגיע עד 40%.

פרמטר ללא אימות עם אימות OTP (הפתרון שלנו)
חלק ההזמנות המזויפות עד 12% 0.5–1%
זמן לאימות מספר 0 20 שניות
סיכון לדליפת קוד נמוך (גיבוב, מגבלות)
עלות יישום (זמן) 2–6 ימים
תלות בשירותים חיצוניים ספק SMS (כל אחד)

יישום טכני של אימות OTP

תהליך OTP (שלב אחר שלב)

  1. המשתמש ממלא מספר טלפון בטופס ההזמנה.
  2. באירוע blur, נשלחת בקשת AJAX אל /local/ajax/phone-otp-send.php.
  3. השרת בודק אסימון CSRF, פורמט מספר ומגבלת ניסיונות.
  4. נוצר קוד בן 6 ספרות, מגובב ומאוחסן בסשן (או ב-Redis).
  5. SMS נשלח דרך \Bitrix\MessageService\Sender\MessageManager.
  6. הלקוח מזין את הקוד — בקשת AJAX אל /local/ajax/phone-otp-verify.php.
  7. אם הקוד נכון ולא פג, מוגדר דגל verified בסשן.
  8. במהלך ביצוע ההזמנה, האירוע בודק את הדגל וחוסם את ההזמנה בלעדיו.

קוד: שליחה, אימות וחסימת הזמנה

// /local/ajax/phone-otp-send.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $phone = preg_replace('/\D/', '', $_POST['phone'] ?? ''); $csrfOk = check_bitrix_sessid(); if (!$csrfOk || strlen($phone) < 10 || strlen($phone) > 15) { http_response_code(400); echo json_encode(['error' => 'Invalid request']); exit; } // Лимит: не более 3 отправок на номер за 10 минут $cacheKey = 'otp_attempts_' . md5($phone); $attempts = (int)(\Bitrix\Main\Application::getInstance() ->getManagedCache()->get($cacheKey) ?? 0); if ($attempts >= 3) { echo json_encode(['error' => 'Слишком много попыток. Подождите 10 минут.']); exit; } // Генерируем 6-значный код $code = (string)random_int(100000, 999999); $expiresAt = time() + 300; // 5 минут // Сохраняем в сессии (или в Redis) \Bitrix\Main\Application::getInstance()->getSession()->set('otp_data', [ 'phone' => $phone, 'code' => password_hash($code, PASSWORD_DEFAULT), 'expires_at' => $expiresAt, 'verified' => false, ]); // Инкрементируем счётчик попыток \Bitrix\Main\Application::getInstance()->getManagedCache()->set($cacheKey, $attempts + 1, 600); // Отправляем SMS через модуль Битрикс (SMS-провайдер настраивается в административной части) $smsManager = new \Bitrix\MessageService\Sender\MessageManager('sms'); $result = $smsManager->enqueueMessage([ 'MESSAGE_TO' => '+' . $phone, 'MESSAGE_BODY' => "Ваш код подтверждения: {$code}. Действует 5 минут.", ]); echo json_encode([ 'success' => $result->isSuccess(), 'expires_at' => $expiresAt, 'masked_phone' => '+' . substr($phone, 0, 3) . '***' . substr($phone, -2), ]); 
// /local/ajax/phone-otp-verify.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $inputCode = trim($_POST['code'] ?? ''); $session = \Bitrix\Main\Application::getInstance()->getSession(); $otpData = $session->get('otp_data'); if (!$otpData || time() > $otpData['expires_at']) { echo json_encode(['success' => false, 'error' => 'Код истёк. Запросите новый.']); exit; } if (!password_verify($inputCode, $otpData['code'])) { echo json_encode(['success' => false, 'error' => 'Неверный код.']); exit; } // Помечаем телефон как подтверждённый $otpData['verified'] = true; $session->set('otp_data', $otpData); echo json_encode(['success' => true]); 
AddEventHandler('sale', 'OnBeforeOrderFinalAction', function(\Bitrix\Sale\Order $order) { if ($order->getId() > 0) return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); $otpData = \Bitrix\Main\Application::getInstance()->getSession()->get('otp_data'); $props = $order->getPropertyCollection(); $phone = preg_replace('/\D/', '', $props->getItemByOrderPropertyCode('PHONE')?->getValue() ?? ''); if (empty($otpData['verified']) || !$otpData['verified'] || $otpData['phone'] !== $phone) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error('Пожалуйста, подтвердите номер телефона.') ); } // Сбрасываем OTP после использования \Bitrix\Main\Application::getInstance()->getSession()->delete('otp_data'); return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); }); 
Frontend: PhoneVerification Class
class PhoneVerification { constructor(formSelector) { this.form = document.querySelector(formSelector); this.phoneInput = this.form?.querySelector('[name="PHONE"]'); this.otpBlock = document.createElement('div'); this.countdown = null; } init() { this.phoneInput?.addEventListener('blur', () => this.showOtpRequest()); } async sendOtp() { const phone = this.phoneInput.value; const res = await fetch('/local/ajax/phone-otp-send.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `phone=${encodeURIComponent(phone)}&sessid=${BX.bitrix_sessid()}`, }).then(r => r.json()); if (res.success) { this.showCodeInput(res.expires_at, res.masked_phone); } else { this.showError(res.error); } } showCodeInput(expiresAt, maskedPhone) { this.otpBlock.innerHTML = ` <p>Код отправлен на ${maskedPhone}</p> <input type="text" id="otp-code" maxlength="6" inputmode="numeric" autocomplete="one-time-code" placeholder="_ _ _ _ _ _"> <button type="button" id="verify-btn">Подтвердить</button> <span id="otp-timer"></span> `; this.startCountdown(expiresAt); document.getElementById('verify-btn').addEventListener('click', () => this.verifyCode()); } async verifyCode() { const code = document.getElementById('otp-code').value; const res = await fetch('/local/ajax/phone-otp-verify.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `code=${encodeURIComponent(code)}&sessid=${BX.bitrix_sessid()}`, }).then(r => r.json()); if (res.success) { this.otpBlock.innerHTML = '<p class="verified">✓ Телефон подтверждён</p>'; clearInterval(this.countdown); // Разблокируем кнопку оформления заказа document.querySelector('.btn-checkout-submit')?.removeAttribute('disabled'); } else { document.getElementById('otp-code').classList.add('is-error'); } } startCountdown(expiresAt) { const timer = document.getElementById('otp-timer'); this.countdown = setInterval(() => { const left = Math.max(0, expiresAt - Math.floor(Date.now() / 1000)); timer.textContent = `Код действителен ${left} сек`; if (left === 0) { clearInterval(this.countdown); timer.textContent = 'Код истёк. Запросите новый.'; } }, 1000); } } 

אינטגרציה עם ספקי SMS וזמני ביצוע

כיצד לשלב אימות OTP עם ספקי SMS?

המודול // /local/ajax/phone-otp-send.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $phone = preg_replace('/\D/', '', $_POST['phone'] ?? ''); $csrfOk = check_bitrix_sessid(); if (!$csrfOk || strlen($phone) < 10 || strlen($phone) > 15) { http_response_code(400); echo json_encode(['error' => 'Invalid request']); exit; } // Лимит: не более 3 отправок на номер за 10 минут $cacheKey = 'otp_attempts_' . md5($phone); $attempts = (int)(\Bitrix\Main\Application::getInstance() ->getManagedCache()->get($cacheKey) ?? 0); if ($attempts >= 3) { echo json_encode(['error' => 'Слишком много попыток. Подождите 10 минут.']); exit; } // Генерируем 6-значный код $code = (string)random_int(100000, 999999); $expiresAt = time() + 300; // 5 минут // Сохраняем в сессии (или в Redis) \Bitrix\Main\Application::getInstance()->getSession()->set('otp_data', [ 'phone' => $phone, 'code' => password_hash($code, PASSWORD_DEFAULT), 'expires_at' => $expiresAt, 'verified' => false, ]); // Инкрементируем счётчик попыток \Bitrix\Main\Application::getInstance()->getManagedCache()->set($cacheKey, $attempts + 1, 600); // Отправляем SMS через модуль Битрикс (SMS-провайдер настраивается в административной части) $smsManager = new \Bitrix\MessageService\Sender\MessageManager('sms'); $result = $smsManager->enqueueMessage([ 'MESSAGE_TO' => '+' . $phone, 'MESSAGE_BODY' => "Ваш код подтверждения: {$code}. Действует 5 минут.", ]); echo json_encode([ 'success' => $result->isSuccess(), 'expires_at' => $expiresAt, 'masked_phone' => '+' . substr($phone, 0, 3) . '***' . substr($phone, -2), ]); מהקופסה תומך ב-SMS.ru, SMSC.ru, MessageBird. אם הספק שלך לא ברשימה, אנו יכולים לחבר אחד מותאם — פשוט יש ליישם את הממשק // /local/ajax/phone-otp-verify.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $inputCode = trim($_POST['code'] ?? ''); $session = \Bitrix\Main\Application::getInstance()->getSession(); $otpData = $session->get('otp_data'); if (!$otpData || time() > $otpData['expires_at']) { echo json_encode(['success' => false, 'error' => 'Код истёк. Запросите новый.']); exit; } if (!password_verify($inputCode, $otpData['code'])) { echo json_encode(['success' => false, 'error' => 'Неверный код.']); exit; } // Помечаем телефон как подтверждённый $otpData['verified'] = true; $session->set('otp_data', $otpData); echo json_encode(['success' => true]); . התצורה נעשית דרך לוח הניהול: הגדרות → שירותי SMS. פרטים נוספים על המודול ניתן למצוא ב-תיעוד מודול MessageService.

זמני ביצוע

תצורה זמן ביצוע
OTP (שליחה + אימות + חסימת הזמנה) 2–3 ימים
+ Frontend עם טיימר ומשוב +1–2 ימים
+ ספק SMS מותאם +1 יום

מה אתה מקבל כתוצאה

  • סט מלא של סקריפטים PHP ומחלקות JS עם הערות.
  • קוד מוכן לפריסה המשולב בבנייה שלך.
  • הוראות לחיבור כל ספק SMS.
  • אחריות שהקוד לא שובר פונקציונליות קיימת (נבדק בסביבת staging).
  • מעל 50 יישומים מוצלחים על ידי המהנדסים שלנו.

פתרון בעיות אספקת SMS

אם לקוח לא מקבל SMS, סיבות אפשריות כוללות חסימת הודעה על ידי הספק, מספר שגוי או עיכוב במשלוח. הפתרון שלנו כולל כפתור 'בקש קוד שוב' לאחר 60 שניות (טיימר Frontend). לאחר שלושה ניסיונות שליחה כושלים, המספר נחסם זמנית. אם הבעיה מערכתית, המנהל יכול לצפות ביומני שליחה במודול AddEventHandler('sale', 'OnBeforeOrderFinalAction', function(\Bitrix\Sale\Order $order) { if ($order->getId() > 0) return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); $otpData = \Bitrix\Main\Application::getInstance()->getSession()->get('otp_data'); $props = $order->getPropertyCollection(); $phone = preg_replace('/\D/', '', $props->getItemByOrderPropertyCode('PHONE')?->getValue() ?? ''); if (empty($otpData['verified']) || !$otpData['verified'] || $otpData['phone'] !== $phone) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error('Пожалуйста, подтвердите номер телефона.') ); } // Сбрасываем OTP после использования \Bitrix\Main\Application::getInstance()->getSession()->delete('otp_data'); return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); }); . צור קשר להערכה חינמית של הפרויקט שלך — נספר לך כיצד לסגור במהירות את החולשה של הזמנות הונאה. המומחים שלנו עם ניסיון של 5+ שנים יישמו אימות OTP במפתח מלא.