Validation de carte de credit

Soyez le premier à donner votre avis sur cette source.

Snippet vu 28 075 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

Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
La date ne fait pas partie de cet algorithme.... rendu la je crois que c'est la compagnie tel que Visa qui doit valider l'info.
Messages postés
74
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 février 2014

salut!
l'idée de cette source est bonne mais je la trouve incomplete car que fais tu de la date d'expiration de la carte? moi je preconiserais plutot une classe gerant tous les parametres à verifier sur une carte avant acceptation du payement.
Messages postés
18
Date d'inscription
vendredi 16 juillet 2004
Statut
Membre
Dernière intervention
18 septembre 2008

Exacte et puis c'est toujours intéressent de voir comment ca fonctionne !
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
romain42 : en effet mais bon celui ci est plus complet car il valide aussi que le bon type de carte a ete choisi... alors au pire aller, c'est pour des faims educative :P
Messages postés
584
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
Afficher les 9 commentaires

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.