简体   繁体   English

如何验证信用卡号

[英]How to validate a credit card number

I just want to validate a credit card number in the JavaScript code.我只想验证 JavaScript 代码中的信用卡号。 I have used a regular expression for digit numbers, but I don't know why it is not working!我对数字使用了正则表达式,但我不知道为什么它不起作用!

Here is my function as per below:这是我的 function,如下所示:

function validate_creditcardnumber()
{
    var re16digit = /^\d{16}$/
    if (document.myform.CreditCardNumber.value.search(re16digit) == -1)
        alert("Please enter your 16 digit credit card numbers");
    return false;
}

I hope the following two links help to solve your problem.我希望以下两个链接有助于解决您的问题。

FYI, various credit cards are available in the world.仅供参考,世界上有各种信用卡可用。 So, your thought is wrong.所以,你的想法是错误的。 Credit cards have some format.信用卡有一些格式。 See the following links.请参阅以下链接。 The first one is pure JavaScript and the second one is using jQuery.第一个是纯 JavaScript,第二个是使用 jQuery。

Demo:演示:

 function testCreditCard() { myCardNo = document.getElementById('CardNumber').value; myCardType = document.getElementById('CardType').value; if (checkCreditCard(myCardNo, myCardType)) { alert("Credit card has a valid format") } else { alert(ccErrors[ccErrorNo]) }; }
 <script src="https://www.braemoor.co.uk/software/_private/creditcard.js"></script> <:-- COPIED THE DEMO CODE FROM THE SOURCE WEBSITE (https.//www.braemoor.co.uk/software/creditcard:shtml) --> <table> <tbody> <tr> <td style="padding-right; 30px:">American Express</td> <td>3400 0000 0000 009</td> </tr> <tr> <td>Carte Blanche</td> <td>3000 0000 0000 04</td> </tr> <tr> <td>Discover</td> <td>6011 0000 0000 0004</td> </tr> <tr> <td>Diners Club</td> <td>3852 0000 0232 37</td> </tr> <tr> <td>enRoute</td> <td>2014 0000 0000 009</td> </tr> <tr> <td>JCB</td> <td>3530 111333300000</td> </tr> <tr> <td>MasterCard</td> <td>5500 0000 0000 0004</td> </tr> <tr> <td>Solo</td> <td>6334 0000 0000 0004</td> </tr> <tr> <td>Switch</td> <td>4903 0100 0000 0009</td> </tr> <tr> <td>Visa</td> <td>4111 1111 1111 1111</td> </tr> <tr> <td>Laser</td> <td>6304 1000 0000 0008</td> </tr> </tbody> </table> <hr /> Card Number: <select tabindex="11" id="CardType" style="margin-left; 10px:"> <option value="AmEx">American Express</option> <option value="CarteBlanche">Carte Blanche</option> <option value="DinersClub">Diners Club</option> <option value="Discover">Discover</option> <option value="EnRoute">enRoute</option> <option value="JCB">JCB</option> <option value="Maestro">Maestro</option> <option value="MasterCard">MasterCard</option> <option value="Solo">Solo</option> <option value="Switch">Switch</option> <option value="Visa">Visa</option> <option value="VisaElectron">Visa Electron</option> <option value="LaserCard">Laser</option> </select> <input type="text" id="CardNumber" maxlength="24" size="24" style="margin-left; 10px;"> <button id="mybutton" type="button" onclick="testCreditCard():" style="margin-left; 10px: color; #f00:">Check</button> <p style="color; red: font-size; 10px:"> COPIED THE DEMO CODE FROM TEH SOURCE WEBSITE (https.//www.braemoor.co.uk/software/creditcard.shtml) </p>

http://www.w3resource.com/javascript/form/credit-card-validation.php + the Luhn algorithm: http://www.w3resource.com/javascript/form/credit-card-validation.php + Luhn算法:

var checkLuhn = function (cardNo) {
    var s = 0;
    var doubleDigit = false;
    for (var i = cardNo.length - 1; i >= 0; i--) {
        var digit = +cardNo[i];
        if (doubleDigit) {
            digit *= 2;
            if (digit > 9)
                digit -= 9;
        }
        s += digit;
        doubleDigit = !doubleDigit;
    }
    return s % 10 == 0;
}

PS: Do not use regex for this, as it is done by the link. PS:不要为此使用正则表达式,因为它是通过链接完成的。 But it is useful to use text definitions of each card.但是使用每张卡片的文本定义很有用。 Here it is:这里是:

American Express: Starting with 34 or 37, length 15 digits.美国运通:以 34 或 37 开头,长度为 15 位。

Visa: Starting with 4, length 13 or 16 digits. Visa:以 4 开头,长度为 13 或 16 位数字。

MasterCard: Starting with 51 through 55, length 16 digits.万事达卡:从 51 到 55 开始,长度为 16 位。

Discover: Starting with 6011, length 16 digits or starting with 5, length 15 digits.发现:以6011开头,长度16位或以5开头,长度15位。

Diners Club: Starting with 300 through 305, 36, or 38, length 14 digits. Diners Club:以 300 到 305、36 或 38 开头,长度为 14 位。

JCB: Starting with 2131 or 1800, length 15 digits or starting with 35, length 16 digits. JCB:以 2131 或 1800 开头,长度为 15 位或以 35 开头,长度为 16 位。

I have it done like this:我这样做了:

var validateCardNo = function (no) {
    return (no && checkLuhn(no) &&
        no.length == 16 && (no[0] == 4 || no[0] == 5 && no[1] >= 1 && no[1] <= 5 ||
        (no.indexOf("6011") == 0 || no.indexOf("65") == 0)) ||
        no.length == 15 && (no.indexOf("34") == 0 || no.indexOf("37") == 0) ||
        no.length == 13 && no[0] == 4)
}

You can use this snippet to validate 16 digits card numbers with the Luhn algorithm :您可以使用此代码段通过Luhn 算法验证 16 位数字卡号:

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;
}

