|
Validation d'un numéro de carte de crédit avec JavaScript du côté du client
Dans ce document nous
présenterons une fonction Javascript qui permet de valider le numéro d'une
carte de crédit Express, Discover, MasterCard and Visa. Les validations en
question portent sur:
* La longueur du
numéro.
* Les caractères
renseignés par l'utilisateur.
* Le préfixe.
* Le contrôle de la
clé (check digit).
* La date
d'expiration de la carte.
Bien entendu cette
fonction ne vérifie que la validité de la structure du numéro de carte de
crédit. Elle ne vérifie pas si le numéro est réellement attribué à une personne
physique ou morale (cela nécessiterait un accès à la base de données de
l'établissement émetteur de la carte). Il est important de noter que le
bouton de validation présent sur le formulaire HTML n'est pas lié à une URL
valide (de ce fait les numéros de cartes de crédit que vous allez valider ne
seront pas détournés vers une page web externe à des fins frauduleuses).
Si vous souhaitez
copier-coller le code source de cette fonction pour l'intégrer à vos
applications, nous vous recommandons de vous le procurez
en cliquant sur ce lien.
NB: Cette
fonction a été initialement publiée sur le site planetsourcecode.com
<xmp>
//**************************************
// Nom: Validateur de carte de crédit
// Description: Cette fonction valide le numéro d'une carte American Express,
Discover, MasterCard and Visa. A l'issue de la validation les numéros de carte
renseignés ne seront pas détournés vers une URL externe
// Auteur: vsim, planetsourcecode.com
//
//
//Conditions d'utilisation du code.
//Voir http://www.Planet-Source-Code.com/xq/ASP/txtCodeId.2493/lngWId.2/qx/vb/scripts/ShowCode.htm
//pour plus de détails.
//**************************************
<html>
<head>
<title>Credit Card Validation</title>
<script language="JavaScript">
<!--
/*
Cet algorithme
contient 3 fonctions de validation:
validateCard(cardNumber,cardType,cardMonth,cardYear)
Tous les paramètres passés à cette fonction sont des chaînes de caractères .
Month & Year c'est à dire le mois et l'année sont spécifiés par l'utilisateur
sur le formulaire HTML
cardType peut prendre les valeurs:
'a' American Express
'd' Discover
'm' MasterCard
'v' Visa
Description:
La fonction fait
appel à la formule de LUHN (Mod 10) pour valider le numéro de carte. Elle
retourne:
true si le numéro
de la carte est valide compte tenu de la date d'expiration.
false dans les autres cas.
Les fonctions invoquées par la fonction principale sont:
mod10( cardNumber )
Son paramètre est
une chaîne de caractère qui correspond au numéro de la carte. Ce numéro est
vérifié par le biais de la formule modulo 10 pour contrôler le numéro de clé
(check digit)
Elle retourne:
true si la clé est
valide.
false dans les autres cas.
expired( cardMonth, cardYear )
Cette fonction
reçoit en paramètres la date d'expiration (mois, année). Elle vérifie que la
date du jour est antérieure à la date d'expiration. Elle retourne
true si la carte a
expiré.
false dans les autres cas.
Voici à présent
le code de la fonction:
*/
function mod10( cardNumber ) { // LUHN Formula for validation of credit card
numbers.
var ar = new Array( cardNumber.length );
var i = 0,sum = 0;
for( i = 0; i < cardNumber.length; ++i ) {
ar[i] = parseInt(cardNumber.charAt(i));
}
for( i = ar.length -2; i >= 0; i-=2 ) { // you have to start from the right, and
work back.
ar[i] *= 2; // every second digit starting with the right most (check digit)
if( ar[i] > 9 ) ar[i]-=9; // will be doubled, and summed with the skipped
digits.
} // if the double digit is > 9, add those individual digits together
for( i = 0; i < ar.length; ++i ) {
sum += ar[i]; // if the sum is divisible by 10 mod10 succeeds
}
return (((sum%10)==0)?true:false);
}
function expired( month, year ) {
var now = new Date(); // this function is designed to be Y2K compliant.
var expiresIn = new Date(year,month,0,0,0); // create an expired on date object
with valid thru expiration date
expiresIn.setMonth(expiresIn.getMonth()+1); // adjust the month, to first day,
hour, minute & second of expired month
if( now.getTime() < expiresIn.getTime() ) return false;
return true; // then we get the miliseconds, and do a long integer comparison
}
function validateCard(cardNumber,cardType,cardMonth,cardYear) {
if( cardNumber.length == 0 ) { //most of these checks are self explanitory
alert("Please enter a valid card number.");
return false;
}
for( var i = 0; i < cardNumber.length; ++i ) { // make sure the number is all
digits.. (by design)
var c = cardNumber.charAt(i);
if( c < '0' || c > '9' ) {
alert("Please enter a valid card number. Use only digits. Do not use spaces or
hyphens.");
return false;
}
}
var length = cardNumber.length; //perform card specific length and prefix tests
switch( cardType ) {
case 'a':
if( length != 15 ) {
alert("Please enter a valid American Express Card number.");
return;
}
var prefix = parseInt( cardNumber.substring(0,2));
if( prefix != 34 && prefix != 37 ) {
alert("Please enter a valid American Express Card number.");
return;
}
break;
case 'd':
if( length != 16 ) {
alert("Please enter a valid Discover Card number.");
return;
}
var prefix = parseInt( cardNumber.substring(0,4));
if( prefix != 6011 ) {
alert("Please enter a valid Discover Card number.");
return;
}
break;
case 'm':
if( length != 16 ) {
alert("Please enter a valid MasterCard number.");
return;
}
var prefix = parseInt( cardNumber.substring(0,2));
if( prefix < 51 || prefix > 55) {
alert("Please enter a valid MasterCard Card number.");
return;
}
break;
case 'v':
if( length != 16 && length != 13 ) {
alert("Please enter a valid Visa Card number.");
return;
}
var prefix = parseInt( cardNumber.substring(0,1));
if( prefix != 4 ) {
alert("Please enter a valid Visa Card number.");
return;
}
break;
}
if( !mod10( cardNumber ) ) { // run the check digit algorithm
alert("Sorry! This is not a valid credit card number.");
return false;
}
if( expired( cardMonth, cardYear ) ) { // check if entered date is already
expired.
alert("Sorry! The expiration date you have entered would make this card invalid.");
return false;
}
return true; // at this point card has not been proven to be invalid
}
//-->
</script>
<style type="text/css">
P { font-family:arial,verdana;font-size:10pt;font-weight:bold; color: #043829 }
</style>
</head>
<body bgcolor="ccfff">
<form action="URLTOPROCESSDATA" method="POST" enctype="application/x-www-form-urlencoded"
name="ccform" onsubmit="return validateCard(this.cardNumber.value,this.cardType.value,this.cardMonth.value,this.cardYear.value);">
<table cellspacing="5" cellpadding="2" bgcolor="#DA9D67">
<tr>
<td align="right" valign="middle" nowrap><p>Select Card Type:</p></td>
<td valign="bottom" nowrap>
<select name="cardType">
<option value="a"> American Express
<option value="d"> Discover
<option value="m"> MasterCard
<option value="v"> Visa
</select>
</td>
</tr>
<tr>
<td align="right" valign="middle" nowrap><p>Enter Card Number:</p></td>
<td valign="bottom" nowrap>
<p><input type="Text" name="cardNumber" size="17" maxlength="16"> example: <font
size=-1><i>( 1234567890123456 )</i></i></font></p>
</td>
</tr>
<tr>
<td align="right" valign="middle" nowrap><p>Select Expiration Date:</p></td>
<td valign="bottom" nowrap>
<p>
<select name="cardMonth">
<option value="01"> 01
<option value="02"> 02
<option value="03"> 03
<option value="04"> 04
<option value="05"> 05
<option value="06"> 06
<option value="07"> 07
<option value="08"> 08
<option value="09"> 09
<option value="10"> 10
<option value="11"> 11
<option value="12"> 12
</select>
<select name="cardYear">
<option value="1999"> 99
<option value="2000"> 00
<option value="2001"> 01
<option value="2002"> 02
<option value="2003"> 03
<option value="2004"> 04
<option value="2005"> 05
<option value="2006"> 06
<option value="2007"> 07
<option value="2008"> 08
<option value="2009"> 09
<option value="2010"> 10
</select>
example: <font size=-1><i>( MM YY )</i></i></font>
</p>
</td>
</tr>
<tr>
<td colspan="2" align="CENTER">
<input type="Submit" name="submit" value="Submit"> <input type="reset"
value="Reset">
</td>
</tr>
</table>
</form>
</body>
</html>
</xmp>
|