Vous pouvez télécharger le fichier algo_luhn.zip qui contient la version Javascript de l'algorithme et une version asp (test 6 types de cartes différents) réalisée par 2Si-Systemes.
Tests préalables
1) test du préfixe de numéro la carte bancaire:
Les préfixes, c'est à dire les premiers chiffres d'une carte bancaire sont fixés et dépendent du type de carte dont l'utilisateur dispose.
2) test sur la longueur du numéro de carte
La longueur est également fixe, et dépend de la même manière du type de carte bancaire.
Voici un petit tableau récapitulatif des deux types de cartes que l'on trouve en France :
| TYPE DE CARTE |
PRÉFIXE |
LONGUEUR |
| Visa |
4 |
varie de 13 à 16 |
| Master Card |
varie de 51 à 55 |
16 |
Algorithme de LUHN
Une fois les deux tests précédents effectués,
nous allons opérer sur le numéro de carte un algorithme (algorithme de Luhn), qui va permettre de vérifier la cohérence du numéro entré.
Comment Ca marche
Le principe repose sur une somme qui doit être divisible par 10 (mod 10).
On numérote chaque chiffre de 1 à n en commençant par le dernier (numéro d'ordre).
Dans cette somme tous les chiffres correspondant à un numéro d'ordre paire sont multipliés par deux. Si la multiplication engendre un nombre supérieur à 10 alors on ajoute les deux chiffres (12= 1+2), et on en retient la somme obtenue, dans le cas contraire on retient uniquement le chiffre obtenu. Chacun de ses numéros est ensuite additionné à tous ceux dont le numéro d'ordre est impaire, la somme finale doit être divisible par 10.
Exemple :
Soit le numéro de carte suivant : 4895 1313 (le numéro choisi est fictif)
On obtient le schéma suivant :
| 8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
| 4 |
8 |
9 |
5 |
1 |
3 |
1 |
3 |
| x2 |
|
x2 |
|
x2 |
|
x2 |
|
| 8 |
+ 8 |
1 + 8 |
+ 5 |
+ 2 |
+ 3 |
+ 2 |
+ 3 |
|
Total Obtenu : 40 Le numéro de carte est correcte
|
Validation du numéro de Carte Bancaire en ASP:
Paramètre d'entrée :
- Numerocarte : champs contenant le numéro de la carte
- Cartetype : 1 = Visa , 2 mastercard ( champs bouton radio)
Paramètre de sortie :
- si Ok=True, carte acceptée sinon incorrect
<%
' Verification de la carte bancaire : algorothme de Luhn
ok=true
' test mastercard
if request("cartetype")=2 then
' test de longueur
if len(request("numerocarte"))<>16 then
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
' test le préfixe
if ok=true then
prefix=mid(request("numerocarte"),1,2)
if prefix<>51 and prefix<>52 and prefix<>53 and prefix<>54 and prefix<>55 then
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
end if
end if ' fin test master card
' test visa
if request("cartetype")=1 then
' test la longueur
if len(request("numerocarte"))>16 or len(request("numerocarte"))<13 then
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
' test le préfixe
if ok= true then
prefix=mid(request("numerocarte"),1,1)
if prefix<>4 then
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
end if
end if ' fin test visa
'Algorithme de Luhn
if isnumeric(request("numerocarte")) then ' si c'est bien un numéro
if ok=true then ' si les tests précédents ont été effectués avec succès
'debut de l'algo
totalcarte=0
increment=0
for i=len(request("numerocarte")) downto 1
numero=cint(mid(request("numerocarte"),i,1))
increment=increment+1
if increment mod 2 <> 0 then ' nombre impaire
totalcarte=totalcarte+numero ' ajout normal dans la somme
else ' nombre impaire
numero=numero*2
if numero>=10 then
totalcarte=totalcarte+1+numero-10
else
totalcarte=totalcarte+numero
end if
end if
next
' division du total
if totalcarte mod 10<>0 then
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
end if
else
msg="<font color=red face=arial size=2><P>Erreur : <br>Votre numéro de carte n'est pas valable</font>"
ok=false
end if
' Fin de vérification carte bancaire si ok=true à ce niveau la carte est ok
%>