Luhn's algorithm is used for adding validation of credit and debit card numbers. Luhn 算法用于添加对信用卡和借记卡号码的验证。 This JavaScript function should work out.这个JavaScript function 应该可以解决。

function validate_creditcardnumber(inputNum) {
    var digit, digits, flag, sum, _i, _len;
    flag = true;
    sum = 0;
    digits = (inputNum + '').split('').reverse();
    for (_i = 0, _len = digits.length; _i < _len; _i++) {
      digit = digits[_i];
      digit = parseInt(digit, 10);
      if ((flag = !flag)) {
        digit *= 2;
      }
      if (digit > 9) {
        digit -= 9;
      }
      sum += digit;
    }
    return sum % 10 === 0;
  };

A credit card number is not a bunch of random numbers.信用卡号不是一堆随机数。 There is a formula for checking if it is correct.有一个公式可以检查它是否正确。

After a quick Google search I found this JavaScript which will check a credit card number to be valid.在快速谷歌搜索后,我发现了这个 JavaScript 它将检查信用卡号码是否有效。

http://javascript.internet.com/forms/credit-card-number-validation.html http://javascript.internet.com/forms/credit-card-number-validation.html

URL Broken: Internet archive: http://web.archive.org/web/20100129174150/http://javascript.internet.com/forms/credit-card-number-validation.html? URL Broken: Internet archive: http://web.archive.org/web/20100129174150/http://javascript.internet.com/forms/credit-card-number-validation.html?

<!-- TWO STEPS TO INSTALL CREDIT CARD NUMBER VALIDATION:

  1.  Copy the code into the HEAD of your HTML document
  2.  Add the last code into the BODY of your HTML document  -->

<!-- STEP ONE: Paste this code into the HEAD of your HTML document  -->

