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.
Nesse artigo você verá como utilizar o algoritmo para validar a numeração do cartão.
Exemplo para cartão válido
Será analisado um cartão da bandeira Visa com o número 4916 6418 5936 9080.
1. Separe o último dígito do cartão, neste caso é o zero.
2. Multiplique cada número do cartão, um por um. Para isso, multiplique os números nas colunas ímpares por 1 e os números nas colunas pares por 2, lembrando que a primeira coluna é a coluna 0 (zero). Se o resultado da multiplicação tiver dois dígitos, separe esses dígitos e some-os individualmente. Depois some todos os valores obtidos.
Se a soma dos valores terminar em zero, ou seja, em valor múltiplo de 10 (como no exemplo, que é 80), o cartão é válido pelo algoritmo de Luhn.
Exemplo para cartão inválido
Será analisado um cartão da bandeira Mastercard com o número 5419 8250 0346 1210.
Nessa conta, a soma das unidades resultou em 49, que é diferente de zero e, portanto, inválida de acordo com o algoritmo de Luhn.
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.