[tutorial] algoritimo de validação do cpf (php)

Postagem de conteúdo sobre programação php
Post Reply
User avatar
Kodo no Kami
Admin
Admin
Posts: 643
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

[tutorial] algoritimo de validação do cpf (php)

Post by Kodo no Kami » Tue Nov 07, 2017 5:29 pm

bom galera muitas vezes precisamos checar se o numero do cpf é valido ou não (mesmo se o numero do cpf seja valido não quer dizer que o cpf seja verdadeiro ou esteja em uso, para isso é necessario um sistema de consulta), para a gente validar um cpf podemos utilizar os dois ultimos digitos dele. esses dois ultimos digitos do cpf é o resultado de um calculo de todos os demais digitos dele ou seja esses dois ultimos digitos é um calculo de verificação do mesmo. para esse tutorial vamos construir uma simples pagina em php para comparar se todos os digitos passado bate com os dois ultimos e ao mesmo tempo aprender como fazer o calculo para validação do cpf. para começar colocamos as tags php

Code: Select all

<?php
?>
para facilitar criamos uma função onde vamos passar o cpf como argumento, no meu caso chamei a função de kodo_validarcpf

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
   }
?>
bom galera o cpf tem o seguinte formato 123.456.789-XY, sendo que para esse calculo temos que tratar cada numero separadamente, para o primeiro digito de verificação ou se preferir o 10ª digito do cpf (no meu exemplo seria o X), temos que multiplicar o primeiro digito do cpf por 10, o segundo por 9, o terceiro por 8, o quarto por 7, o quinto por 6, o sexto por 5, o setimo por 4, o oitavo por 3 e o nono por 2. no nosso exemplo ficaria assim

Code: Select all

cpf: 123.456.789

1 x 10 = 10
2 x 9 = 18
3 x 8 = 24
4 x 7 = 28
5 x 6 = 30
6 x 5 = 30
7 x 4 = 28
8 x 3 = 24
9 x 2 = 18
vamos fazer o mesmo em php (é possivel melhorar o codigo com loop e array )

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
   }
?>
agora somamos tudo

Code: Select all

10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210
no php fazemos o mesmo

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 
   }
?>
agora basta a gente dividir o numero por 11, se o resto da divisão (modulo) for menor que 2, então o 10ª digito do cpf é 0, se o resto da divisão for maior ou igual a 2 então subtraimos ele por 11. no meu exemplo a soma dos numeros foram 210, dividindo 210 por 11 temos como resultado 19 e como resto 1, como o numero 1 é menor que 2 então o 10ª digito é 0 (123.456.789-0Y)

Code: Select all

210 / 11 = 19 (resto: 1)

o valor 1 é menor que 2 então o digito é 0
o mesmo deve ser feito no php

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 
      
      $resto = $soma % 11;
      
      if($resto < 2){
         $digito10v = 0;
      }
      else{
         $digito10v = 11 - $resto;
      }
   }
?>
para o segundo digito de verificação ou 11ª digito do cpf (123.456.789-0Y), fazemos o mesmo que o primeiro digito com o diferencial que vamos começar a multiplicando por 11 e fazer a multiplicação com o 10ª digito do cpf que gente descobriu calculando

Code: Select all

cpf: 123.456.789-0

1 x 11 = 11
2 x 10 = 20
3 x 9 = 27
4 x 8 = 32
5 x 7 = 35
6 x 6 = 36
7 x 5 = 35
8 x 4 = 32
9 x 3 = 27
0 x 2 = 0
fazemos o mesmo em php

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 
      
      $resto = $soma % 11;
      
      if($resto < 2){
         $digito10v = 0;
      }
      else{
         $digito10v = 11 - $resto;
      }
      
      /*segundo digito*/
      
      $digito1 = $numerocpf[0] * 11;
      $digito2 = $numerocpf[1] * 10;
      $digito3 = $numerocpf[2] * 9;
      	
      $digito4 = $numerocpf[4] * 8;
      $digito5 = $numerocpf[5] * 7;
      $digito6 = $numerocpf[6] * 6;
	   
      $digito7 = $numerocpf[8] * 5;
      $digito8 = $numerocpf[9] * 4;
      $digito9 = $numerocpf[10] * 3;
      
      $digito10 = $digito10v * 2;
   }
?>
da mesma forma tambem temos que fazer a soma de todos os resultados

Code: Select all

11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255
fazemos o mesmo em php

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 

      $resto = $soma % 11;
      
      if($resto < 2){
         $digito10v = 0;
      }
      else{
         $digito10v = 11 - $resto;
      }
      
      /*segundo digito*/
      
      $digito1 = $numerocpf[0] * 11;
      $digito2 = $numerocpf[1] * 10;
      $digito3 = $numerocpf[2] * 9;
      	
      $digito4 = $numerocpf[4] * 8;
      $digito5 = $numerocpf[5] * 7;
      $digito6 = $numerocpf[6] * 6;
	   
      $digito7 = $numerocpf[8] * 5;
      $digito8 = $numerocpf[9] * 4;
      $digito9 = $numerocpf[10] * 3;
      
      $digito10 = $digito10v * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9 + $digito10; 
   }
