Intro I’m a newbie in the Linux world but this dotfiles thing it’s AWESOME. So, as the law says, one must create a...
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.
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"); ?>
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
Obrigado pela nova forma, julgo que está bem melhor. Abraço
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!
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”);
Posso usar isso para fazer um login?
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.
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.
O numero do meu pai comeca com: 03XXXXXX X XXX
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.
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.