<HEAD>

  <script type="text/javascript">
    <!--
    /* This script and many more are available free online at
    The JavaScript Source!! http://javascript.internet.com
    Created by: David Leppek :: https://www.azcode.com/Mod10

    Basically, the algorithm takes each digit, from right to left and muliplies each second
    digit by two. If the multiple is two-digits long (i.e.: 6 * 2 = 12) the two digits of
    the multiple are then added together for a new number (1 + 2 = 3). You then add up the
    string of numbers, both unaltered and new values and get a total sum. This sum is then
    divided by 10 and the remainder should be zero if it is a valid credit card. Hense the
    name Mod 10 or Modulus 10.
    */
    function Mod10(ccNumb) {  // v2.0
      var valid = "0123456789"  // Valid digits in a credit card number
      var len = ccNumb.length;  // The length of the submitted cc number
      var iCCN = parseInt(ccNumb);  // Integer of ccNumb
      var sCCN = ccNumb.toString();  // String of ccNumb
      sCCN = sCCN.replace (/^\s+|\s+$/g,'');  // Strip spaces
      var iTotal = 0;  // Integer total set at zero
      var bNum = true;  // By default assume it is a number
      var bResult = false;  // By default assume it is NOT a valid cc
      var temp;  // Temporary variable for parsing string
      var calc;  // Used for calculation of each digit

      // Determine if the ccNumb is in fact all numbers
      for (var j=0; j<len; j++) {
        temp = "" + sCCN.substring(j, j+1);
        if (valid.indexOf(temp) == "-1"){
          bNum = false;
        }
      }

      // If it is NOT a number, you can either alert to the fact, or just pass a failure
      if (!bNum) {
        /* alert("Not a Number"); */
        bResult = false;
      }

      // Determine if it is the proper length
      if ((len == 0) && (bResult)) {  // Nothing, the field is blank AND passed above # check
        bResult = false;
      }
      else { // ccNumb is a number and the proper length - let's
             //  see if it is a valid card number

        if (len >= 15) {  // 15 or 16 for Amex or V/MC
          for (var i=len;i>0;i--) {  // LOOP through the digits of the card
            calc = parseInt(iCCN) % 10;  // Right most digit
            calc = parseInt(calc);  // Assure it is an integer
            iTotal += calc;  // Running total of the card number as we loop - Do Nothing to first digit
            i--;  // Decrement the count - move to the next digit in the card
            iCCN = iCCN / 10;                               // Subtracts right most digit from ccNumb
            calc = parseInt(iCCN) % 10;     // NEXT right most digit
            calc = calc *2;                                 // multiply the digit by two

            // Instead of some screwy method of converting 16 to a string
            // and then parsing 1 and 6 and then adding them to make 7,
            // I use a simple switch statement to change the value
            // of calc2 to 7 if 16 is the multiple.
            switch(calc) {
              case 10: calc = 1; break;  // 5*2=10 & 1+0 = 1
              case 12: calc = 3; break;  // 6*2=12 & 1+2 = 3
              case 14: calc = 5; break;  // 7*2=14 & 1+4 = 5
              case 16: calc = 7; break;  // 8*2=16 & 1+6 = 7
              case 18: calc = 9; break;  // 9*2=18 & 1+8 = 9
              default: calc = calc;      // 4*2= 8 &   8 = 8  - the same for all lower numbers
            }
            iCCN = iCCN / 10;  // Subtracts right most digit from ccNum
            iTotal += calc;  // Running total of the card number as we loop
          } // END OF LOOP

          if ((iTotal%10)==0){  // Check to see if the sum Mod 10 is zero
            bResult = true;  // This IS (or could be) a valid credit card number.
          }
          else {
            bResult = false;  // This could NOT be a valid credit card number
          }
        }
      }

      // Change alert to on-page display or other indication as needed.
      if (bResult) {
        alert("This IS a valid Credit Card Number!");
      }
      if (!bResult) {
        alert("This is NOT a valid Credit Card Number!");
      }
      return bResult; // Return the results
    }
    // -->
  </script>

