O Mod 10 (algorítimo de Luhn) é um algoritmo para validação de cartões que é utilizado pela maioria das bandeiras em todo o mundo. A seguir mostro como utilizar o algoritmo para validar a numeração do cartão.
Cartão da Visa que vamos analisar: 4916 6418 5936 9080.
1. Separe o último dígito do cartão. Neste caso é o zero.
2. Multiplique a numeração do cartão, número por número sendo a coluna ímpar por 1 e a coluna par por 2, levando em conta que a primeira coluna inicia-se por 0 (zero). Se o valor da multiplicação tiver dois dígitos, separe e some cada unidade. Em seguida, some todos os valores.
3. Com o resultado anterior, faça uma divisão por 10 para obter o resto da divisão:
Neste caso, o resto da divisão é 0 (zero).
4. Subtraia o resto da divisão por 10:
10 - 0 = 10
Pode ser considerado como zero neste caso.
5. Faça a verificação do número que foi separado no item 1 com o resultado do item 4. Se os números forem iguais, o cartão é valido, e se forem diferentes, é invalido.
Em nosso exemplo temos um cartão com final 0 (zero), e o resultado de todo o cálculo foi 10, pois tivemos um resultado zerado no terceiro passo, podemos levar em conta que o resultado do quarto passo é zero, com isso temos:
0 = 0
Com isso, o cartão Visa analisado possui uma numeração válida.
Veja um exemplo de cartão inválido: 5419 8250 0346 1210 (Mastercard).
Final do cartão 0 ≠ 1 resultado final, logo cartão inválido.
Dica: Pesquise por sites geradores de cartões de teste para validar a numeração do cartão.
Validação no backend
Mesmo tendo o plugin verificador no frontend, é fundamental, até por questões de segurança, que uma validação ocorra no backend. Para isso, a função abaixo irá ajudar a fazer essa validação:
<?php
function cardIsValid($cardNumber)
{
$number = substr($cardNumber, 0, -1);
$doubles = [];
for ($i = 0, $t = strlen($number); $i < $t; ++$i) {
$doubles[] = substr($number, $i, 1) * ($i % 2 == 0? 2: 1);
}
$sum = 0;
foreach ($doubles as $double) {
for ($i = 0, $t = strlen($double); $i < $t; ++$i) {
$sum += (int) substr($double, $i, 1);
}
}
return substr($cardNumber, -1, 1) == (10-$sum%10)%10;
}
Para utilizá-la, basta testar o número do cartão enviado pelo cliente:
if (cardIsValid($customerCardNumber)) {
// o cartão é válido e podemos dar andamento na integração
}
Comentários
1 comentário
Obrigado pelo artigo mas um aviso importante: essa função PHP que foi cedida como amostra não está confiável e deve ser revista.
Existem números que são válidos de acordo com o algoritmo de Luhn mas que a função retorna como false, ex:
379072330149966
342172622820417
348996318968237
374646468525074
375513266111326
374351582936865
342668532230571
O código PHP pode ser testado aqui:
https://sandbox.onlinephpfunctions.com/
Os números podem ser testado aqui:
https://evilacid.com/luhn-checksum-validator-generator
Recomendação: usar este algoritmo https://stackoverflow.com/questions/174730/what-is-the-best-way-to-validate-a-credit-card-in-php
Obrigado!
Por favor, entre para comentar.