Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
Como faço para validar o número do cartão de crédito conforme a bandeira?
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";
}return "0";
}return "0";
}return "0";
}return "Tipo não foi informado";
}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
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;}...
Dei uma pesquisada e também não encontro... se não tivesse com tanta coragem ia tentar desenvolver um... rsrrs
Muito complexo para desenvolver?
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 /
Opa.. vou estudar os links e testar.. valeu
Respondo assim que terminar os testes :kiss:
Não não basta saber interpretar os primeiros números, é por aí.
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..
Fala pessoal, beleza?
Vocês sabem me dizer se o cartão elo se restringe apenas em "6362" ?
Encontrei esta referencia.Porem não sei se da pra confiar.
https://gist.github.com/erikhenrique/5931368
Valeu
Você pode dar uma olhada nesse link
http://www.htmlstaff.org/ver.php?id=2079