Банковские реквизиты представляют собой строго структурированные данные, которые подчиняются формальным правилам формирования и проверки. К таким данным относятся номера банковских карт, IBAN, SWIFT/BIC-коды, расчётные счета, а также национальные форматы реквизитов (например, БИК и корреспондентские счета в российской банковской системе). Ошибка даже в одном символе приводит к невозможности проведения транзакции, поэтому валидация должна быть формализованной и детерминированной.
В JavaScript для этих целей часто используется библиотека validator.js, предоставляющая набор базовых проверок строковых значений, а также возможность расширения через пользовательские правила.
Библиотека validator.js ориентирована на работу со строками и реализует множество готовых валидаторов: email, URL, числовые диапазоны, UUID и другие. Несмотря на отсутствие специализированных банковских валидаторов «из коробки», она эффективно применяется как основа для построения финансовой валидации через комбинацию стандартных методов и кастомных функций.
Ключевые особенности применения:
Номера банковских карт подчиняются алгоритму Луна, который позволяет выявлять большинство ошибок ввода.
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 (International Bank Account Number) используется в международных переводах и включает контрольную сумму.
Стандартная проверка включает:
Пример реализации с использованием 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 коды имеют фиксированную структуру:
С использованием 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 поддерживает расширение через добавление собственных функций:
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();
}
Нормализация снижает количество ложных ошибок при валидации.
Корректная архитектура валидации требует разделения синтаксической и семантической проверки.
Валидация банковских реквизитов обычно используется на нескольких уровнях:
validator.js применяется как базовый слой, поверх которого строятся доменные правила финансовых систем, обеспечивая единый подход к обработке строковых данных.