Tretas e Cenas

Tretas e Cenas


Onde escrevo as minhas tretas. Tão depressa estou a escrever sobre algo poético como a seguir escrevo só para não me esquecer.

Dezembro 2016
S T Q Q S S D
 1234
567891011
12131415161718
19202122232425
262728293031  

Categorias


Validar o Cartão de Cidadão em PHP

Um pequeno código em PHP para validar o Cartão do Cidadão Português.

Pedro FonsecaPedro Fonseca

Para memória futura, aqui vai o método que uso para validar o número do Cartão de Cidadão em PHP.

<?php
function validateCC($cardNumber)
{
    $charMapping = ['0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15, 'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19, 'K' => 20, 'L' => 21, 'M' => 22, 'N' => 23, 'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, 'S' => 28, 'T' => 29, 'U' => 30, 'V' => 31, 'W' => 32, 'X' => 33, 'Y' => 34, 'Z' => 35];
    $cardNumber = array_reverse(str_split(strtoupper($cardNumber)));
    $sum = 0;
    $secondDigit = false;
    if (count($cardNumber) != 12){
        return false;
    }
    foreach ($cardNumber as $char) {

        $value = $charMapping[$char];
        if ($secondDigit) {
            $value = $value*2;
            if ($value>9){
                $value = $value-9;
            }
        }
        $sum = $sum+$value;
        $secondDigit = !$secondDigit;
    }
    return ($sum % 10) == 0;
}

echo (validateCC('112233441ZX0')?"Válido":"Inválido");
?>

 

Sou licenciado em Sistemas de informação na Universidade Lusófona, gosto de tecnologia, programação, desportos radicais, bicicletas e motas. Adoro o Sistema Android e começo a gostar de Linux. E ainda tenho a mania que sei cozinhar.

Comentários 10
  • Friend
    Posted on

    Friend Friend

    Responder Autor

    Viva,
    Podias ter feito de forma diferente. Como por exemplo:

    function validateCC($cardNumber)
    {
    $charMapping = [‘0’ => 0, ‘1’ => 1, ‘2’ => 2, ‘3’ => 3, ‘4’ => 4, ‘5’ => 5, ‘6’ => 6, ‘7’ => 7, ‘8’ => 8, ‘9’ => 9, ‘A’ => 10, ‘B’ => 11, ‘C’ => 12, ‘D’ => 13, ‘E’ => 14, ‘F’ => 15, ‘G’ => 16, ‘H’ => 17, ‘I’ => 18, ‘J’ => 19, ‘K’ => 20, ‘L’ => 21, ‘M’ => 22, ‘N’ => 23, ‘O’ => 24, ‘P’ => 25, ‘Q’ => 26, ‘R’ => 27, ‘S’ => 28, ‘T’ => 29, ‘U’ => 30, ‘V’ => 31, ‘W’ => 32, ‘X’ => 33, ‘Y’ => 34, ‘Z’ => 35];

    $cardNumber = array_reverse(str_split(strtoupper($cardNumber)));
    $sum = 0;
    $secondDigit = false;

    if(count($cardNumber) != 12)
    return false;

    foreach ($cardNumber as $char) {
    $value = $charMapping[$char];

    if ($secondDigit) {
    $value = $value * 2;
    if ($value > 9)
    $value = $value – 9;
    }

    $sum = $sum + $value;
    $secondDigit = !$secondDigit;
    }

    return ($sum % 10) == 0;
    }

    Abraço


    • Pedro Fonseca
      Posted on

      Pedro Fonseca Pedro Fonseca

      Responder Autor

      Obrigado pela nova forma, julgo que está bem melhor. Abraço


      • Valdemar Miguel
        Posted on

        Valdemar Miguel Valdemar Miguel

        Responder Autor

        Olá,
        Tenho andado à procura de um código como o vosso, de validação do CC/BI, a segunda opção não está a fazer a validação do numero, apenas verifica a forma. A primeira opção não valida nenhum numero!


        • Pedro Fonseca
          Posted on

          Pedro Fonseca Pedro Fonseca

          Responder Autor

          Olá Valdemar,

          Vou colocar aqui um script que corre sozinho, apenas tens de mudar o numero do CC. Coloca isto num fichero PHP, sem mais nada, para testar:

          function validateCC($cardNumber)
          {
          $charMapping = [‘0’ => 0, ‘1’ => 1, ‘2’ => 2, ‘3’ => 3, ‘4’ => 4, ‘5’ => 5, ‘6’ => 6, ‘7’ => 7, ‘8’ => 8, ‘9’ => 9, ‘A’ => 10, ‘B’ => 11, ‘C’ => 12, ‘D’ => 13, ‘E’ => 14, ‘F’ => 15, ‘G’ => 16, ‘H’ => 17, ‘I’ => 18, ‘J’ => 19, ‘K’ => 20, ‘L’ => 21, ‘M’ => 22, ‘N’ => 23, ‘O’ => 24, ‘P’ => 25, ‘Q’ => 26, ‘R’ => 27, ‘S’ => 28, ‘T’ => 29, ‘U’ => 30, ‘V’ => 31, ‘W’ => 32, ‘X’ => 33, ‘Y’ => 34, ‘Z’ => 35];
          $cardNumber = array_reverse(str_split(strtoupper($cardNumber)));
          $sum = 0;
          $secondDigit = false;
          if (count($cardNumber) != 12){
          return false;
          }
          foreach ($cardNumber as $char) {

          $value = $charMapping[$char];
          if ($secondDigit) {
          $value = $value*2;
          if ($value>9){
          $value = $value-9;
          }
          }
          $sum = $sum+$value;
          $secondDigit = !$secondDigit;
          }
          return ($sum % 10) == 0;
          }

          echo (validateCC(‘112233441ZX0’)?”Válido”:”Inválido”);


  • Ricardo Ferreira
    Posted on

    Ricardo Ferreira Ricardo Ferreira

    Responder Autor

    Posso usar isso para fazer um login?


    • Pedro Fonseca
      Posted on

      Pedro Fonseca Pedro Fonseca

      Responder Autor

      Olá Ricardo,

      Epah, não me parece que seja um bom principio, podes usar para validar o CC, mas para usar isto como parte do login de um sistema, bom tens de ter atenção. Eu diria que para autenticação podes usar o email, é mais simples.

      Cumprimentos.


  • José Martins
    Posted on

    José Martins José Martins

    Responder Autor

    Olá Pedro, o Cartão do Cidadão do meu Pai dá erro. O meu dá corretamente mas o do meu pai que é um nr bem mais antigo porque ele tem 78 anos dá erro. No cartão do Cidadão do meu pai o 1º numero é um zero. Não sei é por isso mas o que é certo é que com o nr do CC dele dá erro.


  • José Martins
    Posted on

    José Martins José Martins

    Responder Autor

    O numero do meu pai comeca com: 03XXXXXX X XXX


  • José Martins
    Posted on

    José Martins José Martins

    Responder Autor

    Desculpa Pedro, afinal eu é que estava a fazer o algoritmo mal. Curioso é que é mesmo obrigatório o loop do ciclo for tenha que ser decrescente, ou seja, do ultimo numero ou letra do CC. Eu estava a fazer um loop crescente: for (var i=0; i <= nrCartao.length -1; i++).

    Depois de pesquisar um bocado encontrei no portal das finanças as regras de validação do CC como coloco aqui em baixo o link:
    https://www.autenticacao.gov.pt/documents/10179/11463/Valida%C3%A7%C3%A3o+de+N%C3%BAmero+de+Documento+do+Cart%C3%A3o+de+Cidad%C3%A3o/0dbc446b-3718-41e5-b982-551a72f8b8a8

    E realmente diz que na validação do Check Digit:
    "Efectuando uma contagem da direita para a esquerda do número de documento,
    duplicar o valor de cada 2º elemento, sendo que as letras deverão ser substituídas de
    acordo com a tabela de conversão presente neste documento;"
    Agora tenho a funcionar a validacao do CC quer em Javascript quer em c#.

    Desde já peço as minhas desculpas, mas até foi bom ter feito ao contrário para assim conseguir perceber a razão do erro.

    Valeu.
    Cumprimentos.


    • Pedro Fonseca
      Posted on

      Pedro Fonseca Pedro Fonseca

      Responder Autor

      Ainda bem que conseguiste. Eu também tive que ler esse documento para perceber o que estava a fazer mal e no fim lá consegui.