DannyND 1 Denunciar post Postado Abril 25, 2014 Bom dia, Como faço para validar o número do cartão de crédito conforme a bandeira? Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Abril 25, 2014 Você pode dar uma olhada nesse link http://www.htmlstaff.org/ver.php?id=2079 Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Abril 25, 2014 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
Williams Duarte 431 Denunciar post Postado Abril 25, 2014 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
Riberry 13 Denunciar post Postado Abril 25, 2014 Respect Validation https://github.com/Respect/Validation/blob/master/library/Respect/Validation/Rules/CreditCard.php Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Abril 25, 2014 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
Alaerte Gabriel 662 Denunciar post Postado Abril 25, 2014 Dei uma pesquisada e também não encontro... se não tivesse com tanta coragem ia tentar desenvolver um... rsrrs Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Abril 25, 2014 Muito complexo para desenvolver? Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Abril 25, 2014 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
DannyND 1 Denunciar post Postado Abril 25, 2014 Opa.. vou estudar os links e testar.. valeuRespondo assim que terminar os testes :kiss: Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Abril 28, 2014 Não não basta saber interpretar os primeiros números, é por aí. Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Abril 28, 2014 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
|Jezao| 0 Denunciar post Postado Maio 22, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites