Como validar um cartão usando o Mod 10?

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.

Exemplo para cartão válido

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.

Exemplo para cartão inválido

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
}

Did this page help you?