</HEAD>


<!-- STEP TWO: Copy this code into the BODY of your HTML document  -->

<BODY>

<div align="center">
  <form name="Form1">
    <table width="50%" border="0" cellspacing="0" cellpadding="5">
      <tr>
        <td width="50%" align="right">Credit Card Number:   </td>
        <td width="50%">
          <input name="CreditCard" type="text" value="4012888888881881" size="18" maxlength="16" style="border: 1px solid #000098; padding: 3px;">
        </td>
      </tr>
      <tr>
        <td colspan="2" align="center">
          <input type="button" name="Button" style="color: #fff; background: #000098; font-weight:bold; border: solid 1px #000;" value="TEST CARD NUMBER" onClick="return Mod10(document.Form1.CreditCard.value);">
        </td>
      </tr>
    </table>
  </form>
</div>

<p><center>
  <font face="arial, helvetica" size"-2">Free JavaScripts provided<br>
  by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>

<!-- Script Size:  4.97 KB -->

Use this:用这个:

function AmexCardnumber(inputtxt) {
  var cardno = /^(?:3[47][0-9]{13})$/;
  return cardno.test(inputtxt);
}

function VisaCardnumber(inputtxt) {
  var cardno = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/;
  return cardno.test(inputtxt);
}

function MasterCardnumber(inputtxt) {
  var cardno = /^(?:5[1-5][0-9]{14})$/;
  return cardno.test(inputtxt);
}

function DiscoverCardnumber(inputtxt) {
  var cardno = /^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/;
  return cardno.test(inputtxt);
}

function DinerClubCardnumber(inputtxt) {
  var cardno = /^(?:3(?:0[0-5]|[68][0-9])[0-9]{11})$/;
  return cardno.test(inputtxt);
}

function JCBCardnumber(inputtxt) {
  var cardno = /^(?:(?:2131|1800|35\d{3})\d{11})$/;
  return cardno.test(inputtxt);
}

function IsValidCreditCardNumber(cardNumber) {

  var cardType = null;
  if (VisaCardnumber(cardNumber)) {
    cardType = "visa";
  } else if (MasterCardnumber(cardNumber)) {
    cardType = "mastercard";
  } else if (AmexCardnumber(cardNumber)) {
    cardType = "americanexpress";
  } else if (DiscoverCardnumber(cardNumber)) {
    cardType = "discover";
  } else if (DinerClubCardnumber(cardNumber)) {
    cardType = "dinerclub";
  } else if (JCBCardnumber(cardNumber)) {
    cardType = "jcb";
  }

  return cardType;
}

You define the variable name re16digit but later refer to it as re10digit , which will throw an error.您定义了变量名re16digit但稍后将其称为re10digit ,这将引发错误。 To simplify your code, you should use RegExp.prototype.test() rather than String.prototype.search() :为了简化你的代码,你应该使用RegExp.prototype.test()而不是String.prototype.search()

function validate_creditcardnumber() {
    var re16digit = /^\d{16}$/;
    if (!re16digit.test(document.myform.CreditCardNumber.value)) {
        alert("Please enter your 16 digit credit card numbers");
        return false;
    }
}

Working demo: http://jsfiddle.net/Dxjkh/工作演示: http://jsfiddle.net/Dxjkh/

As others have mentioned, you may be better off using a JavaScript implementation of the Luhn Algorithm .正如其他人所提到的,您最好使用Luhn Algorithm 的 JavaScript 实现 It's also worth mentioning that a check for 16 digits will fail for American Express (15 digits) and Diners (14 digits) cards.还值得一提的是,美国运通(15 位)和大来(14 位)卡的 16 位检查将失败。

You should really use .test() :你真的应该使用.test()

