Usar web services de AFIP/ARCA en Java
Con pocas líneas de código
Consumir los web services de AFIP/ARCA en Java puede ser un poco complicado, por eso vamos a utilizar la API de Afip SDK, que nos permite conectarnos a los web services de AFIP/ARCA en Java sin complicarnos con el uso de SOAP y la autenticación.
Vamos a usar 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 AFIP/ARCA.
Para usar los web services de AFIP/ARCA necesitamos un certificado y key pero Afip SDK nos deja utilizar el CUIT 20409378472 en modo testing para integrarnos rápidamente.
Debemos ejecutar una solicitud POST al endpoint
https://app.afipsdk.com/api/v1/afip/auth
package com.example;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
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 {
// Paso 1: Obtener el Token Authorization
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(15))
.build();
// Crear JSON para el request usando GSON
Map<String, String> authRequestMap = new LinkedHashMap<>();
authRequestMap.put("environment", "dev");
authRequestMap.put("tax_id", "20409378472");
authRequestMap.put("wsid", "wsct");
Gson gson = new Gson();
String authRequestBody = gson.toJson(authRequestMap);
HttpRequest authRequest = HttpRequest.newBuilder()
.uri(new URI("https://app.afipsdk.com/api/v1/afip/auth"))
.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 in auth request: " + authResponse.body());
return;
}
// Parsear respuesta para extraer el sign y token usando GSON
Type mapType = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> authData = gson.fromJson(authResponse.body(), mapType);
String token = authData.get("token");
String sign = authData.get("sign");
System.out.println("Token: " + token);
System.out.println("Sign: " + sign);
} catch (Exception e) {
e.printStackTrace();
}
}
}
En este ejemplo utilizamos el web service id wsct "wsid": "wsct"
, el cual corresponde al web service de comprobantes de turismo.
En la pestaña “API” de la documentacion podes consultar todos los parametros del endpoint.
Ahora tenemos token y sign que nos dio AFIP/ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
Llamar al web service
Para este ejemplo vamos a consultar el ultimo comprobante autorizado llamando al metodo consultarUltimoComprobanteAutorizado
.
Debemos ejecutar una solicitud POST al endpoint
https://app.afipsdk.com/api/v1/afip/requests
// Paso 2: Preparar los datos de la consulta
Map<String, Object> invoiceRequestMap = new LinkedHashMap<>();
invoiceRequestMap.put("environment", "dev");
invoiceRequestMap.put("method", "consultarUltimoComprobanteAutorizado");
invoiceRequestMap.put("wsid", "wsct");
invoiceRequestMap.put("url", "https://fwshomo.afip.gov.ar/wsct/CTService");
invoiceRequestMap.put("wsdl", "https://fwshomo.afip.gov.ar/wsct/CTService?wsdl");
invoiceRequestMap.put("soap_v_1_2", false);
Map<String, Object> authParams = new LinkedHashMap<>();
authParams.put("token", token);
authParams.put("sign", sign);
authParams.put("cuitRepresentada", "20409378472");
Map<String, Object> params = new LinkedHashMap<>();
params.put("authRequest", authParams);
params.put("codigoTipoComprobante", 195);
params.put("numeroPuntoVenta", 1);
invoiceRequestMap.put("params", params);
String invoiceRequestBody = gson.toJson(invoiceRequestMap);
HttpRequest invoiceRequest = HttpRequest.newBuilder()
.uri(new URI("https://app.afipsdk.com/api/v1/afip/requests"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(invoiceRequestBody))
.build();
HttpResponse<String> invoiceResponse = client.send(invoiceRequest, HttpResponse.BodyHandlers.ofString());
if (invoiceResponse.statusCode() >= 400) {
System.out.println("Error in invoice request: " + invoiceResponse.body());
return;
}
System.out.println("Invoice Response: " + invoiceResponse.body());
En la pestaña “API” de la documentacion podes consultar todos los parametros del endpoint.
En invoiceResponse.body()
nos devolverá la respuesta del web service.
{
"consultarUltimoComprobanteAutorizadoReturn": ...,
}
Con esto ya podemos conectarnos a cualquier web service de AFIP/ARCA con Java.
Lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/