Форма оплаты банковской картой

Обработка платёжных данных в веб-интерфейсах требует строгого контроля формата ввода, поскольку данные банковских карт чувствительны к ошибкам и должны соответствовать стандартам платёжных систем. В типичной форме оплаты присутствуют несколько ключевых полей: номер карты, срок действия, код безопасности (CVC/CVV), иногда имя держателя. Основная задача фронтенда — обеспечить корректный ввод без лишней когнитивной нагрузки и снизить вероятность ошибок ещё до отправки данных на сервер.

Библиотека Cleave.js предоставляет специализированные механизмы маскирования и форматирования, включая встроенную поддержку банковских карт, автоматическое определение платёжной системы и динамическое форматирование номера карты.


Подключение и базовая инициализация

Работа с Cleave.js начинается с привязки к DOM-элементу ввода:

import Cleave from 'cleave.js';

const creditCardInput = new Cleave('.card-number-input', {
    creditCard: true
});

При включении параметра creditCard: true активируется комплексная логика:

  • автоматическое форматирование номера карты
  • определение платёжной системы (Visa, MasterCard, American Express и др.)
  • адаптация группировки цифр под тип карты

Форматирование номера банковской карты

Номер карты в исходном виде представляет собой непрерывную последовательность цифр, однако различные платёжные системы используют разные правила группировки:

  • Visa / MasterCard / Discover: XXXX XXXX XXXX XXXX
  • American Express: XXXX XXXXXX XXXXX

Cleave.js автоматически применяет соответствующую маску на основе первых введённых цифр (BIN — Bank Identification Number).

Пример поведения:

Input:  4111111111111111
Output:  4111 1111 1111 1111

Input:  378282246310005
Output:  3782 822463 10005

Форматирование происходит в реальном времени без необходимости дополнительной логики.


Определение типа карты

Одной из ключевых функций является определение типа карты. Cleave.js анализирует префикс номера и классифицирует карту.

Поддерживаются распространённые типы:

  • Visa
  • MasterCard
  • American Express
  • Discover
  • Diners Club
  • JCB

Для отслеживания изменений типа карты используется callback:

const creditCardInput = new Cleave('.card-number-input', {
    creditCard: true,
    onCreditCardTypeChanged: function (type) {
        console.log('Card type:', type);
    }
});

Механизм полезен для динамического UI:

  • отображение логотипа платёжной системы
  • изменение правил валидации CVV
  • адаптация UI формы под тип карты

Форматирование срока действия карты

Отдельное поле expiry date требует строгого формата MM/YY. Cleave.js поддерживает специализированный режим:

const expiryInput = new Cleave('.card-expiry-input', {
    date: true,
    datePattern: ['m', 'y']
});

Поведение формата:

  • автоматическая вставка разделителя /
  • ограничение месяца от 01 до 12
  • корректная обработка вставки значений из буфера обмена

Примеры преобразования:

Input:  1225
Output:  12/25

Input:  0529
Output:  05/29

Обработка CVC / CVV

Поле CVC/CVV не требует сложного форматирования, но важно учитывать различие в длине:

  • Visa / MasterCard / Discover: 3 цифры
  • American Express: 4 цифры

Cleave.js не навязывает строгую маску для CVV, однако логика ограничения обычно дополняется вручную:

const cvcInput = document.querySelector('.card-cvc-input');

cvcInput.addEventListener('input', function () {
    this.value = this.value.replace(/\D/g, '').slice(0, 4);
});

При интеграции с определением типа карты длина может адаптироваться динамически.


Автоматическое поведение при вставке данных

Cleave.js обрабатывает сценарии paste (вставка из буфера обмена), которые особенно критичны для платёжных форм. Без дополнительной настройки библиотека:

  • удаляет лишние символы
  • приводит строку к числовому формату
  • применяет корректную маску

Это снижает риск попадания пробелов, дефисов и текстовых символов в номер карты.


Обработка пользовательского ввода и нормализация данных

Форматирование в UI не означает, что данные отправляются в отформатированном виде. Cleave.js предоставляет доступ к «чистому» значению:

const creditCardInput = new Cleave('.card-number-input', {
    creditCard: true
});

const rawValue = creditCardInput.getRawValue();

getRawValue() возвращает строку без пробелов и масок:

4111111111111111

Это значение используется при отправке на сервер или в платёжный шлюз.


Интеграция с формами и событиями

Типичный сценарий интеграции включает отслеживание изменений:

const card = new Cleave('.card-number-input', {
    creditCard: true,
    onValueChanged: function (e) {
        console.log(e.target.value);
        console.log(card.getRawValue());
    }
});

Событие onValueChanged предоставляет объект с текущим состоянием ввода и позволяет:

  • синхронизировать состояние формы
  • запускать валидацию в реальном времени
  • обновлять UI-индикаторы

Сочетание с валидацией данных

Cleave.js не является валидатором, его задача ограничена форматированием. Поэтому он часто используется совместно с логикой проверки:

  • Luhn algorithm для проверки номера карты
  • проверка срока действия
  • проверка длины CVC

Пример проверки номера:

function luhnCheck(value) {
    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;
}

Cleave.js обеспечивает корректный формат, а алгоритм проверяет логическую валидность.


Поведение при автозаполнении браузером

Современные браузеры активно используют autofill для платёжных данных. Cleave.js корректно обрабатывает такие сценарии, однако возможны нюансы:

  • вставка полного номера без промежуточных событий
  • некорректное срабатывание маски при мгновенной подстановке

Решение заключается в повторной синхронизации значения:

setTimeout(() => {
    card.setRawValue(card.getRawValue());
}, 0);

Особенности работы с мобильными устройствами

На мобильных устройствах поведение клавиатуры влияет на ввод:

  • автоматическая подстановка пробелов iOS
  • замена символов в Android-клавиатурах
  • различия в обработке backspace

Cleave.js компенсирует эти особенности за счёт перехвата input-событий и нормализации строки после каждого изменения.


Производительность и ограничения

Форматирование карты — операция, выполняемая на каждом вводе символа. Cleave.js оптимизирован для минимальной нагрузки, однако при большом количестве инстансов следует учитывать:

  • избегание лишних инициализаций
  • очистка экземпляров при уничтожении компонентов
  • переиспользование логики в рамках SPA

Структура типичной платёжной формы с Cleave.js

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

  • номер карты с creditCard: true
  • срок действия с datePattern: ['m', 'y']
  • CVV с ограничением длины

Связка этих элементов формирует единый поток ввода, где каждое поле выполняет строго определённую роль, а Cleave.js отвечает за приведение пользовательского ввода к стандартизированному виду без вмешательства в бизнес-логику приложения.