if (!re16digit.test(document.myform.CreditCardNumber.value)) {
  alert("Please ... ");
}

You should also look around for implementations of (one or more of) the card number checksum algorithms.您还应该四处寻找(一个或多个)卡号校验和算法的实现。 They're very simple.它们非常简单。

Maybe you should take a look here: http://en.wikipedia.org/wiki/Luhn_algorithm也许你应该看看这里: http://en.wikipedia.org/wiki/Luhn_algorithm

Here is Java snippet which validates a credit card number which should be easy enough to convert to JavaScript:这是 Java 代码段,它验证信用卡号应该很容易转换为 JavaScript:

  public static boolean isValidCC(String number) {

    final int[][] sumTable = {{0,1,2,3,4,5,6,7,8,9},{0,2,4,6,8,1,3,5,7,9}};
    int sum = 0, flip = 0;

    for (int i = number.length() - 1; i >= 0; i--) {
      sum += sumTable[flip++ & 0x1][Character.digit(number.charAt(i), 10)];
    }
    return sum % 10 == 0;
  }

Maybe have a look at this solution: https://codepen.io/quinlo/pen/YONMEa也许看看这个解决方案: https://codepen.io/quinlo/pen/YONMEa

//pop in the appropriate card icon when detected
cardnumber_mask.on("accept", function () {
    console.log(cardnumber_mask.masked.currentMask.cardtype);
    switch (cardnumber_mask.masked.currentMask.cardtype) {
        case 'american express':
            ccicon.innerHTML = amex;
            ccsingle.innerHTML = amex_single;
            swapColor('green');
            break;
        case 'visa':
            ccicon.innerHTML = visa;
            ccsingle.innerHTML = visa_single;
            swapColor('lime');
            break;
        case 'diners':
            ccicon.innerHTML = diners;
            ccsingle.innerHTML = diners_single;
            swapColor('orange');
            break;
        case 'discover':
            ccicon.innerHTML = discover;
            ccsingle.innerHTML = discover_single;
            swapColor('purple');
            break;
        case ('jcb' || 'jcb15'):
            ccicon.innerHTML = jcb;
            ccsingle.innerHTML = jcb_single;
            swapColor('red');
            break;
        case 'maestro':
            ccicon.innerHTML = maestro;
            ccsingle.innerHTML = maestro_single;
            swapColor('yellow');
            break;
        case 'mastercard':
            ccicon.innerHTML = mastercard;
            ccsingle.innerHTML = mastercard_single;
            swapColor('lightblue');

            break;
        case 'unionpay':
            ccicon.innerHTML = unionpay;
            ccsingle.innerHTML = unionpay_single;
            swapColor('cyan');
            break;
        default:
            ccicon.innerHTML = '';
            ccsingle.innerHTML = '';
            swapColor('grey');
            break;
    }

});

These are my two cents.这是我的两分钱。

Note #1: this is not a perfect validation method, but it is OK for my needs.注意#1:这不是一个完美的验证方法,但可以满足我的需要。
Note #2: IIN ranges can be changed (and will be), so it is a good idea to check this link to be sure that we are up to date.注意 #2:IIN 范围可以更改(并且将会更改),因此最好检查此链接以确保我们是最新的。

