Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DannyND

Validar Cartão de Crédito

Recommended Posts

Já tinha visto esse link, mas precisava de algo mais completo, como por exemplo, identificar a bandeira conforme digita o número do cartão e/ou validação da data de validade do cartão também.

 

De qualquer forma, obrigada.


Você pode dar uma olhada nesse link

 

http://www.htmlstaff.org/ver.php?id=2079

 

Nessa validação falta Hipercard e Elo, veja:

if ($rgCartao == 'desconheço') { } // se nada foi especificado
elseif ($rgCartao == 'mast'){
if (strlen($nuCartao) != 16 || !ereg('5[1-5]', $nuCartao))
return "0";
}
elseif ($rgCartao == 'visa'){
if ((strlen($nuCartao) != 13 && strlen($nuCartao) != 16) ||
substr($nuCartao, 0, 1) != '4')
return "0";
}
elseif ($rgCartao == 'amex'){
if (strlen($nuCartao) != 15 || !ereg('3[47]', $nuCartao))
return "0";
}
elseif ($rgCartao == 'disc'){
if (strlen($nuCartao) != 16 || substr($nuCartao, 0, 4) != '6011')
return "0";
}
else {
return "Tipo não foi informado";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O algorítimo Luhn é muito usado para estas verificações de cartão de credito, testei todos desta lista, porem retornou false na do HIPERCARD, mas pelo que andei pesquisando, parece estar errado, ou falta algum numero, infelizmente a maioria dos sites que falam a respeito de números para teste, replicaram o mesmo conteúdo.

<?php
/* Luhn algorithm number checker - (c) 2005-2008 shaman - www.planzero.org *
 * This code has been released into the public domain, however please      *
 * give credit to the original author where possible.                      */

function luhn_check($number) {

  // Strip any non-digits (useful for credit card numbers with spaces and hyphens)
  $number=preg_replace('/\D/', '', $number);

  // Set the string length and parity
  $number_length=strlen($number);
  $parity=$number_length % 2;

  // Loop through each digit and do the maths
  $total=0;
  for ($i=0; $i<$number_length; $i++) {
    $digit=$number[$i];
    // Multiply alternate digits by two
    if ($i % 2 == $parity) {
      $digit*=2;
      // If the sum is two digits, add them together (in effect)
      if ($digit > 9) {
        $digit-=9;
      }
    }
    // Total up the digits
    $total+=$digit;
  }

  // If the total mod 10 equals 0, the number is valid
  return ($total % 10 == 0) ? TRUE : FALSE;

}

var_dump( luhn_check('3841001111222233334') );


Ou também pode usar a

Respect\Validation

https://github.com/Respect/Validation#vcreditcard

 

e as cc dos cartões

function validateCC($cc_num, $type) {

	if($type == "American") {
	$denum = "American Express";
	} elseif($type == "Dinners") {
	$denum = "Diner's Club";
	} elseif($type == "Discover") {
	$denum = "Discover";
	} elseif($type == "Master") {
	$denum = "Master Card";
	} elseif($type == "Visa") {
	$denum = "Visa";
	}

	if($type == "American") {
	$pattern = "/^([34|37]{2})([0-9]{13})$/";//American Express
	if (preg_match($pattern,$cc_num)) {
	$verified = true;
	} else {
	$verified = false;
	}


	} elseif($type == "Dinners") {
	$pattern = "/^([30|36|38]{2})([0-9]{12})$/";//Diner's Club
	if (preg_match($pattern,$cc_num)) {
	$verified = true;
	} else {
	$verified = false;
	}


	} elseif($type == "Discover") {
	$pattern = "/^([6011]{4})([0-9]{12})$/";//Discover Card
	if (preg_match($pattern,$cc_num)) {
	$verified = true;
	} else {
	$verified = false;
	}


	} elseif($type == "Master") {
	$pattern = "/^([51|52|53|54|55]{2})([0-9]{14})$/";//Mastercard
	if (preg_match($pattern,$cc_num)) {
	$verified = true;
	} else {
	$verified = false;
	}


	} elseif($type == "Visa") {
	$pattern = "/^([4]{1})([0-9]{12,15})$/";//Visa
	if (preg_match($pattern,$cc_num)) {
	$verified = true;
	} else {
	$verified = false;
	}

	}

	if($verified == false) {
	//Do something here in case the validation fails
	echo "Credit card invalid. Please make sure that you entered a valid <em>" . $denum . "</em> credit card ";

	} else { //if it will pass...do something
	echo "Your <em>" . $denum . "</em> credit card is valid";
	}


}

da uma olhada nas documentações da hipercad e elo e add na função validateCC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou fazer alguns testes galera. .

 

 

O algorítimo Luhn é muito usado para estas verificações de cartão de credito, testei todos desta lista, porem retornou false na do HIPERCARD, mas pelo que andei pesquisando, parece estar errado, ou falta algum numero, infelizmente a maioria dos sites que falam a respeito de números para teste, replicaram o mesmo conteúdo.

<?php/* Luhn algorithm number checker - (c) 2005-2008 shaman - www.planzero.org * * This code has been released into the public domain, however please      * * give credit to the original author where possible.                      */function luhn_check($number) {  // Strip any non-digits (useful for credit card numbers with spaces and hyphens)  $number=preg_replace('/\D/', '', $number);  // Set the string length and parity  $number_length=strlen($number);  $parity=$number_length % 2;  // Loop through each digit and do the maths  $total=0;  for ($i=0; $i<$number_length; $i++) {    $digit=$number[$i];    // Multiply alternate digits by two    if ($i % 2 == $parity) {      $digit*=2;      // If the sum is two digits, add them together (in effect)      if ($digit > 9) {        $digit-=9;      }    }    // Total up the digits    $total+=$digit;  }  // If the total mod 10 equals 0, the number is valid  return ($total % 10 == 0) ? TRUE : FALSE;}var_dump( luhn_check('3841001111222233334') );

Ou também pode usar a

Respect\Validation

https://github.com/Respect/Validation#vcreditcard

 

e as cc dos cartões

function validateCC($cc_num, $type) {	if($type == "American") {	$denum = "American Express";	} elseif($type == "Dinners") {	$denum = "Diner's Club";	} elseif($type == "Discover") {	$denum = "Discover";	} elseif($type == "Master") {	$denum = "Master Card";	} elseif($type == "Visa") {	$denum = "Visa";	}	if($type == "American") {	$pattern = "/^([34|37]{2})([0-9]{13})$/";//American Express	if (preg_match($pattern,$cc_num)) {	$verified = true;	} else {	$verified = false;	}	} elseif($type == "Dinners") {	$pattern = "/^([30|36|38]{2})([0-9]{12})$/";//Diner's Club	if (preg_match($pattern,$cc_num)) {	$verified = true;	} else {	$verified = false;	}	} elseif($type == "Discover") {	$pattern = "/^([6011]{4})([0-9]{12})$/";//Discover Card	if (preg_match($pattern,$cc_num)) {	$verified = true;	} else {	$verified = false;	}	} elseif($type == "Master") {	$pattern = "/^([51|52|53|54|55]{2})([0-9]{14})$/";//Mastercard	if (preg_match($pattern,$cc_num)) {	$verified = true;	} else {	$verified = false;	}	} elseif($type == "Visa") {	$pattern = "/^([4]{1})([0-9]{12,15})$/";//Visa	if (preg_match($pattern,$cc_num)) {	$verified = true;	} else {	$verified = false;	}	}	if($verified == false) {	//Do something here in case the validation fails	echo "Credit card invalid. Please make sure that you entered a valid <em>" . $denum . "</em> credit card ";	} else { //if it will pass...do something	echo "Your <em>" . $denum . "</em> credit card is valid";	}}

da uma olhada nas documentações da hipercad e elo e add na função validateCC

Deu certo com o ValidateCC, porém não encontro em nenhum lugar o regex para Hipercard e Elo "/

...	} elseif($rgCartao == "hiper") {$pattern = "";//Hipercadif (preg_match($pattern,$nuCartao)) {$verified = true;} else {$verified = false;}} elseif($rgCartao == "elo") {$pattern = "";//Eloif (preg_match($pattern,$nuCartao)) {$verified = true;} else {$verified = false;}...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito complexo para desenvolver?

Não!

 

Todos cartões segue um padrão http://en.wikipedia.org/wiki/ISO/IEC_7812

 

http://en.wikipedia.org/wiki/List_of_Issuer_Identification_Numbers

 

Basicamente, os seis primeiros dígitos do cartão são o Issuer identifier number (IIN) (Número de Identificação do Emissor).

 

Você pode validar por ele

/^(606282\d{10}(\d{3})?)|(3841\d{15})$/ /*Hippercard*/

Procure pelo o da ELO, quais são os primeiros dígitos.

 

Eu não tenho este cartão! =D

 

outra dica é, você pode criar uma lista de IIN com o qual pode checar o número.

 

 

Edit:

 

De acordo com este post http://portal.maxistore.com.br/knowledgebase.php?action=displayarticle&id=235

 

o número de um cartão de teste ELO 6362970000457013

 

a regex seria:

/^([6362]{4})([0-9]{12})$/ /* elo */

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloquei as expressões de HIPERCARD e ELO da seguinte forma e deu certo:

	} elseif($rgCartao == "hiper") {
	$pattern = "/^(3841\d{10}(\d{3})?)|(3841\d{15})$/";//Hipercad
	if (preg_match($pattern,$nuCartao)) {
	$verified = true;
	} else {
	$verified = false;
	}

	} elseif($rgCartao == "elo") {
	$pattern = "/^([6362]{4})([0-9]{12})$/";//Elo
	if (preg_match($pattern,$nuCartao)) {
	$verified = true;
	} else {
	$verified = false;
	}

Valeu galera..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.