Usar web services de AFIP/ARCA en Java

Con pocas líneas de código


Usar web services de AFIP/ARCA en Java

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/

Conéctate a AFIP/ARCA
sin vueltas

Certificados, código, tutoriales, soporte... Todo lo que necesitas para usar los web services de AFIP/ARCA en un solo lugar.