function validateCCNum(ccnum)
{
    var ccCheckRegExp = /[^\d\s-]/;
    var isValid = !ccCheckRegExp.test(ccnum);
    var i;

    if (isValid) {
        var cardNumbersOnly = ccnum.replace(/[\s-]/g,"");
        var cardNumberLength = cardNumbersOnly.length;

        var arrCheckTypes = ['visa', 'mastercard', 'amex', 'discover', 'dinners', 'jcb'];
        for(i=0; i<arrCheckTypes.length; i++) {
            var lengthIsValid = false;
            var prefixIsValid = false;
            var prefixRegExp;

            switch (arrCheckTypes[i]) {
                case "mastercard":
                    lengthIsValid = (cardNumberLength === 16);
                    prefixRegExp = /5[1-5][0-9]|(2(?:2[2-9][^0]|2[3-9]|[3-6]|22[1-9]|7[0-1]|72[0]))\d*/;
                    break;

                case "visa":
                    lengthIsValid = (cardNumberLength === 16 || cardNumberLength === 13);
                    prefixRegExp = /^4/;
                    break;

                case "amex":
                    lengthIsValid = (cardNumberLength === 15);
                    prefixRegExp = /^3([47])/;
                    break;

                case "discover":
                    lengthIsValid = (cardNumberLength === 15 || cardNumberLength === 16);
                    prefixRegExp = /^(6011|5)/;
                    break;

                case "dinners":
                    lengthIsValid = (cardNumberLength === 14);
                    prefixRegExp = /^(300|301|302|303|304|305|36|38)/;
                    break;

                case "jcb":
                    lengthIsValid = (cardNumberLength === 15 || cardNumberLength === 16);
                    prefixRegExp = /^(2131|1800|35)/;
                    break;

                default:
                    prefixRegExp = /^$/;
            }

            prefixIsValid = prefixRegExp.test(cardNumbersOnly);
            isValid = prefixIsValid && lengthIsValid;

            // Check if we found a correct one
            if(isValid) {
                break;
            }
        }
    }

    if (!isValid) {
        return false;
    }

    // Remove all dashes for the checksum checks to eliminate negative numbers
    ccnum = ccnum.replace(/[\s-]/g,"");
    // Checksum ("Mod 10")
    // Add even digits in even length strings or odd digits in odd length strings.
    var checksum = 0;
    for (i = (2 - (ccnum.length % 2)); i <= ccnum.length; i += 2) {
        checksum += parseInt(ccnum.charAt(i - 1));
    }

    // Analyze odd digits in even length strings or even digits in odd length strings.
    for (i = (ccnum.length % 2) + 1; i < ccnum.length; i += 2) {
        var digit = parseInt(ccnum.charAt(i - 1)) * 2;
        if (digit < 10) {
            checksum += digit;
        } else {
            checksum += (digit - 9);
        }
    }

    return (checksum % 10) === 0;
}

Thanks to @Peter Mortensen for the comment:)感谢@Peter Mortensen的评论:)

This works: http://jsfiddle.net/WHKeK/这个作品: http://jsfiddle.net/WHKeK/

function validate_creditcardnumber()
{
    var re16digit=/^\d{16}$/
    if (document.myform.CreditCardNumber.value.search(re16digit) == -1)
        alert("Please enter your 16 digit credit card numbers");
    return false;    
}

You have a typo.你有一个错字。 You call the variable re16digit , but in your search you have re10digit .您调用变量re16digit ,但在搜索中您有re10digit

This code works:

