Consulta e validação de CNH e CPF via código

Estou tentando incluir algumas validações em meu sistema, que verifiquem a autenticidade dos dados recolhidos, para identificar possíveis fraudes.

Uma coisa que seria muito útil é a validação do número da CNH. No site do Denatran tem uma consulta para verificar se a CNH é verdadeira: https://denatran.serpro.gov.br/index2.htm (Carteira Habilitação > Número de Segurança). Alguém conhece alguma forma de acessar esse serviço automaticamente? Algum webservice que disponibilize essa validação?

Outra validação que eu gostaria de fazer era na consulta de IRPF, para verificar se o CPF existe mesmo. A consulta também está disponível pela web: http://www.receita.fazenda.gov.br/Aplicacoes/Atrjo/ConsRest/Atual.app/paginas/index.asp

Alguém sabe se existe e como acessar esses serviços?

Você precisa realmente verificar se eles existem (acho difícil por questão de segurança) ? Normalmente só verificamos se é valido através de uma regra que é validada pelo dígito verificador que pra CPF eu sei que existem e possuem vários exemplos por aqui mesmo. Não consigo responder como funciona para CNH pelo fato de nunca precisar, mas acho que segue a mesma ideia. Além de que se não for necessário verificar “se existe” através de um ws a performance do seu algoritmo será melhor.

Sim, precisaria verificar se existe, da mesma forma que é feito no link que passei, mas através de algum serviço que a minha aplicação pudesse acessar.

Entendi. Talvez o órgãos responsáveis são os que irão melhor responder tua pergunta. Perguntando pra eles se os mesmos disponibilizam algum web service público para consulta. Podem existir terceiros que disponibilizam isso também como acontece com CEP, mas tratando de documento eu não confiaria muito. Boa sorte ai.

Tentei contato pelo SAC do DETRAN, mas não consegui resposta… Tentei contato com alguém da área de TI, mas não tive muito sucesso nisso :confused:

O pessoal da TI falou que não tem esse serviço ou eles também não sabem?

Não consegui contato com ninguém de lá

Pessoal, boa tarde!

Tenho esse webservice.

Se precisarem…

edmar_puerta@hotmail.com

1 curtida

A validação é feita atraves de um algoritmo. Tenho esse codigo, ele gera um CPF valido. Você pode informar um cpf e fazer a comparação com o que foi gerado. Mas o problema é que ele pode gerar um numero que ainda possa não existir na receita

import java.util.ArrayList;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.text.MaskFormatter;

public class GerarCpf {
	private ArrayList<Integer> listaAleatoria = new ArrayList<Integer>();
	private ArrayList<Integer> listaNumMultiplicados = null;

	public int geraNumAleatorio(){
		int numero = (int) (Math.random() * 10);
	        return numero;
	}	
        
	public ArrayList<Integer> geraCPFParcial(){
		for(int i = 0; i < 9; i++){
			listaAleatoria.add(geraNumAleatorio());
		}
                return listaAleatoria;
	}
	
	public ArrayList<Integer> geraPrimeiroDigito(){
		listaNumMultiplicados = new ArrayList<Integer>();
		int primeiroDigito;
		int totalSomatoria = 0;
		int restoDivisao;
		int peso = 10;
		
		for(int item : listaAleatoria){
			listaNumMultiplicados.add(item * peso);
		        peso--;
		}
		
		for(int item : listaNumMultiplicados){
			totalSomatoria += item;
		}
		
		restoDivisao = (totalSomatoria % 11);
		if(restoDivisao < 2){
			primeiroDigito = 0;
		} else{
			primeiroDigito = 11 - restoDivisao;
		}

		listaAleatoria.add(primeiroDigito);
		
		return listaAleatoria;
	}

	public ArrayList<Integer> geraSegundoDigito(){
		listaNumMultiplicados = new ArrayList<Integer>();
		int segundoDigito;
		int totalSomatoria = 0;
		int restoDivisao;
		int peso = 11;
		
		for(int item : listaAleatoria){
			listaNumMultiplicados.add(item * peso);
			peso--;
		}
                
		for(int item : listaNumMultiplicados){
			totalSomatoria += item;
		}
		
		restoDivisao = (totalSomatoria % 11);

		if(restoDivisao < 2){
			segundoDigito = 0;
		} else{
			segundoDigito = 11 - restoDivisao;
		}
                
		listaAleatoria.add(segundoDigito);
		
		return listaAleatoria;
	}
	
	public String geraCPFFinal() {
		//metodo de geracao
		geraCPFParcial();
		geraPrimeiroDigito();
		geraSegundoDigito();
		
		String cpf = "";
		String texto = "";
	
		for(int item : listaAleatoria){
			texto += item;
		}
	
       	try {
    		MaskFormatter mf = new MaskFormatter("###.###.###-##");  
    		mf.setValueContainsLiteralCharacters(false);
    		cpf = mf.valueToString(texto);
       	} catch(Exception ex){
       		ex.printStackTrace();
       	}
		
		return cpf;	
	}
        
        
              
        
        public int gerarNumeros() {
        int numero;  
        int[] num = new int[6];  
        Random r = new Random();  
        for(int i=0; i<num.length; i++){  
             numero = r.nextInt(60) + 1;  
             for(int j=0; j<num.length; j++){  
                   if(numero == num[j] && j != i){  
                         numero = r.nextInt(60) + 1;  
                   }else{  
                        num[i] = numero;  
                   }  
             } 
        
        }
            return 0;  
            //Ainda para configurar o retorno
            
              
}
        
}        
  



        


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    /*
    Tentativa 1
    
    private static String calcDigVerif(String num) {    
        Integer primDig, segDig;    
        int soma = 0, peso = 10;    
        for (int i = 0; i < num.length(); i++)    
                soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;    
    
        if (soma % 11 == 0 | soma % 11 == 1)    
            primDig = new Integer(0);    
        else    
            primDig = new Integer(11 - (soma % 11));    
    
        soma = 0;    
        peso = 11;    
        for (int i = 0; i < num.length(); i++)    
                soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;    
            
        soma += primDig.intValue() * 2;    
        if (soma % 11 == 0 | soma % 11 == 1)    
            segDig = new Integer(0);    
        else    
            segDig = new Integer(11 - (soma % 11));    
    
        return primDig.toString() + segDig.toString();    
    }    
    
    public static String geraCPF() {    
        String iniciais = "";    
        Integer numero;    
        for (int i = 0; i < 9; i++) {    
            numero = new Integer((int) (Math.random() * 10));    
            iniciais += numero.toString();    
        }    
        return iniciais + calcDigVerif(iniciais);    
    }    
    
    public static boolean validaCPF(String cpf) {    
        if (cpf.length() != 11)    
            return false;    
    
        String numDig = cpf.substring(0, 9);    
        return calcDigVerif(numDig).equals(cpf.substring(9, 11));    
    }  

    */

Existe uma maneira meia força bruta que é você manipular o html usando o htmlunit por exemplo, da uma pesquisada.