Javascript 如何验证信用卡号
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6176802/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to validate a credit card number
提问by matt
I just want to validate a credit card number in the JavaScript code. I have used a regular expression for digit numbers, but I don't know why it is not working!
我只想验证 JavaScript 代码中的信用卡号。我对数字使用了正则表达式,但我不知道为什么它不起作用!
Here is my function as per below:
这是我的功能,如下所示:
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;
}
回答by Mr. Black
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>
回答by alexey
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;
}
回答by extempl
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;
}
P.S.: Do not use regex for this, as it is done by the link. But it is useful to use text definitions of each card. Here it is:
PS:不要为此使用正则表达式,因为它是由链接完成的。但是使用每张卡片的文本定义很有用。这里是:
American Express: Starting with 34 or 37, length 15 digits.
Visa: Starting with 4, length 13 or 16 digits.
MasterCard: Starting with 51 through 55, length 16 digits.
Discover: Starting with 6011, length 16 digits or starting with 5, length 15 digits.
Diners Club: Starting with 300 through 305, 36, or 38, length 14 digits.
JCB: Starting with 2131 or 1800, length 15 digits or starting with 35, length 16 digits.
美国运通:以 34 或 37 开头,长度为 15 位。
签证:以 4 位开头,长度为 13 或 16 位数字。
万事达卡:以 51 到 55 开头,长度为 16 位。
发现:以6011开头,长度为16位或以5开头,长度为15位。
Diners Club:从 300 到 305、36 或 38,长度为 14 位数字。
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)
}
回答by SynerCoder
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 损坏:互联网存档: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 -->
回答by NJInamdar
Luhn's algorithm is used for adding validation of credit and debit card numbers. This JavaScriptfunction should work out.
Luhn 的算法用于添加信用卡和借记卡号码的验证。这个JavaScript函数应该可以工作。
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;
};
回答by Cédric Boivin
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;
}
回答by Cédric Boivin
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;
}
});
回答by Andy E
You define the variable name re16digit
but later refer to it as re10digit
, which will throw an error. To simplify your code, you should use RegExp.prototype.test()
rather than String.prototype.search()
:
您定义了变量名称,re16digit
但稍后将其称为re10digit
,这将引发错误。为了简化您的代码,您应该使用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. It's also worth mentioning that a check for 16 digits will fail for American Express (15 digits) and Diners (14 digits) cards.
正如其他人所提到的,您最好使用Luhn 算法的JavaScript 实现。还值得一提的是,美国运通卡(15 位)和 Diners(14 位)卡的 16 位检查将失败。
回答by Pointy
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.
您还应该四处寻找(一种或多种)卡号校验和算法的实现。它们非常简单。
回答by netbrain
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;
}