function check_credit_card_validity_contact_bank(random_id) {
    var cb_visa_pattern = /^4/;
    var cb_mast_pattern = /^5[1-5]/;
    var cb_amex_pattern = /^3[47]/;
    var cb_disc_pattern = /^6(011|5|4[4-9]|22(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]))/;
    var credit_card_number = jQuery("#credit_card_number_text_field_"+random_id).val();
    var cb_is_visa = cb_visa_pattern.test( credit_card_number ) === true;
    var cb_is_master = cb_mast_pattern.test( credit_card_number ) === true;
    var cb_is_amex = cb_amex_pattern.test( credit_card_number ) === true;
    var isDisc = cb_disc_pattern.test( credit_card_number ) === true;
    cb_is_amex ? jQuery("#credit_card_number_text_field_"+random_id).mask("999999999999999") : jQuery("#credit_card_number_text_field_"+random_id).mask("9999999999999999");
    var credit_card_number = jQuery("#credit_card_number_text_field_"+random_id).val();
    cb_is_amex ? jQuery("#credit_card_number_text_field_"+random_id).mask("9999 9999 9999 999") : jQuery("#credit_card_number_text_field_"+random_id).mask("9999 9999 9999 9999");

    if( cb_is_visa || cb_is_master || cb_is_amex || isDisc) {
        if( cb_is_visa || cb_is_master || isDisc) {
            var sum = 0;
            for (var i = 0; i < credit_card_number.length; i++) {
                var intVal = parseInt(credit_card_number.substr(i, 1));
                if (i % 2 == 0) {
                    intVal *= 2;
                    if (intVal > 9)
                    {
                        intVal = 1 + (intVal % 10);
                    }
                }
                sum += intVal;
            }
            var contact_bank_check_validity = (sum % 10) == 0 ? true : false;
        }

        jQuery("#text_appear_after_counter_credit_card_"+random_id).css("display","none");
        if( cb_is_visa  && contact_bank_check_validity) {
           jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/cc-visa.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px", "padding-bottom":"5px"});
        } else if( cb_is_master && contact_bank_check_validity) {
             jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/cc-mastercard.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px", "padding-bottom":"5px"});
        } else if( cb_is_amex) {
           jQuery("#credit_card_number_text_field_"+random_id).unmask();
           jQuery("#credit_card_number_text_field_"+random_id).mask("9999 9999 9999 999");
           jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/cc-amex.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px","padding-bottom":"5px"});
        } else if( isDisc && contact_bank_check_validity) {
             jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/cc-discover.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px","padding-bottom":"5px"});
        } else {
            jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/credit-card.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px" ,"padding-bottom":"5px"});
            jQuery("#text_appear_after_counter_credit_card_"+random_id).css("display","block").html(<?php echo json_encode($cb_invalid_card_number);?>).addClass("field_label");
        }
    }
    else {
        jQuery("#credit_card_number_text_field_"+random_id).css({"background-image":"url(<?php echo plugins_url("assets/global/img/credit-card.svg", dirname(__FILE__)); ?>)","background-repeat":"no-repeat","padding-left":"40px" ,"padding-bottom":"5px"});
        jQuery("#text_appear_after_counter_credit_card_"+random_id).css("display","block").html(<?php echo json_encode($cb_invalid_card_number);?>).addClass("field_label");
    }
}

I'm sure all of these algorithms are great, but you cannot verify that a card number is valid just by running an algorithm on it.我确信所有这些算法都很棒,但是您无法仅通过对其运行算法来验证卡号是否有效。

Algorithms make sure the format is correct and its checksums are valid.算法确保格式正确且校验和有效。 However, they do not guarantee the bank will accept the card... For that, you need to actually pass the card number to your bank for approval.但是,他们不保证银行会接受该卡......为此,您需要将卡号实际传递给您的银行以供批准。

Find the source code from github for credit card validiations , it will work 100%github 找到用于信用卡验证的源代码,它将 100% 工作

I have written a beautiful single line function for validating a card using the Luhn Algorithm.我写了一个漂亮的单行 function 用于使用 Luhn 算法验证卡。 Please note it assumes that the input is numerical string, as this is what input elements usually provide.请注意,它假定输入是数字字符串,因为这是输入元素通常提供的。 Whether or not the card number is real is up to the bank or payment processor to determine, this is just a first step check to see if the input is a valid card number.卡号是否真实由银行或支付处理商来确定,这只是检查输入是否为有效卡号的第一步。 Enjoy!享受!

function isValidCard(input){return (input.length==16)?input.split('').map((x, i)=>+((i%2==0)?(x*2>9)?1+((x*2)%10):x*2:x)).reduce((t, x)=>t+x)%10==0:false;}

Luhn algorithm for checking card validation.用于检查卡验证的 Luhn 算法。

    const cardValidator = (cardNumber = 4539689887705798) => {
    let cardNumers = cardNumber.toString().split("");
    cardNumers = cardNumers.map(Number);
    let sum = 0;
    for (let i = 0; i < cardNumers.length; i++) {
        let digit = cardNumers[i];
        if (i % 2 === 0) {
            digit *= 2;
            if(digit > 9) digit -= 9;
        }
        sum = sum + digit;
    }
    return sum % 10 === 0;
}

