# Java

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](https://docs.afipsdk.com/integracion/api).

En la [documentación de la API](https://docs.afipsdk.com/integracion/api) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Vamos a usar [Gson](https://github.com/google/gson/) para trabajar con JSON.

{% tabs %}
{% tab title="Gradle" %}

```bash
implementation 'com.google.code.gson:gson:2.13.1'
```

{% endtab %}

{% tab title="Maven" %}

```xml
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.13.1</version>
</dependency>
```

{% endtab %}
{% endtabs %}

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="AfipSDKRequest.java" %}

```java
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 HashMap<>();
            authRequestMap.put("environment", "dev");
            authRequestMap.put("tax_id", "20409378472");
            authRequestMap.put("wsid", "wsfe");

            Gson gson = new Gson();
            String authRequestBody = gson.toJson(authRequestMap);
            
            // Reemplazar con tu access_token obtenido de https://app.afipsdk.com
            String accessToken = "TU_TOKEN_AQUI";

            HttpRequest authRequest = HttpRequest.newBuilder()
                    .uri(new URI("https://app.afipsdk.com/api/v1/afip/auth"))
                    .header("Content-Type", "application/json")
                    .header("Authorization", "Bearer "+ accessToken)
                    .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();
        }
    }
}

```

{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="../siguientes-pasos/web-services" %}
[web-services](https://docs.afipsdk.com/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="../siguientes-pasos/web-services/otro-web-service" %}
[otro-web-service](https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Java:

{% embed url="<https://afipsdk.com/blog/category/Java/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="AfipSDKRequest.java" %}

```java
Map<String, String> authRequestMap = new HashMap<>();
authRequestMap.put("environment", "dev");
authRequestMap.put("tax_id", "20111111112"); // CUIT del certificado
authRequestMap.put("wsid", "wsfe");
authRequestMap.put("cert", "-----BEGIN CERTIFICATE-----MIIDRzC...");
authRequestMap.put("key", "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA...");
```

{% endtab %}
{% endtabs %}
