Validation de carte de credit

Soyez le premier à donner votre avis sur cette source.

Snippet vu 31 423 fois - Téléchargée 17 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 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
16 sept. 2008 à 09:00
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
16 sept. 2008 à 15:43
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 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
16 sept. 2008 à 15:56
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
16 sept. 2008 à 16:00
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 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
16 sept. 2008 à 16:29
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.