?>
dividimos a soma dos numeros por 11, caso o resto da divisão (modulo) seja menor que 2 o ultimo digito do cpf é 0, caso o resto da divisão seja maior ou igual a 2, subtraimos o resto da divisão do numero 11. como o resultado do numero foi 255, divindindo ele por 11 temos como resultado 23 com o resto 2, como o resto é maior ou igual a 2 entao subtraimos ele do numero 11 ficando o numero 9 sendo ele o 11ª digito (123.456.789-09)

Code: Select all

255 / 11 = 23 (resto: 2)

o valor 2 é igual ou maior que 2 então fazemos

11 - 2 = 9
basta a gente fazer o mesmo em php

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 
      
      $resto = $soma % 11;
      
      if($resto < 2){
         $digito10v = 0;
      }
      else{
         $digito10v = 11 - $resto;
      }
      
      /*segundo digito*/
      
      $digito1 = $numerocpf[0] * 11;
      $digito2 = $numerocpf[1] * 10;
      $digito3 = $numerocpf[2] * 9;
      	
      $digito4 = $numerocpf[4] * 8;
      $digito5 = $numerocpf[5] * 7;
      $digito6 = $numerocpf[6] * 6;
	   
      $digito7 = $numerocpf[8] * 5;
      $digito8 = $numerocpf[9] * 4;
      $digito9 = $numerocpf[10] * 3;
      
      $digito10 = $digito10v * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9 + $digito10; 

      $resto = $soma % 11;
      
      if($resto < 2){
         $digito11v = 0;
      }
      else{
         $digito11v = 11 - $resto;
      }
   }
?>
pronto galera agora comparamos os dois ultimos digitos que nosso algoritimo gerou com os dois ultimos digitos passados com o cpf, se forem iguais então o cpf passado é valido, no caso vou retornar true ou false da minha função caso seja valido ou não

Code: Select all

<?php
   function kodo_validarcpf($numerocpf){
      $digito1 = $numerocpf[0] * 10;
      $digito2 = $numerocpf[1] * 9;
      $digito3 = $numerocpf[2] * 8;
      	
      $digito4 = $numerocpf[4] * 7;
      $digito5 = $numerocpf[5] * 6;
      $digito6 = $numerocpf[6] * 5;
	   
      $digito7 = $numerocpf[8] * 4;
      $digito8 = $numerocpf[9] * 3;
      $digito9 = $numerocpf[10] * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9; 
      
      $resto = $soma % 11;
      
      if($resto < 2){
         $digito10v = 0;
      }
      else{
         $digito10v = 11 - $resto;
      }
      
      /*segundo digito*/
      
      $digito1 = $numerocpf[0] * 11;
      $digito2 = $numerocpf[1] * 10;
      $digito3 = $numerocpf[2] * 9;
      	
      $digito4 = $numerocpf[4] * 8;
      $digito5 = $numerocpf[5] * 7;
      $digito6 = $numerocpf[6] * 6;
	   
      $digito7 = $numerocpf[8] * 5;
      $digito8 = $numerocpf[9] * 4;
      $digito9 = $numerocpf[10] * 3;
      
      $digito10 = $digito10v * 2;
      
      $soma = $digito1 + $digito2 + $digito3 + $digito4 + $digito5 + $digito6 + $digito7 + $digito8 + $digito9 + $digito10; 

      $resto = $soma % 11;
      
      if($resto < 2){
         $digito11v = 0;
      }
      else{
         $digito11v = 11 - $resto;
      }
      
      if(($numerocpf[12] == $digito10v) && ($numerocpf[13] == $digito11v)){
         return true;
      }
      else{
         return false;
      }
   }
?>
por fim podemos chamar a função e passar o cpf para ela

Code: Select all

if(kodo_validarcpf("123.456.789-09")){
   echo "CPF Valido";
}
else{
   echo "CPF Falso";
}
Image

esse tutorial foi feito usando a linguagem PHP o mesmo pode ser feito em qualquer outra linguagem, um exemplo disso é um bot em python (railguBot *-* ~ a railgun é a melhor waifu)

Image

bom galera lembrando, mesmo que o cpf seja valido não quer dizer que seja verdadeiro ou que esta em uso, então se voce tem um e-comerce ou alguma coisa desse tipo e precisa validar cpf o recomendado é procurar um sistema de consulta e não uma simples validação como essa, esse tutorial foi um pedido do agley entao discar para 190 é valido kkkk \o

by kodo no kami
Image

Conheça o sistema e manipule ele, se limite ao sistema e seja manipulado por ele ~kodo no kami

meu perfil yahoo

User avatar
51M0N
Admin
Admin
Posts: 846
Joined: Fri Jan 02, 2015 2:06 pm

Re: [tutorial] algoritimo de validação do cpf (php)

Post by 51M0N » Thu Nov 09, 2017 7:57 am

muito bom o post mano. =)
"Você, eu, nem ninguém vai bater tão duro como a vida. Mas não se trata de bater duro. Se trata de quanto você aguenta apanhar e seguir em frente (...). É assim que se consegue vencer." by Rocky Balboa

Post Reply

Return to “PHP”