Realizar constatación de comprobantes de ARCA en Java
Con pocas líneas de código

La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Instalación
Lo primero es instalar la librería Gson para trabajar con JSON.
Añadimos la dependencia de Maven:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
Obtener la autorización
Lo primero que tenemos hacer es obtener el “Token authorization”, que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT 20409378472
sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres usar tu propio certificado para desarrollo.
import com.google.gson.Gson;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
try {
Gson gson = new Gson();
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(15))
.build();
// Paso 1: Obtener el Token y Sign
String authUrl = "https://app.afipsdk.com/api/v1/afip/auth";
Map<String, String> authRequestMap = new HashMap<>();
authRequestMap.put("environment", "dev");
authRequestMap.put("tax_id", "20409378472");
authRequestMap.put("wsid", "wscdc");
String authRequestBody = gson.toJson(authRequestMap);
HttpRequest authRequest = HttpRequest.newBuilder()
.uri(new URI(authUrl))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(authRequestBody))
.build();
HttpResponse<String> authResponse = client.send(authRequest, HttpResponse.BodyHandlers.ofString());
if (authResponse.statusCode() >= 400) {
System.out.println("Error en la autorización: " + authResponse.body());
return;
}
Map<String, String> authResult = gson.fromJson(authResponse.body(), Map.class);
String token = authResult.get("token");
String sign = authResult.get("sign");
Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
String voucherVerificationUrl = "https://app.afipsdk.com/api/v1/afip/requests";
Map<String, Object> voucherVerificationRequestMap = new HashMap<>();
voucherVerificationRequestMap.put("environment", "dev");
voucherVerificationRequestMap.put("method", "ComprobanteConstatar");
voucherVerificationRequestMap.put("wsid", "wscdc");
Map<String, Object> auth = new HashMap<>();
auth.put("Token", token);
auth.put("Sign", sign);
auth.put("Cuit", "20409378472");
Map<String, Object> cmpReq = new HashMap<>();
cmpReq.put("CbteModo", "CAE");
cmpReq.put("CuitEmisor", 20409378472L);
cmpReq.put("PtoVta", 1);
cmpReq.put("CbteTipo", 11);
cmpReq.put("CbteNro", 3850);
cmpReq.put("CbteFch", 20250225);
cmpReq.put("ImpTotal", 100);
cmpReq.put("CodAutorizacion", "75082223003046");
cmpReq.put("DocTipoReceptor", "80");
cmpReq.put("DocNroReceptor", "33693450239");
Map<String, Object> params = new HashMap<>();
params.put("Auth", auth);
params.put("CmpReq", cmpReq);
voucherVerificationRequestMap.put("params", params);
String voucherVerificationRequestBody = gson.toJson(voucherVerificationRequestMap);
HttpRequest voucherVerificationRequest = HttpRequest.newBuilder()
.uri(new URI(voucherVerificationUrl))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(voucherVerificationRequestBody))
.build();
HttpResponse<String> voucherVerificationResponse = client.send(voucherVerificationRequest, HttpResponse.BodyHandlers.ofString());
if (voucherVerificationResponse.statusCode() >= 400) {
System.out.println("Error al constatar el comprobante: " + voucherVerificationResponse.body());
return;
}
System.out.println(voucherVerificationResponse.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
En el resultado podemos ver que el comprobante fue constatado correctamente "Resultado": "A"
(A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con Java listo.
Lo único que nos queda es pasar a modo producción para poder realizar constatación de comprobantes reales.
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la Comunidad Afip SDK. Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.