Валидация банковских реквизитов

Банковские реквизиты представляют собой строго структурированные данные, которые подчиняются формальным правилам формирования и проверки. К таким данным относятся номера банковских карт, IBAN, SWIFT/BIC-коды, расчётные счета, а также национальные форматы реквизитов (например, БИК и корреспондентские счета в российской банковской системе). Ошибка даже в одном символе приводит к невозможности проведения транзакции, поэтому валидация должна быть формализованной и детерминированной.

В JavaScript для этих целей часто используется библиотека validator.js, предоставляющая набор базовых проверок строковых значений, а также возможность расширения через пользовательские правила.


Роль Validator.js в проверке финансовых данных

Библиотека validator.js ориентирована на работу со строками и реализует множество готовых валидаторов: email, URL, числовые диапазоны, UUID и другие. Несмотря на отсутствие специализированных банковских валидаторов «из коробки», она эффективно применяется как основа для построения финансовой валидации через комбинацию стандартных методов и кастомных функций.

Ключевые особенности применения:

  • проверка формата (regex-based validation);
  • нормализация входных данных;
  • композирование сложных правил;
  • расширение через пользовательские валидаторы.

Проверка номеров банковских карт (Luhn algorithm)

Номера банковских карт подчиняются алгоритму Луна, который позволяет выявлять большинство ошибок ввода.

Validator.js не содержит встроенного метода для Luhn, поэтому используется кастомная реализация:

import validator from 'validator';

function isValidCardNumber(value) {
  if (!validator.isNumeric(value)) return false;

  let sum = 0;
  let shouldDouble = false;

  for (let i = value.length - 1; i >= 0; i--) {
    let digit = parseInt(value[i], 10);

    if (shouldDouble) {
      digit *= 2;
      if (digit > 9) digit -= 9;
    }

    sum += digit;
    shouldDouble = !shouldDouble;
  }

  return sum % 10 === 0;
}

Комбинация validator.isNumeric() и алгоритма Луна обеспечивает базовую защиту от некорректного ввода.


Валидация IBAN

IBAN (International Bank Account Number) используется в международных переводах и включает контрольную сумму.

Стандартная проверка включает:

  • проверку длины;
  • проверку допустимых символов;
  • перестановку символов;
  • вычисление по модулю 97.

Пример реализации с использованием validator.js как вспомогательного инструмента:

import validator from 'validator';

function isValidIBAN(iban) {
  const trimmed = iban.replace(/\s+/g, '').toUpperCase();

  if (!validator.isAlphanumeric(trimmed)) return false;
  if (trimmed.length < 15 || trimmed.length > 34) return false;

  const rearranged = trimmed.slice(4) + trimmed.slice(0, 4);

  const expanded = rearranged.replace(/[A-Z]/g, char =>
    (char.charCodeAt(0) - 55).toString()
  );

  let remainder = expanded;
  while (remainder.length > 2) {
    const block = remainder.slice(0, 9);
    remainder = (parseInt(block, 10) % 97).toString() + remainder.slice(block.length);
  }

  return parseInt(remainder, 10) % 97 === 1;
}

Validator.js применяется здесь для первичной фильтрации символов и нормализации строки.


Проверка SWIFT/BIC кодов

SWIFT/BIC коды имеют фиксированную структуру:

  • 4 буквы — код банка;
  • 2 буквы — код страны;
  • 2 символа — локация;
  • 3 символа (опционально) — филиал.

С использованием validator.js:

import validator from 'validator';

function isValidBIC(value) {
  const bic = value.toUpperCase();

  if (!validator.isLength(bic, { min: 8, max: 11 })) return false;
  if (!validator.isAlphanumeric(bic)) return false;

  const bankCode = bic.slice(0, 4);
  const countryCode = bic.slice(4, 6);

  if (!validator.isAlpha(bankCode)) return false;
  if (!validator.isAlpha(countryCode)) return false;

  return true;
}

Дополнительная строгость может вводиться через список допустимых ISO-кодов стран.


Валидация национальных банковских реквизитов

В локальных банковских системах используются дополнительные идентификаторы.

БИК (банковский идентификационный код)

Структура БИК обычно включает 9 цифр. Проверка:

import validator from 'validator';

function isValidBIK(value) {
  return validator.isLength(value, { min: 9, max: 9 }) &&
         validator.isNumeric(value);
}

Расчётный счёт

Расчётный счёт может содержать контрольную сумму, зависящую от БИК и типа счёта. Универсальная проверка часто ограничивается форматом:

function isValidAccountNumber(value) {
  return validator.isLength(value, { min: 20, max: 20 }) &&
         validator.isNumeric(value);
}

Комбинированная валидация банковского объекта

Практические сценарии требуют проверки целого набора реквизитов одновременно.

function validateBankDetails(data) {
  return {
    cardNumber: isValidCardNumber(data.cardNumber),
    iban: isValidIBAN(data.iban),
    bic: isValidBIC(data.bic),
    bik: isValidBIK(data.bik),
    account: isValidAccountNumber(data.account)
  };
}

Такой подход позволяет разделять ответственность между валидаторами и упрощает диагностику ошибок.


Кастомизация правил в Validator.js

Библиотека validator.js поддерживает расширение через добавление собственных функций:

import validator from 'validator';

validator.extend('isBankAccount', function (str) {
  return validator.isNumeric(str) && validator.isLength(str, { min: 20, max: 20 });
});

Использование:

validator.isBankAccount('40817810099910004312');

Нормализация банковских данных перед валидацией

Перед проверкой часто требуется очистка входных значений:

  • удаление пробелов;
  • приведение к верхнему регистру;
  • удаление разделителей.
function normalizeBankInput(value) {
  return value.replace(/[\s-]/g, '').toUpperCase();
}

Нормализация снижает количество ложных ошибок при валидации.


Типовые ошибки при проверке реквизитов

  • игнорирование регистра в SWIFT/BIC;
  • отсутствие проверки контрольных сумм;
  • смешивание форматов разных стран;
  • использование только regex без алгоритмической проверки;
  • отсутствие нормализации входных данных.

Корректная архитектура валидации требует разделения синтаксической и семантической проверки.


Интеграция Validator.js в прикладные системы

Валидация банковских реквизитов обычно используется на нескольких уровнях:

  • клиентская проверка формы;
  • серверная валидация API-запросов;
  • проверка перед интеграцией с платёжными шлюзами;
  • очистка данных при миграции.

validator.js применяется как базовый слой, поверх которого строятся доменные правила финансовых систем, обеспечивая единый подход к обработке строковых данных.