Soyez le premier à donner votre avis sur cette source.
Snippet vu 31 423 fois - Téléchargée 17 fois
function cc_validate($cc_num, $cc_type) { $mc_mask = array(1 => '51', 2 => '52', 3 => '53', 4 => '54', 5 => '55'); $mc_len = array(1 => 16); $visa_mask = array(1 => '4'); $visa_len = array(1 => 13, 2 => 16); $amex_mask = array(1 => '34', 2 => '37'); $amex_len = array(1 => 15); $disc_mask = array(1 => '6001'); $disc_len = array(1 => 16); $jcb_mask = array(1 => '3', 2 => '1800', 3 => '2131'); $jcb_len = array(1 => 15, 2 => 16); $cc_mask = array(); $cc_len = array(); $cc_valid = false; /* STEP 1 VALIDER LEN + PREFIX */ switch ($cc_type) { case 'mc': $cc_mask = $mc_mask; $cc_len = $mc_len; break; case 'visa': $cc_mask = $visa_mask; $cc_len = $visa_len; break; case 'amex': $cc_mask = $amex_mask; $cc_len = $amex_len; break; case 'disc': $cc_mask = $disc_mask; $cc_len = $disc_len; break; case 'jcb': $cc_mask = $jcb_mask; $cc_len = $jcb_len; break; default: die('Error, please go back'); } $i = 1; while ((isset($cc_mask[$i]))&&(!empty($cc_mask[$i]))&&(!$cc_valid)) { $l = strlen($cc_mask[$i]); $cc_valid = (substr($cc_num, 0, $l)==$cc_mask[$i]); $i++; } if (!$cc_valid) { return false; } $i = 1; $cc_valid = false; while ((isset($cc_len[$i]))&&(!empty($cc_len[$i]))&&(!$cc_valid)) { $cc_valid = (strlen($cc_num)==$cc_len[$i]); $i++; } if (!$cc_valid) { return false; } $cc_valid = false; /* STEP 2 DOUBLE CHAQUES 2 DE 2 ET CHECK MOD 10 */ $cc_num = strrev($cc_num); $num_sum = ""; for($i = 0; $i < strlen($cc_num); $i++) { $cur_num = substr($cc_num, $i, 1); if($i % 2 == 1) { $cur_num *= 2; } if($cur_num > 9) { $f_num = $cur_num % 10; $s_num = ($cur_num - $f_num) / 10; $cur_num = $f_num + $s_num; } $num_sum += $cur_num; } $cc_valid = ($num_sum % 10 == 0); return $cc_valid; } ?>
16 sept. 2008 à 09:00
16 sept. 2008 à 15:43
Il me semble aussi que le Zend Framework propose, par défaut, un validateur pour les cartes de crédit.
Bonne continuation.
romain
16 sept. 2008 à 15:56
Explications à venir
16 sept. 2008 à 16:00
Retourne true si et seulement si $value respecte l'algorithme de Luhn ("module 10") pour les numéros de cartes de crédits
désolé :D
http://framework.zend.com/manual/fr/zend.validate.set.html#zend.validate.set.ccnum
16 sept. 2008 à 16:29
Type: MASTERCARD
Prefix: 51-55
Longueur: 16
Algo de validation: mod 10
Type: VISA
Prefix: 4
Longueur: 13, 16
Algo de validation: mod 10
Type: AMEX
Prefix: 34 ou 37
Longueur: 15
Algo de validation: mod 10
Etape 1:
On double la valeur de chaque 2 de 2 en commencant par le 2e caractere comme ceci:
49927398716 devient
4(18)9(4)7(6)9(16)7(2)6 (les chiffre qui sont entre parantese le sont simplement pour rendre plus clair l'exemple)
Etape 2:
On additionne en decomposant les sum obtenues en 1 comme ceci:
4+(1+8)+9+(4)+7+(6)+9+(1+6)+7+(2)+6
Somme = 70 (la somme doit etre un multiple de 10 si non la carte n'est pas valide)
Etape 3:
Sum(etape2) % 10 = 0
Le resultat DOIT etre zero
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.