0

Utilizando el siguiente código realizo la validación del dígito validador del RFC de México:

private boolean isCheckDigitValid(String taxIdNumber) {
    taxIdNumber = taxIdNumber.toUpperCase().trim();
    if (taxIdNumber.length() == 12) {
        taxIdNumber = " " + taxIdNumber;
    }
    int sumOfCharacterValues = 0;
    for (int i = 0; i < taxIdNumber.length() - 1; i++) {
        char character = taxIdNumber.charAt(i);
        sumOfCharacterValues = sumOfCharacterValues + lookupTable.get(character) * (13 - i);
    }
    int remainder = sumOfCharacterValues % 11;
    if (remainder == 0) {
        return getLastCharacter(taxIdNumber).equals("0");
    } else if (remainder == 1) {
        return getLastCharacter(taxIdNumber).equals("A");
    } else {
        return getLastCharacter(taxIdNumber).equals(String.valueOf(11 - remainder));
    }
}

private String getLastCharacter(String taxIdNumber) {
    return taxIdNumber.substring(taxIdNumber.length() - 1);
}

private static Map<Character, Integer> lookupTable = new HashMap<>();
static {
    lookupTable.put('0', 0);
    lookupTable.put('1', 1);
    lookupTable.put('2', 2);
    lookupTable.put('3', 3);
    lookupTable.put('4', 4);
    lookupTable.put('5', 5);
    lookupTable.put('6', 6);
    lookupTable.put('7', 7);
    lookupTable.put('8', 8);
    lookupTable.put('9', 9);
    lookupTable.put('A', 10);
    lookupTable.put('B', 11);
    lookupTable.put('C', 12);
    lookupTable.put('D', 13);
    lookupTable.put('E', 14);
    lookupTable.put('F', 15);
    lookupTable.put('G', 16);
    lookupTable.put('H', 17);
    lookupTable.put('I', 18);
    lookupTable.put('J', 19);
    lookupTable.put('K', 20);
    lookupTable.put('L', 21);
    lookupTable.put('M', 22);
    lookupTable.put('N', 23);
    lookupTable.put('&', 24);
    lookupTable.put('O', 25);
    lookupTable.put('P', 26);
    lookupTable.put('Q', 27);
    lookupTable.put('R', 28);
    lookupTable.put('S', 29);
    lookupTable.put('T', 30);
    lookupTable.put('U', 31);
    lookupTable.put('V', 32);
    lookupTable.put('W', 33);
    lookupTable.put('X', 34);
    lookupTable.put('Y', 35);
    lookupTable.put('Z', 36);
    lookupTable.put(' ', 37);
    lookupTable.put('Ñ', 38);
}

Tratando de validar el RFC: GACM611029DH3 no me da un resultado válido y según https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ se considera un código válido.

He revisado la lógica que utilizo frente a Cómo validar un RFC de México y su digito verificador tratando de obtener más información pero no veo diferencia.

Como resto me da 10 y por tanto, el último dígito debería ser 1. ¿Qué es lo incorrecto?

Gracias por la ayuda.

txtbits
  • 1
  • 1
  • 1
    ¿Responde esto a tu pregunta? [Cómo validar un RFC de México y su digito verificador](https://es.stackoverflow.com/questions/31713/c%c3%b3mo-validar-un-rfc-de-m%c3%a9xico-y-su-digito-verificador) – BetaM Mar 04 '20 at 13:02

1 Answers1

0

Te pudiera servir descarga directamente las listas del sat, aquí están las instrucciones de descarga

con esto puedes validar los rfc.

o puedes optar por servicios de terceros con apis para validar los datos, encontre un ejemplo en Java - Unirest:

Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.get("https://conectame.ddns.net/rest/api.php?m=rfc&user=prueba&pass=sC%7D9pW1Q%5Dc&val=GME050203KW9").asString();
BetaM
  • 30,571
  • 7
  • 32
  • 50
mo.rodrigo
  • 46
  • 3