Клиентская проверка кредитных карт

Есть ли у кого-нибудь библиотека или фрагмент кода JavaScript для проверки контрольной цифры кредитных карт до того, как пользователь нажимает "Отправить"?

Ответ 2

Вероятно, OP больше не подходит к этой теме, но это может быть полезно для кого-то еще:

http://jquerycreditcardvalidator.com

Он проверяет тип карты, проверяет ее длину и проверяет mod 10 с алгоритмом Луна.

Ответ 3

Вы можете использовать этот фрагмент для проверки номеров карт на 16 цифр с помощью алгоритма Luhn:

function validateCardNumber(number) {
    var regex = new RegExp("^[0-9]{16}$");
    if (!regex.test(number))
        return false;

    return luhnCheck(number);
}

function luhnCheck(val) {
    var sum = 0;
    for (var i = 0; i < val.length; i++) {
        var intVal = parseInt(val.substr(i, 1));
        if (i % 2 == 0) {
            intVal *= 2;
            if (intVal > 9) {
                intVal = 1 + (intVal % 10);
            }
        }
        sum += intVal;
    }
    return (sum % 10) == 0;
}

Ответ 4

Алгоритм Луна (также известный как формула Луна) полезен для проверки множества идентификационных номеров (например, номеров кредитных карт, IMEI).

Я опускаю объяснение алгоритма, потому что он уже был обнаружен другими, но если вам нужна самая быстрая реализация Javascript, вы можете увидеть его .

Проще говоря...

function luhn(array) {
  return function (number) {
    let len = number ? number.length : 0,
      bit = 1,
      sum = 0;

    while (len--) {
      sum += !(bit ^= 1) ? parseInt(number[len], 10) : array[number[len]];
    }
    return sum % 10 === 0 && sum > 0;
  };
}([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]);

Обратите внимание, что связанный источник находится в ES6 языке (также известном как JavaScript 2015), но передается в ES5 (см. index.js), и он полностью протестирован.

Кроме того, он может использоваться как в браузерах, так и/или node.js.

Контрольные показатели и другая реализация находятся на jsperf, чтобы проверить его высокие показатели.

Теперь, если вы просто хотите использовать его, возьмите код из связанного репозитория.

В противном случае установите его через bower...

bower install luhn-alg

Или через npm...

npm install luhn-alg

Отказ от ответственности: я являюсь автором пакета luhn-alg.

Ответ 5

Вы можете использовать эту функцию, если вы еще не используете плагин jQuery. Он основан на алгоритме Луна и толерантен к пробелам или тире, поэтому он должен работать для большинства случаев ввода данных, в которых вы нуждаетесь.

http://af-design.com/blog/2010/08/18/validating-credit-card-numbers/

Ответ 6

Формула Луна - самый популярный алгоритм проверки валидации кредитной карты. И не бойтесь слова algorithm, что вы ищете библиотеку. Это невероятно легко понять. Из описания Википедии этот алгоритм можно разделить на три этапа:

  • Из самой правой цифры, которая является контрольной цифрой, перемещается влево, удваивает значение каждой второй цифры; если продукт этого операция удвоения больше 9 (например, 8 × 2 = 16), затем суммируют цифры продуктов (например, 16: 1 + 6 = 7, 18: 1 + 8 = 9).
  • Возьмите сумму всех цифр.
  • Если суммарный модуль 10 равен 0 (если сумма заканчивается в нуле), то число действует в соответствии с формулой Луна; иначе это не действительный.

Вот мой рабочий проект.

function luhn(anum){
    anum = anum+'';
    var sum = 0,
        max = anum.length - 1;
    //From the rightmost digit, which is the check digit, moving left
    for(var j=max;j>=0;j--){
        var digit = parseInt(anum[j]);
        //Take the sum of all the digits
        if((max - j) & 1){
            //double the value of every second digit
            var add = digit * 2;
            //if the product of this doubling operation is greater than 9 ,
            //then sum the digits of the products
            sum += add < 10 ? add : 1 + add % 10;
        }else{
            sum += digit;
        }
    }
    //If the total modulo 10 is equal to 0 (if the total ends in zero)
    //then the number is valid according to the Luhn formula;else it is not valid.
    return sum % 10 === 0;
}

luhn(79927398713) -> true