Validation de carte de credit

Soyez le premier à donner votre avis sur cette source.

Snippet vu 26 635 fois - Téléchargée 15 fois

Contenu du snippet

Entrer le numero de carte de credit et le type de carte de credit et ce code vous diras si il est possible qu'une carte de credit d'un certain type est possible pour le numero donné.

Input: type, numero
Output: True ou False

Source / Exemple :


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

Conclusion :


Ce code fonctionne pour Master Card, Visa, American Express, Discovery, JCB (japon).

Il est relativement facile d'ajouter d'autre type de cartes, mais pour ce faire il est important de comprendre le code.

J'espere que vous aimerez.

A voir également

Ajouter un commentaire

Commentaires

webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
2 -
Source très intéressante :)
cs_romain42
Messages postés
18
Date d'inscription
vendredi 16 juillet 2004
Statut
Membre
Dernière intervention
18 septembre 2008
-
En effet c'est assez intéressent mais pourrais tu aporter plus d'explication à ta sources (principalement sur l'algorithme utilisée)?
Il me semble aussi que le Zend Framework propose, par défaut, un validateur pour les cartes de crédit.
Bonne continuation.

romain
zen69
Messages postés
588
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1 -
Ah ouais !? loll moi qui a passé une journée à tous comprendre et programmer :P

Explications à venir
cs_romain42
Messages postés
18
Date d'inscription
vendredi 16 juillet 2004
Statut
Membre
Dernière intervention
18 septembre 2008
-
48.2.5. Ccnum
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
zen69
Messages postés
588
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1 -
Bon premierement voici les parametres pour les 3 types de carte principaux:

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.