Here is my es6 solution这是我的 es6 解决方案

 function isValidCardNo(cardNo) { let even = false; return cardNo.split("").reverse().map(Number).reduce((sum, d) => sum += ((even =?even): d? (d < 5): d * 2, (d - 5) * 2 + 1); 0 ) % 10 === 0. } console;log(isValidCardNo('4111111111111111')). // true console;log(isValidCardNo('4111111111111112')); // false

In order to validate a card number, you need to check it against the Luhn Algorithm .为了验证卡号,您需要根据Luhn 算法对其进行检查。

Here is a JS code sample of an API method to check a given card number against the Luhn Algorithm.这是 API 方法的 JS 代码示例,用于根据 Luhn 算法检查给定的卡号。 The response of this method can also be made to provide general information about the card (such as brand, country issued in, issuing bank and more):此方法的响应还可以提供有关卡的一般信息(例如品牌、发行国家、发卡银行等):

 const options = { method: 'GET', headers: {Accept: 'application/json', 'X-Api-Key': '[APIkey]'} }; fetch('https://api.epaytools.com/Tools/luhn?number=[CardNumber]&metaData=true', options).then(response => response.json()).then(response => console.log(response)).catch(err => console.error(err));

All you have to do is register with the provider - PCI Booking , to use this method.您所要做的就是向提供商PCI Booking注册,以使用此方法。 While they are a paid service, they also offer free accounts where you can perform these types of actions.虽然它们是付费服务,但它们还提供免费帐户,您可以在其中执行这些类型的操作。

Important note , the main thing to consider is what is the purpose of validating the card number.重要说明,主要要考虑的是验证卡号的目的是什么。 As was mentioned in one of the responses, the Luhn Algorithm simply checks that the number provided matches the format of a card number.正如其中一个回复中提到的,Luhn 算法只是检查提供的数字是否与卡号的格式相匹配。 However, many test card numbers, for example 4580458045804580, will also pass the Luhn Algorithm.但是,许多测试卡号,例如 4580458045804580,也将通过 Luhn 算法。 You can use 3D Secure authentication when asking the card owner to enter the card details, (and PCI Booking also offers a service for that), but this might not fit your flow.在要求卡所有者输入卡详细信息时,您可以使用 3D 安全身份验证(并且 PCI 预订也为此提供服务),但这可能不适合您的流程。 And this only validates that the card is real and the person entering the card is the card owner.而且这只验证卡是真实的,并且进入卡的人是卡的所有者。 To know that a card is valid to be used for a payment, then you would have to use a payment processor and submit an actual charge or pre-authorization on the card.要知道一张卡可用于支付,您必须使用支付处理器并在卡上提交实际费用或预授权。 So it is important to figure out what is the purpose behind the validation attempt and why do you need a valid card for.因此,重要的是要弄清楚验证尝试背后的目的是什么,以及为什么需要一张有效的卡。

Single line Luhn algorithm implementation:单线Luhn算法实现:

 const checkLuhn = num =>.(num,replace(/\D/g. '') //remove non-digits.split('') //make an array.reverse() //last digit first,map((e. i) => e * (i % 2 + 1)) //double every even element.join('') //instead of if(d > 9).split('') // d -=9,reduce((e, t) => t - 0 + e; 0) //sum elements % 10). // 0 is falsy and;0 is truey //test console,log(checkLuhn('5555555555554444')). // MC; expected true console,log(checkLuhn('378282246310005')). // AmEx; expected true console,log(checkLuhn('4111 1111 1111 1111')). // Visa; expected true console,log(checkLuhn('4111111111111112')); // Visa, expected false

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM