ttools
тестированиеплатежиfake-dataразработка

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

Создавайте реалистичные номера кредитных карт для тестирования платёжных систем без риска. Валидные по алгоритму Луна.

Разработка платёжных систем требует реалистичных тестовых данных. Использовать настоящие номера карт запрещено по соображениям безопасности, а вводить рандомные цифры бессмысленно — платформы проверяют валидность через алгоритм Луна. Решение — генератор тестовых номеров, который создаёт правильно структурированные карты для песочниц и staging-окружений.

Почему нельзя тестировать на реальных картах

Использование настоящих номеров карт в разработке нарушает стандарт PCI DSS. Даже если храните данные локально, это создаёт риски:

  • Случайная фиксация в логах или репозитории
  • Утечка через отладочные инструменты
  • Незапланированные списания при ошибке в коде
  • Юридические проблемы при аудите безопасности

Платёжные провайдеры (Stripe, PayPal, Яндекс Касса) предоставляют тестовые окружения, но требуют валидные по структуре номера. Просто набрать 4111111111111111 недостаточно — нужны разные BIN-коды для проверки сценариев с Visa, MasterCard, American Express.

Как работает алгоритм Луна

Контрольная сумма Луна (Luhn algorithm) проверяет корректность номера карты за O(n) операций. Последняя цифра — проверочная, вычисляется из остальных:

function validateLuhn(cardNumber) {
  const digits = cardNumber.replace(/\D/g, '').split('').map(Number);
  let sum = 0;
  
  for (let i = digits.length - 2; i >= 0; i--) {
    let digit = digits[i];
    
    if ((digits.length - 1 - i) % 2 === 1) {
      digit *= 2;
      if (digit > 9) digit -= 9;
    }
    
    sum += digit;
  }
  
  return (sum + digits[digits.length - 1]) % 10 === 0;
}

Платёжные шлюзы отвергают карты, не прошедшие эту проверку, ещё до обращения к банку. Генератор должен правильно рассчитывать контрольную цифру, чтобы номер воспринимался как потенциально валидный.

Структура номера банковской карты

16-значный номер делится на несколько частей:

  • IIN/BIN (6 цифр) — идентификатор банка и платёжной системы. Например, карты Visa начинаются с 4, MasterCard — с 51-55 или 2221-2720
  • Номер счёта (9 цифр) — уникальный идентификатор внутри банка
  • Контрольная цифра (1 цифра) — результат алгоритма Луна

Для American Express используется 15 цифр, для Maestro — от 12 до 19. При генерации важно соблюдать правила конкретной платёжной системы, иначе тест-кейсы не покроют реальные сценарии.

Практические сценарии использования

Тестирование интеграции с платёжным шлюзом

При подключении Stripe API нужно проверить обработку разных типов карт:

test_cards = [
    "4242424242424242",  # Visa — успешная оплата
    "4000000000000002",  # Visa — отклонено
    "5555555555554444",  # MasterCard — успешная
    "378282246310005",   # Amex — требует CVV
]

for card in test_cards:
    response = stripe.PaymentIntent.create(
        amount=1000,
        currency="usd",
        payment_method_data={"type": "card", "card": {"number": card}}
    )
    assert response.status == "requires_capture"

Генератор позволяет быстро создать набор номеров с разными BIN-кодами для полного покрытия.

Заполнение БД фейковыми данными

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

// Генерация тестового профиля клиента
const user = {
  name: faker.name.fullName(),
  card: generateTestCard({ type: 'visa', bank: 'Sberbank' }),
  cvv: Math.floor(Math.random() * 900) + 100,
  expiry: '12/25'
};

Проверка валидации на фронтенде

Форма оплаты должна подсвечивать ошибки до отправки запроса. Генератор помогает создать батч валидных и невалидных номеров для unit-тестов:

describe('CardInput validation', () => {
  it('accepts valid Visa', () => {
    const input = '4539578763621486'; // Валидный по Луну
    expect(validateCard(input)).toBe(true);
  });
  
  it('rejects invalid checksum', () => {
    const input = '4539578763621487'; // Последняя цифра неверна
    expect(validateCard(input)).toBe(false);
  });
});

Безопасность при работе с тестовыми данными

Даже фейковые номера требуют аккуратности:

  • Не коммитьте в публичные репозитории — боты сканируют GitHub на паттерны карт и могут флагнуть проект
  • Маркируйте тестовые окружения — используйте префиксы вроде TEST_ в переменных окружения
  • Очищайте логи — middleware должен маскировать все 16-значные последовательности перед записью
  • Используйте песочницы — Stripe, Braintree, Adyen предоставляют отдельные API-ключи для разработки

Настройте .gitignore для исключения файлов с сидами:

# Тестовые данные
seeds/cards.json
test-data/*.csv

Альтернативы и дополнительные инструменты

Помимо генератора номеров карт, разработчикам платёжных систем понадобятся смежные инструменты. Для создания полноценных тестовых пользователей пригодится генератор паролей, чтобы имитировать регистрацию с безопасными учётными данными. При работе с API часто нужен генератор UUID для уникальных идентификаторов транзакций. Если тестируете международные платежи, конвертер Base64 поможет кодировать токены авторизации в заголовках запросов.

Все эти инструменты работают в браузере без отправки данных на сервер, что критично при разработке финансового софта.

Инструменты по теме