Função para validar cartões de crédito, com suporte a validação de CVC.
O primeiro parâmetro é o número do cartão e o segundo o CVC (opcional), os dados serão sanitizados, sendo filtrado somente os números.
A saida é um array de três posições, a primeira retorna false (em caso de erro) ou a bandeira, a segunda se o número do cartão é válido e a terceira se o CVC é válido.
/** * @author Felipe Braz * @website https://braz.dev/blog * @param int $cartao * @param int $cvc * @return array */ function valida_cartao($cartao, $cvc=false){ $cartao = preg_replace("/[^0-9]/", "", $cartao); if($cvc) $cvc = preg_replace("/[^0-9]/", "", $cvc); $cartoes = array( 'visa' => array('len' => array(13,16), 'cvc' => 3), 'mastercard' => array('len' => array(16), 'cvc' => 3), 'diners' => array('len' => array(14,16), 'cvc' => 3), 'elo' => array('len' => array(16), 'cvc' => 3), 'amex' => array('len' => array(15), 'cvc' => 4), 'discover' => array('len' => array(16), 'cvc' => 4), 'aura' => array('len' => array(16), 'cvc' => 3), 'jcb' => array('len' => array(16), 'cvc' => 3), 'hipercard' => array('len' => array(13,16,19), 'cvc' => 3), ); switch($cartao){ case (bool) preg_match('/^(636368|438935|504175|451416|636297)/', $cartao) : $bandeira = 'elo'; break; case (bool) preg_match('/^(606282)/', $cartao) : $bandeira = 'hipercard'; break; case (bool) preg_match('/^(5067|4576|4011)/', $cartao) : $bandeira = 'elo'; break; case (bool) preg_match('/^(3841)/', $cartao) : $bandeira = 'hipercard'; break; case (bool) preg_match('/^(6011)/', $cartao) : $bandeira = 'discover'; break; case (bool) preg_match('/^(622)/', $cartao) : $bandeira = 'discover'; break; case (bool) preg_match('/^(301|305)/', $cartao) : $bandeira = 'diners'; break; case (bool) preg_match('/^(34|37)/', $cartao) : $bandeira = 'amex'; break; case (bool) preg_match('/^(36,38)/', $cartao) : $bandeira = 'diners'; break; case (bool) preg_match('/^(64,65)/', $cartao) : $bandeira = 'discover'; break; case (bool) preg_match('/^(50)/', $cartao) : $bandeira = 'aura'; break; case (bool) preg_match('/^(35)/', $cartao) : $bandeira = 'jcb'; break; case (bool) preg_match('/^(60)/', $cartao) : $bandeira = 'hipercard'; break; case (bool) preg_match('/^(4)/', $cartao) : $bandeira = 'visa'; break; case (bool) preg_match('/^(5)/', $cartao) : $bandeira = 'mastercard'; break; } $dados_cartao = $cartoes[$bandeira]; if(!is_array($dados_cartao)) return array(false, false, false); $valid = true; $valid_cvc = false; if(!in_array(strlen($cartao), $dados_cartao['len'])) $valid = false; if($cvc AND strlen($cvc) <= $dados_cartao['cvc'] AND strlen($cvc) !=0) $valid_cvc = true; return array($bandeira, $valid, $valid_cvc); }
Ah, a minha esposa queria que eu botasse nesse post uma foto de gatinho, então lá vai: