-
-
Save claudiosanches/26d9668f21dbdc787472 to your computer and use it in GitHub Desktop.
<?php | |
// Test cards | |
$cards = array( | |
'378282246310005', // American Express | |
'371449635398431', // American Express | |
'5078601870000127985', // Aura | |
'5078601800003247449', // Aura | |
'30569309025904', // Diners Club | |
'38520000023237', // Diners Club | |
'6011111111111117', // Discover | |
'6362970000457013', // Elo | |
'6062825624254001', // Hipercard | |
'5555555555554444', // MasterCard | |
'5105105105105100', // MasterCard | |
'6759649826438453', // Maestro | |
'6799990100000000019', // Maestro | |
'4111111111111111', // Visa | |
'4012888888881881', // Visa | |
); | |
// Brands regex | |
$brands = array( | |
'visa' => '/^4\d{12}(\d{3})?$/', | |
'mastercard' => '/^(5[1-5]\d{4}|677189)\d{10}$/', | |
'diners' => '/^3(0[0-5]|[68]\d)\d{11}$/', | |
'discover' => '/^6(?:011|5[0-9]{2})[0-9]{12}$/', | |
'elo' => '/^((((636368)|(438935)|(504175)|(451416)|(636297))\d{0,10})|((5067)|(4576)|(4011))\d{0,12})$/', | |
'amex' => '/^3[47]\d{13}$/', | |
'jcb' => '/^(?:2131|1800|35\d{3})\d{11}$/', | |
'aura' => '/^(5078\d{2})(\d{2})(\d{11})$/', | |
'hipercard' => '/^(606282\d{10}(\d{3})?)|(3841\d{15})$/', | |
'maestro' => '/^(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}$/', | |
); | |
// Run test | |
foreach ( $cards as $number ) { | |
$brand = 'undefined'; | |
foreach ( $brands as $_brand => $regex ) { | |
if ( preg_match( $regex, $number ) ) { | |
$brand = $_brand; | |
break; | |
} | |
} | |
echo '<pre>' . print_r( array( $number, $brand ), true ) . '</pre>'; | |
} |
Essa validação pra Mastercard já não é tão precisa. /^(5[1-5] detecta somente cartões que começam de 51 até 55, mas já vi casos de cartões Mastercard que comecem com 58 e 59
Você deveria colocar a regra do Elo antes da do Visa, várias vezes essa validação considera um cartão da Elo como Visa.
Neste link, tem umas info sobre a BIN e validação bem legal.
Regex atualizado para EO =>
'elo' => '/^((((636368)|(438935)|(636369)|(504175)|(451416)|(636297)|(506699))\d{0,10})|((5067)|(4576)|(4011))\d{0,12})/',
Regra para Elo ainda não bate com todos os cartões.
Fiz uma Hiper expressão que merece ser refatorada mas ja resolveu meu lado
Expressão para Elo
(4011|431274|438935|451416|457393|4576|457631|457632|504175|627780|636297|636368|636369|(6503[1-3])|(6500(3[5-9]|4[0-9]|5[0-1]))|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|(6507(0[0-9]|1[0-8]))|(6507(2[0-7]))|(650(90[1-9]|91[0-9]|920))|(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[1-9]))|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))|(506(699|77[0-8]|7[1-6][0-9))|(509([0-9][0-9][0-9])))
Detalhamento das faixas:
650031 à 650033, ==> Exp (6503[1-3])
650035 à 650051, ==> Exp, (6500(3[5-9]|4[0-9]|5[0-1]))
650405 à 650439, ==> Exp(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))
650485 à 650538, ==> Exp(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))
650541 à 650598, ==> Exp(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))
650700 à 650718, ==> Exp(6507(0[0-9]|1[0-8]))
650720 à 650727, ==> Exp(6507(2[0-7]))
650901 à 650920, ==> Exp(650(90[0-9]|91[0-9]|920))
651652 à 651679, ==> Exp(6516(5[2-9]|6[0-9]|7[0-9]))
655000 à 655019, ==> Exp(6550(0[0-9]|1[1-9]))
655021 à 655058, ==> Exp(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))
506699 à 506778 , ==> Exp(506(699|77[0-8]|7[0-6][0-9]))
509000 à 509999, ==> Exp, (509([0-9][0-9][0-9]))
Iniciais sem faixas
627780,636297,636368,636369, 4011, 431274, 438935, 451416, 457393, 4576, 457631, 457632, 504175,
Elo atualizado 2019
^(40117[8-9]|431274|438935|451416|457393|45763[1-2]|506(699|7[0-6][0-9]|77[0-8])|509\d{3}|504175|627780|636297|636368|65003[1-3]|6500(3[5-9]|4[0-9]|5[0-1])|6504(0[5-9]|[1-3][0-9])|650(4[8-9][0-9]|5[0-2][0-9]|53[0-8])|6505(4[1-9]|[5-8][0-9]|9[0-8])|6507(0[0-9]|1[0-8])|65072[0-7]|6509(0[1-9]|1[0-9]|20)|6516(5[2-9]|[6-7][0-9])|6550([0-1][0-9]|2[1-9]|[3-4][0-9]|5[0-8]))
Muito obrigado!
Minha sugestão de validação é a seguinte:
Ordem | Bandeira |
---|---|
1 | ELO |
2 | HIPERCARD |
3 | DINERS |
4 | AMEX |
5 | MASTERCARD |
6 | VISA |
Aura também não está batendo. Algumas estão sendo detectadas como mastercard.
Gerei pelo https://www.4devs.com.br/gerador_de_numero_cartao_credito.
6062820446079595
5085705358351113
5090752762253595
5088787736515335
5064539927513258
6062820446079595
Esse é Hipercard.
O pattern que tenho usado para detectar cartões aura é:
/^((?!504175))^((?!5067))(^50[0-9])/ (syntax Javascript)
Utilizo a ordem sugerida pelo @herlanijunior. Testo Aura após MasterCard
6516 5200 0000 0000 é um elo card, mas está sendo detectado como um discover card
Pessoal o Regex Oficial da Elo que está no site dev deles é este;
^(50(67(0[78]|1[5789]|2[012456789]|3[0123459]|4[0-7]|53|7[4-8])|9(0(0[0-9]|1[34]|2[0134567]|3[0359]|4[01235678]|5[015789]|6[012356789]|7[013]|8[1234789]|9[1379])|1(0[34568]|4[6-9]|5[1-8]|8[36789])|2(2[02]|5[7-9]|6[012356789]|7[012345689]|8[012356789]|90)|357|4(0[7-9]|1[0-9]|2[0-2]|5[7-9]|6[0-7]|8[45])|55[01]|636|7(2[3-8]|31|6[5-9])))|4(0117[89]|3(1274|8935)|5(1416|7(393|63[12])))|6(27780|36368|5(0(0(3[1258]|4[026]|7[78])|4(06|1[0234]|2[2-9]|3[04589]|8[5-9]|9[0-9])|5(0[01346789]|1[012456789]|2[0-9]|3[0178]|5[2-9]|6[0-6]|7[7-9]|8[0134678]|9[1-8])|72[0-7]|9(0[1-9]|1[0-8]|2[0128]|3[89]|4[6-9]|5[0158]|6[2-9]|7[01]))|16(5[236789]|6[025678]|7[01456789]|88)|50(0[01356789]|1[2568]|36|5[1267]))))$
@Devmaster1818 no site dev deles qual? tem o link?
Até hoje é uma desgraça essas coisas de validar números de cartões, sempre tem novas ranges de números surgindo de algumas bandeiras, nunca tem link dos sites oficiais pra dizer como é e como não é pra ser implementado e cada lugar vc vê algumas regex diferentes. É um saco isso
ELO:
(4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|636297|636368|636369|(6503[1-3])|(6500(3[5-9]|4[0-9]|5[0-1]))|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|(6507(0[0-9]|1[0-8]))|(6507(2[0-7]))|(650(90[1-9]|91[0-9]|920))|(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[1-9]))|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))|(506(699|77[0-8]|7[1-6][0-9))|(509([0-9][0-9][0-9])))
Esse aqui funcionou para todos os testes que fiz ^^
https://www.getbincodes.com/company-cc-elo/
https://www.vccgenerator.org
o regex oficial da ELO você consegue na página de documentação deles, aí pra conseguir pegar tem que logar.
Pra ser mais rápido aqui está o link: https://dev.elo.com.br/apis/tabela-de-bins?lng=pt
Alguem sabe se o Regex da Aura atualizou? no meu não está funcionando... está sempre caindo no Maestro
aura - /^((?!5078))^((?!5067))(^50[0-9])/
ou /^((?!504175))^((?!5067))(^50[0-9])/
maestro - ^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}
ELO: (4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|636297|636368|636369|(6503[1-3])|(6500(3[5-9]|4[0-9]|5[0-1]))|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|(6507(0[0-9]|1[0-8]))|(6507(2[0-7]))|(650(90[1-9]|91[0-9]|920))|(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[1-9]))|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))|(506(699|77[0-8]|7[1-6][0-9))|(509([0-9][0-9][0-9]))) Esse aqui funcionou para todos os testes que fiz ^^ https://www.getbincodes.com/company-cc-elo/ https://www.vccgenerator.org
@Bluebom Muito bom!! Fui usar e percebi que na penúltima expressão faltou fechar uma chave ]
. Vou mandar o código com a chave abaixo para quem não queira procurar:
(4011|431274|438935|451416|457393|4576|457631|457632|504175|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|636297|636368|636369|(6503[1-3])|(6500(3[5-9]|4[0-9]|5[0-1]))|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|(6507(0[0-9]|1[0-8]))|(6507(2[0-7]))|(650(90[1-9]|91[0-9]|920))|(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[1-9]))|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))|(506(699|77[0-8]|7[1-6][0-9]))|(509([0-9][0-9][0-9])))
Eu dei uma incrementada usando quantificadores para pegar o tamanho do cartão também. Não consegui comprovar se a ELO trabalha apenas com 16 dígitos, mas estou assumindo que sim:
(4011\d{12}|431274\d{10}|438935\d{10}|451416\d{10}|457393\d{10}|4576\d{12}|457631\d{10}|457632\d{10}|504175\d{10}|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])\d{10}|627780\d{10}|636297\d{10}|636368\d{10}|636369\d{10}|(6503[1-3])\d{11}|(6500(3[5-9]|4[0-9]|5[0-1]))\d{10}|(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))\d{10}|(650(48[5-9]|49[0-9]|50[0-9]|51[1-9]|52[0-9]|53[0-7]))\d{10}|(6505(4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))\d{10}|(6507(0[0-9]|1[0-8]))\d{10}|(6507(2[0-7]))\d{10}|(650(90[1-9]|91[0-9]|920))\d{10}|(6516(5[2-9]|6[0-9]|7[0-9]))\d{10}|(6550(0[0-9]|1[1-9]))\d{10}|(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8]))\d{10}|(506(699|77[0-8]|7[1-6][0-9]))\d{10}|(509([0-9][0-9][0-9]))\d{10})
Alguem sabe se o Regex da Aura atualizou? no meu não está funcionando... está sempre caindo no Maestro
aura -
/^((?!5078))^((?!5067))(^50[0-9])/
ou/^((?!504175))^((?!5067))(^50[0-9])/
maestro -^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}
Aqui também sempre cai maestro
Regex hell. É zoado, as próprias companhias poderiam fornecer regex ou algoritmos/sdks pros serviços deles porque é foda. Volte meia essas sequencias mudam, e dar manutenção em regex é um inferno.
Fiz um nova versão que me atendeu para todos os cenários da imagem considerando cartões de 16 dígitos:
^(?:40117[8-9]|431274|438935|451416|457393|45763[1-2]|504175|506699|5067(?:[0-6][0-9]|7[0-8])|509[0-9][0-9][0-9]|627780|636297|636368|6500(?:3[1-3]|3[5-9]|4[0-9]|5[0-1])|650(?:4(?:0[5-9]|[1-9][0-9])|5(?:[0-2][0-9]|3[0-8]|4[1-9]|[5-8][0-9]|9[0-8]))|6507(?:0[0-9]|1[0-8]|2[0-7])|6509(?:0[1-9]|1[0-9]|20)|6516(?:5[2-9]|[6-7][0-9])|6550(?:[0-1][0-9]|2[1-9]|[3-4][0-9]|5[0-8])|65165[2-4]|65048[5-8]|650489|65049[0-4])\d{10}$
@claudiosanches gostaria de saber onde você obteve essas regras e caso surja algum regra nova, como poderia obter essa atualização? Obrigado.