An open API service indexing awesome lists of open source software.

https://github.com/payway-ar/sdk-java-ventaonline

SDK de BackEnd para Gateway de pago Payway
https://github.com/payway-ar/sdk-java-ventaonline

java sdk sdk-java

Last synced: 2 months ago
JSON representation

SDK de BackEnd para Gateway de pago Payway

Awesome Lists containing this project

README

          


Payway SDK Java
===============

Modulo para conexión con gateway de pago Payway
+ [Introducción](#introduccion)
+ [Soporte de Integración](#Soporte)
+ [Alcance](#scope)
+ [Diagrama de secuencia](#secuencia)
+ [Instalación](#instalacion)
+ [Versiones de Java soportadas](#versionesdejavasoportadas)
+ [Ambientes](#environments)
+ [Uso](#uso)
+ [Inicializar la clase correspondiente al conector](#initconector)
+ [Operatoria del Gateway](#operatoria)
+ [Ejecución del Pago](#payment)
+ [Transacción simple](#single)
+ [Transacción PCI](#pci)
+ [Ejecución del pago PCI Tokenizado](#payment-pci-tokenizado)
+ [Transacción GDS](#gds)
+ [Transacción GDS PCI](#gdspci)
+ [Transacción BSA PCI](#bsapci)
+ [Transacción BSA no PCI](#bsanopci)
+ [Transacción Agro no PCI](#agronopci)
+ [Transacción distribuida](#distributed)
+ [Operación en dos pasos](#twosteps)




+ [Ejecución de pago simple con 3ds](#payment-simple-3ds)
+ [Ejecucion de resolucion del challenge](#payment-challenge-3ds)
+ [Listado de Pagos](#getallpayments)
+ [Información de un Pago](#getpaymentinfo)
+ [Devoluciones de pagos](#refunds)
+ [Anulación / Devolución Total de Pago](#totalrefund)
+ [Anulación de Devolución Total](#deleterefund)
+ [Devolución Parcial de un Pago](#partialrefund)
+ [Anulación de Devolución Parcial](#deletepartialrefund)

+ [Tokenización de tarjetas de crédito](#tokenizaciontarjeta)
+ [Listado de tarjetas tokenizadas](#listadotarjetastokenizadas)
+ [Ejecución de pago tokenizado](#pagotokenizado)
+ [Eliminación de tarjeta tokenizada](#eliminartarjetatokenizada)
+ [Tokenización Interna](#tokenizacioninterna)
+ [Obtener Token](#tokenizacioninternaobtenertoken)
+ [Pagar](#tokenizacioninternapagar)
+ [Integración con Cybersource](#cybersource)
+ [Parámetros Comunes](#parametros-comunes)
+ [Retail](#retail)
+ [Ticketing](#ticketing)
+ [Digital Goods](#digital-goods)
+ [Travel](#travel)
+ [Uso de Responses](#usoResponses)
+ [Manejo de Excepciones](#manejoExceptions)
+ [PaymentException](#paymentException)
+ [DecidirException](#decidirException)
+ [ValidateStatusException](#validateStatusException)
+ [ValidateException](#validateException)
+ [ApiException](#apiException)
+ [NotFoundException](#notFoundException)
+ [RefundException](#refundException)
+ [AnnulRefundException](#annulRefundException)
+ [Link Checkout](#linkCheckout)
+ [Tablas de referencia](#tablasreferencia)
+ [Códigos de Medios de Pago](#codigos-de-medios-de-pago)
+ [Divisas Aceptadas](#divisasa)
+ [Provincias](#provincias)
+ [Parámetros](#parametros)
+ [Parámetros de Pagos](#parametrosPago)
+ [Parámetros para PagoMisCuentas](#parametrosPMC)
+ [Parámetros para Pago Offline](#parametrosOffline)
+ [Parámetros para Pago Distribuido por Monto](#parametrosDistMonto)
+ [Parámetros para Pago Distribuido por Porcentaje](#parametrosDistPorc)
+ [Parámetros de Comercio Agregador](#parametrosAgregador)
+ [Parámetros de Devolución](#parametrosDevolucion)
+ [Atributos de Excepciones](#atributosExcepciones)
+ [Errores de Sistema](#erroresSistema)


## Introducción
El flujo de una transacción a través de las **sdks** consta de dos pasos, la **generación de un token de pago** por parte del cliente y el **procesamiento de pago** por parte del comercio. Existen sdks específicas para realizar estas funciones en distintos lenguajes que se detallan a continuación:

+ **Generación de un token de pago.** Se utiliza alguna de las siguentes **sdks front-end** :
+ [sdk Javascript](https://github.compayway-ar/sdk-javascript-ventaonline)
+ **Procesamiento de pago.** Se utiliza alguna de las siguentes **sdks back-end** :
+ [sdk Java](https://github.com/payway-ar/sdk-java-ventaonline)
+ [sdk PHP](https://github.com/payway-ar/sdk-php-ventaonline)
+ [sdk .Net](https://github.com/payway-ar/sdk-net-ventaonline)
+ [sdk Node](https://github.com/payway-ar/sdk-node-ventaonline)

[Volver a inicio](#inicio)


## Alcance
La **sdk Java** provee soporte para su **aplicación back-end**, encargandose de la comunicación del comercio con la **API Payway** utilizando su **API Key privada**1 y el **token de pago** generado por el cliente.

Para generar el token de pago, la aplicación cliente realizará con **Payway** a través de alguna de las siguentes **sdks front-end**:
+ [sdk Javascript](https://github.compayway-ar/sdk-javascript-ventaonline)

![imagen de sdks](./docs/img/DiagramaSDKs.png)

---
_1 - Las API Keys serán provistas por el equipo de Soporte de Payway ventas online(soporte@payway.com.ar). _

## Soporte de Integración
**Payway** ofrece un servicio de Soporte 24x7 con el siguiente alcance:
• Lunes a Viernes de 9 a 18 horas: Soporte Técnico, Atención Comercial y Soporte Transaccional.
• Fuera de Horario Laboral: Control de Red.
**CANALES DE ATENCIÓN**
• Teléfono: +54 11 4379 3460
• Implementaciones: integraciones-ventasonline@payway.com.ar
• Control de Red: controldered@payway.com.ar (en caso de disrupción transaccional)

[Volver a inicio](#inicio)

## Diagrama de secuencia
El flujo de una transacción a través de las **sdks** consta de dos pasos, a saber:

1. **sdk front-end:** Se realiza una solicitud de token de pago con la Llave de Acceso pública (public API Key), enviando los datos sensibles de la tarjeta (PAN, mes y año de expiración, código de seguridad, titular, y tipo y número de documento) y obteniéndose como resultado un token que permitirá realizar la transacción posterior.

2. **sdk back-end:** Se ejecuta el pago con la Llave de Acceso privada (private API Key), enviando el token generado en el Paso 1 más el identificador de la transacción a nivel comercio, el monto total, la moneda y la cantidad de cuotas.

A continuación, se presenta un diagrama con el Flujo de un Pago.

![imagen de configuracion](./docs/img/FlujoPago.png)

[Volver a inicio](#inicio)


## Instalación
Se encuentran disponibles *2* implementaciones para la última versión. Una es compatible con __Java7__ _(o superior)_ y la otra con __Java6__ _(o superior)_.
Se puede realizar la integración a través de un manager de dependencias, o bien manualmente descargando el _JAR_ desde [Github](https://github.com).

### Java 7+
#### Manager de dependencias
+ __repositoryUrl:__ _http://repo.dev.redbee.io/content/repositories/decidir-sdk/_
+ __groupId:__ _com.decidir.api_
+ __artifactId:__ _decidir2-sdk-java7_
+ __version:__ _2.7.1_

#### Descarga manual
[Versión 2.7.6](https://github.com/payway-ar/sdk-java-ventaonline/blob/master/dist/payway-v2.7.6-java7.jar)


### Versiones de Java soportadas
La versión implementada de la SDK, está testeada para versiones a partir de **Java 1.6**

[Volver a inicio](#inicio)

## Ambientes

La **sdk Java** permite trabajar con los ambientes Sandbox y Produccón de Payway.
El ambiente se debe instanciar indicando su URL.

```java
import com.decidir.sdk.Decidir;

public class MiClase {
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
String urlProduccion = "https://live.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Gruoper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Para el ambiente Sandbox
Decidir decidirSandbox = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
//Para el ambiente de produccion
Decidir decidirProd = new Decidir(privateApiKey, urlProduccion, timeout, grouper, developer);
// ...codigo...
}
```
[Volver a inicio](#inicio)


## Uso


### Inicializar la clase correspondiente al conector.

Instanciación de la clase `Decidir`

La misma recibe como parámetros la API Key privada provista por Decidir para el comercio y el ambiente en que se trabajara.

La API Key será provista por el equipo de Soporte de Payway ventas online(soporte@payway.com.ar).

A partir de ahora y por el resto de la documentación, se ejemplificará utilizando una APIKey habilitada para operar en el ambiente Sandbox.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
//...codigo...
```

[Volver a inicio](#inicio)

## Operatoria del Gateway

### Ejecución del Pago
Una vez generado y almacenado el token de pago, se deberá ejecutar la solicitud de pago más el token previamente generado.
Además del token de pago y los parámetros propios de la transacción, el comercio deberá identificar la compra con el site_transaction_id y el user_id(id
del Customer).

[Volver a inicio](#inicio)

#### Transacción simple
A continuación se muestra un ejemplo con una transacción simple sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setToken("ae9fc3e5-ff41-4de2-9c91-81030be1c4a6"); // token de pago
paymentRequest.setSite_transaction_id("TX00001234"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentRequest.setCustomer(customer);
paymentRequest.setPayment_method_id(1); //VISA
paymentRequest.setBin("450799");
paymentRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentRequest.setCurrency(Currency.ARS);
paymentRequest.setInstallments(1);
paymentRequest.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
paymentRequest.setFirst_installment_expiration_date("2018-05-15"); // Llenar en caso de una compra con tarjeta NacionPyme
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
paymentRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Decidir
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

#### Transacción PCI
A continuación se muestra un ejemplo con una transacción pci sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

PaymentPciRequest paymentPciRequest = new PaymentPciRequest();
CardData cardData = new CardData();
cardData.setCard_expiration_month("12");
cardData.setCard_expiration_year("20");
cardData.setIp_address("192.168.1.10"); // Customer IP, en caso de usar Cybersource se usa en el campo CSBTIPADDRESS

IdentificationType type = IdentificationType.fromId(1); //tipo de documento, ejemplo dni
String number = "23968498"; // nro de documento

Identification identification = new Identification(); //identificacion personal
identification.setNumber(number);
identification.setType(type);
cardData.setCard_holder_identification(identification);
cardData.setCard_holder_name("Juan");
cardData.setCard_number("4509790113276723");
//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

paymentPciRequest.setCard_data(cardData);
paymentPciRequest.setSite_transaction_id("TX00001234"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentPciRequest.setCustomer(customer);
paymentPciRequest.setPayment_method_id(1); //VISA
paymentPciRequest.setBin("450979");
paymentPciRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentPciRequest.setCurrency(Currency.ARS);
paymentPciRequest.setInstallments(1);
paymentPciRequest.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
paymentPciRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia

Aggregator aggregateData = new Aggregator();
aggregateData.setIndicator("1");
aggregateData.setIdentification_number("30598910045");
aggregateData.setBill_to_pay("Decidir_Test");
aggregateData.setBill_to_refund("Decidir_Test");
aggregateData.setMerchant_name("DECIDIR");
aggregateData.setStreet("Lavarden");
aggregateData.setNumber("247");
aggregateData.setPostal_code("C1437FBE");
aggregateData.setCategory("05044");
aggregateData.setChannel("005");
aggregateData.setGeographic_code("C1437");
aggregateData.setCity("Ciudad de Buenos Aires");
aggregateData.setMerchant_id("decidir_Agregador");
aggregateData.setProvince("B");
aggregateData.setCountry("ARG")
aggregateData.setMerchant_email("qa@decidir.com");
aggregateData.setMerchant_phone("+541135211111");
aggregateData.setProduct("producto_x");
aggregateData.setOrigin_country("032");
aggregateData.setMerchant_url("http://merchant-url");
aggregateData.setAggregator_name("payfact");
aggregateData.setGateway_id("payway");
aggregateData.setSeller_id("SellerId1234567891011");

SubAgrupator subAgrupator = new SubAgrupator();
subAgrupator.setIndicator("2");
subAgrupator.setIdentification_number("30598911045");
subAgrupator.setMerchant_name("PAYWAY");
subAgrupator.setStreet("La rioja");
subAgrupator.setCategory("05045");

aggregateData.setSub_agrupator(subAgrupator);

paymentPciRequest.setAggregate_data(aggregateData);

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Ejecución del pago PCI Tokenizado
A continuación se muestra un ejemplo con una transacción pci sin [Cybersource](#cybersource) tokenizado.

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

PaymentPciRequest paymentPciRequest = new PaymentPciRequest();
CardData cardData = new CardData();
cardData.setCard_expiration_month("12");
cardData.setCard_expiration_year("20");
cardData.setIp_address("192.168.1.10"); // Customer IP, en caso de usar Cybersource se usa en el campo CSBTIPADDRESS

IdentificationType type = IdentificationType.fromId(1); //tipo de documento, ejemplo dni
String number = "23968498"; // nro de documento

Identification identification = new Identification(); //identificacion personal
identification.setNumber(number);
identification.setType(type);
cardData.setCard_holder_identification(identification);
cardData.setCard_holder_name("Juan");
cardData.setCard_number("4509790113276723");
//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

paymentPciRequest.setCard_data(cardData);
paymentPciRequest.setSite_transaction_id("TX00001234"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentPciRequest.setCustomer(customer);
paymentPciRequest.setPayment_method_id(1); //VISA
paymentPciRequest.setBin("450979");
paymentPciRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentPciRequest.setCurrency(Currency.ARS);
paymentPciRequest.setInstallments(1);
paymentPciRequest.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
paymentPciRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia

//Logica de pago tokenizado
paymentPciRequest.setIsTokenizedPayment(true);
Aggregator aggregateData = new Aggregator();
aggregateData.setIndicator("1");
aggregateData.setIdentification_number("30598910045");
aggregateData.setBill_to_pay("Decidir_Test");
aggregateData.setBill_to_refund("Decidir_Test");
aggregateData.setMerchant_name("DECIDIR");
aggregateData.setStreet("Lavarden");
aggregateData.setNumber("247");
aggregateData.setPostal_code("C1437FBE");
aggregateData.setCategory("05044");
aggregateData.setChannel("005");
aggregateData.setGeographic_code("C1437");
aggregateData.setCity("Ciudad de Buenos Aires");
aggregateData.setMerchant_id("decidir_Agregador");
aggregateData.setProvince("B");
aggregateData.setCountry("ARG")
aggregateData.setMerchant_email("qa@decidir.com");
aggregateData.setMerchant_phone("+541135211111");
aggregateData.setProduct("producto_x");
aggregateData.setOrigin_country("032");
aggregateData.setMerchant_url("http://merchant-url");
aggregateData.setAggregator_name("payfact");
aggregateData.setGateway_id("payway");
aggregateData.setSeller_id("SellerId1234567891011");

SubAgrupator subAgrupator = new SubAgrupator();
subAgrupator.setIndicator("2");
subAgrupator.setIdentification_number("30598911045");
subAgrupator.setMerchant_name("PAYWAY");
subAgrupator.setStreet("La rioja");
subAgrupator.setCategory("05045");

aggregateData.setSub_agrupator(subAgrupator);

paymentPciRequest.setAggregate_data(aggregateData);

CardTokenData cardTokenData = new CardTokenData();
cardTokenData.setToken("4540730005109054");
cardTokenData.setEci("05");
cardTokenData.setCryptogram("cryptogram_123467890");

paymentPciRequest.setTokenCardData(cardTokenData);

try {
DecidirResponse paymentResponse = decidir.payment(paymentPciRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

#### Transacción GDS
A continuación se muestra un ejemplo con una transacción GDS simple sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

GDSPaymentRequestNoPCI gdsPaymentRequest = new GDSPaymentRequestNoPCI();
//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

gdsPaymentRequest.setToken("a00373a5-b8d7-4d7d-b14d-4aa447726fd9"); // token de pago
gdsPaymentRequest.setSite_transaction_id("TX00001234"); //ID de transaccion asignada por el comercio, no puede repetirse
gdsPaymentRequest.setCustomer(customer);
gdsPaymentRequest.setPayment_method_id(1); //VISA
gdsPaymentRequest.setBin("450979");
gdsPaymentRequest.setAmount(23250L);//Valor en centavos: $232.50
gdsPaymentRequest.setCurrency(Currency.ARS);
gdsPaymentRequest.setInstallments(1);
gdsPaymentRequest.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
gdsPaymentRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia
gdsPaymentRequest.setIata_code("4354437656"); // iata_code (logitud menor o igual 10)
gdsPaymentRequest.setNro_location("11140407"); // Id site del locator (longitud 8)

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

#### Transacción GDS PCI
A continuación se muestra un ejemplo con una transacción PCI sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

GDSPaymentRequestPCI gdsPaymentRequest = new GDSPaymentRequestPCI();
CardData cardData = new CardData();
cardData.setCard_expiration_month("12");
cardData.setCard_expiration_year("20");
cardData.setIp_address("192.168.1.10"); // Customer IP, en caso de usar Cybersource se usa en el campo CSBTIPADDRESS

IdentificationType type = IdentificationType.fromId(1);
String number = "23968498";

Identification identification = new Identification();
identification.setNumber(number);
identification.setType(type);
cardData.setCard_holder_identification(identification);
cardData.setCard_holder_name("Juan");
cardData.setCard_number("4509790113276723");
//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

gdsPaymentRequest.setCard_data(cardData);
gdsPaymentRequest.setSite_transaction_id("pci001"); //ID de transaccion asignada por el comercio, no puede repetirse
gdsPaymentRequest.setCustomer(customer);
gdsPaymentRequest.setPayment_method_id(1); //VISA
gdsPaymentRequest.setBin("450979");
gdsPaymentRequest.setAmount(23250L);//Valor en centavos: $232.50
gdsPaymentRequest.setCurrency(Currency.ARS);
gdsPaymentRequest.setInstallments(1);
gdsPaymentRequest.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
gdsPaymentRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia
gdsPaymentRequest.setIata_code("iata1"); // iata_code (logitud menor o igual 10)
gdsPaymentRequest.setNro_location("22240407"); // Id site del locator (longitud 8)
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

#### Transacción BSA PCI
A continuación se muestra un ejemplo con una transacción BSA PCI sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

BSAPaymentRequestPCI bsaPaymentRequestPCI = new BSAPaymentRequestPCI();

IdentificationType type = IdentificationType.fromId(1);
String number = "23968498";

Identification identification = new Identification();
identification.setNumber(number);
identification.setType(type);

bsaPaymentRequestPCI.setCard_holder_identification(identification);

//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

bsaPaymentRequestPCI.setSite_transaction_id("bsapci015"); //ID de transaccion asignada por el comercio, no puede repetirse

bsaPaymentRequestPCI.setCustomer(customer);
bsaPaymentRequestPCI.setPayment_method_id(1); //VISA
bsaPaymentRequestPCI.setBin("450799");
bsaPaymentRequestPCI.setAmount(23250L);//Valor en centavos: $232.50
bsaPaymentRequestPCI.setCurrency(Currency.ARS);
bsaPaymentRequestPCI.setInstallments(1);
bsaPaymentRequestPCI.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple
List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
bsaPaymentRequestPCI.setSub_payments(sub_payments); //Debe enviarse una lista vacia

CardTokenBsa bsaCardData = new CardTokenBsa();

bsaCardData.setPublic_token("4507993431624905");
bsaCardData.setIssue_date("20170908");

bsaCardData.setPublic_request_key("12345678");

bsaCardData.setVolatile_encrypted_data("AvqyWXV1dXXPjUl8azlldQ5HK/gny6UJU4Wo3RFkYy2W9+D0kRfEoKeIIsFWiZh84CxKXvPX+u1j4Eqysg==");
bsaCardData.setCard_holder_name("sarla");
bsaCardData.setFlag_pei("1");
bsaCardData.setFlag_security_code("1");
bsaCardData.setFlag_selector_key("1");
bsaCardData.setFlag_tokenization("0");

bsaPaymentRequestPCI.setCard_token_bsa(bsaCardData);

bsaPaymentRequestPCI.setFraud_detection(services);

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

#### Transacción BSA no PCI

Las transacciones BSA no PCI operan de manera idéntica a las [transacciones simples](#single), para realizar una operacion por bsa no pci basta con seguir el mismo ejemplo que el visto en las transacciones simples.

[Volver a inicio](#inicio)

#### Transacción Agro no PCI
A continuación se muestra un ejemplo con una transacción Agro simple sin [Cybersource](#cybersource).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

AgroPaymentRequestNoPCI agroPaymentRequestNoPCI = new AgroPaymentRequestNoPCI();
//RetailFraudDetectionData retail = new RetailFraudDetectionData();
//RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
ServicesFraudDetectionData services = new ServicesFraudDetectionData();

agroPaymentRequestNoPCI.setToken("2f9c80b0-ebb9-4c75-b5e7-098a8c32b63a"); // token de pago
agroPaymentRequestNoPCI.setSite_transaction_id("agro0016"); //ID de transaccion asignada por el comercio, no puede repetirse
agroPaymentRequestNoPCI.setCustomer(customer);
agroPaymentRequestNoPCI.setPayment_method_id(80); //VISA
agroPaymentRequestNoPCI.setBin("448459");
agroPaymentRequestNoPCI.setAmount(23250L);//Valor en centavos: $232.50
agroPaymentRequestNoPCI.setCurrency(Currency.ARS);
//agroPaymentRequestNoPCI.setInstallments(1);

InstallmentData i1 = new InstallmentData();
i1.setId(1);
i1.setAmount(23250L);
i1.setDate(new Date());
List l = new ArrayList();
l.add(i1);
agroPaymentRequestNoPCI.setInstallmentList(l);

agroPaymentRequestNoPCI.setPayment_type(PaymentType.SINGLE); //Tipo de pago simple

AgroData agroData = new AgroData();
agroData.setToken("123456");
agroData.setToken_type("T");
agroData.setDays_agreement(360);

agroPaymentRequestNoPCI.setAgro_data(agroData);

List sub_payments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
agroPaymentRequestNoPCI.setSub_payments(sub_payments); //Debe enviarse una lista vacia

try {
DecidirResponse paymentResponse = decidir.payment(agroPaymentRequestNoPCI);
System.out.println(paymentResponse.getMessage());
System.out.println("aaa");
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

#### Transacción distribuida
Existen transacciones distribuidas definidas por monto o por porcentaje. Para indicar los sitios a distribuir, se debe enviar en el campo `sub_payments` cada uno de ellos. En el caso de transacción por monto se indicar´: **Id del sitio receptor, monto a distribuir y la cantidad de cuotas**. Si se distribuye por porcentaje no se debe enviar informacion en `sub_payments` .

A continuación se muestra un ejemplo con una transacción distribuida por monto sin [Cybersource](#cybersource).
*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

*Nota Técnica*: A diferencia de las Transacciones Simples, para las Transacciones Distribuidas, el parámetro payment_type debe ser PaymentType.DISTRIBUTED; y el parámetro sub_payments
se debe popular con los sub-sitios y los montos distribuidos de manera dinámica.

* En Transacciones distribuidas por Monto, la sumatoria de los montos distribuidos debe ser exactamente igual al monto total de la operación Padre.
* En Transacciones distribuidas por Porcentaje, el parámetro sub_payments no debe completarse, pues la distribución es estática
y se configura en el SAC.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

Integer installments = 2;
Long amount1 = 10000L;
Long amount2 = 25990L;
PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setToken("a6f05789-10df-4464-a318-887a1520204b"); // token de pago
paymentRequest.setSite_transaction_id("TX0000000001"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentRequest.setCustomer(customer);
paymentRequest.setPayment_method_id(1); //VISA
paymentRequest.setBin("450979");
paymentRequest.setAmount(amount1 + amount2);//Suma de los pagos distribuidos
paymentRequest.setCurrency(Currency.ARS);
paymentRequest.setInstallments(installments); //Cantidad de cuotas

paymentRequest.setPayment_type(PaymentType.DISTRIBUTED); //Indica transaccion distribuida
List subPayments = new ArrayList(); // Llenar en caso de transaccion distribuida por monto
SubPayment subPayment1 = new SubPayment(); //Sitio receptor 1 (solo en caso de distribuida por monto)
subPayment1.setSite_id("00111115"); //Sitio receptor 1 (solo en caso de distribuida por monto)
subPayment1.setAmount(amount1); //Monto a recibir (solo en caso de distribuida por monto)
subPayment1.setInstallments(installments); //Cantidad de cuotas (solo en caso de distribuida por monto)
SubPayment subPayment2 = new SubPayment(); //Sitio receptor 2 (solo en caso de distribuida por monto)
subPayment2.setSite_id("00111116"); //Sitio receptor 2 (solo en caso de distribuida por monto)
subPayment2.setAmount(amount2); //Monto a recibir (solo en caso de distribuida por monto)
subPayment2.setInstallments(installments); //Cantidad de cuotas (solo en caso de distribuida por monto)

subPayments.add(subPayment1);
subPayments.add(subPayment2);
paymentRequest.setSub_payments(subPayments); //Se agregan los datos de distribuida

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

#### Operación en dos pasos
Una vez generado y almacenado el token de pago, se deberá ejecutar la solicitud de pago más el token previamente generado.
Si el pago es preaprobado `Status.PRE_APPROVED`, se procederá a realizar la confirmación del pago enviando **ID de pago, monto y usario aprobador**.
A continuación se muestra un ejemplo con una transacción simple sin Cybersource.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

String privateApiKey = "00111115";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "http://localhost:9002/";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout);
Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setToken("a6f05789-10df-4464-a318-887a1520204b"); // token de pago
paymentRequest.setSite_transaction_id("TX0000000001"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentRequest.setCustomer(customer);
paymentRequest.setPayment_method_id(1); //VISA
paymentRequest.setBin("450979");
paymentRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentRequest.setCurrency(Currency.ARS);
paymentRequest.setInstallments(1);
paymentRequest.setPayment_type(PaymentType.SINGLE);
List sub_payments = new ArrayList(); //Nunca se utiliza en 2 pasos (se envia vacio)
paymentRequest.setSub_payments(sub_payments);

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);

PaymentResponse paymentResult = paymentResponse.getResult();
// Confirmar pago preaprobado
if (Status.PRE_APPROVED.equals(paymentResult.getStatus())) {
Long paymentId = paymentResult.getId(); //Obtener id de pago
DecidirResponse confirmPayment = decidir.confirmPayment(paymentId, paymentRequest.getAmount(), "usuario_aprobador");
paymentResult = confirmPayment.getResult();
}
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Ejecución de pago simple con 3ds
En este caso se necesita agregar el flag "cardholder_auth_required" en true y se le debe pasar el objeto "auth_3ds_data".

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox

PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setToken("a6f05789-10df-4464-a318-887a1520204b"); // token de pago
paymentRequest.setSite_transaction_id("TX0000000001"); //ID de transaccion asignada por el comercio, no puede repetirse
paymentRequest.setCustomer(customer);
paymentRequest.setPayment_method_id(1); //VISA
paymentRequest.setBin("450979");
paymentRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentRequest.setCurrency(Currency.ARS);
paymentRequest.setInstallments(1);
paymentRequest.setPayment_type(PaymentType.SINGLE);
paymentRequest.setCardHolderAuthRequired(true);

Auth3dsData auth3dsData = new Auth3dsData();
auth3dsData.setAccept_header("application/json");
auth3dsData.setColor_depth("32");
auth3dsData.setDevice_type("BROWSER");
auth3dsData.setIp("1.12.123.255");
auth3dsData.setJava_enabled(true);
auth3dsData.setLenguage("es");
auth3dsData.setScreen_height(28);
auth3dsData.setScreen_width(4);
auth3dsData.setTime_zone_offset(570);
auth3dsData.setUser_agent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0)Gecko/20100101");

paymentRequest.setAuth_3ds_data(auth3dsData);

try {
DecidirResponse paymentResponse = decidir.paymentThreeds(paymentRequest);

PaymentAuth3dsResponse paymentResult = paymentResponse.getResult();
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException | PaymentAuth3dsResponseException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

### Ejecución de pago con challenge de 3ds
Ejemplo de resolucion al ejecutar el pago que nos devuelve el resultado con el estado CHALLENGE_PENDING o FINGERPRINT_PENDING,

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
String xConsumerUsername = "x-consumer-username";

int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox

Instruction3dsData instruction3dsData = new Instruction3dsData();
instruction3dsData.setId("id");
instruction3dsData.setInstruction_value("instruction_value");

try {
DecidirResponse paymentResponse = decidir.instructionThreeDS(xConsumerUsername, instruction3dsData);

PaymentAuth3dsResponse paymentResult = paymentResponse.getResult();
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException | PaymentAuth3dsResponseException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

### Listado de Pagos

Mediante este recurso, se genera una solicitud de listado de pagos.
Este recurso admite la posibilidad de agregar filtros adicionales

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

Integer offset = 20;//OPCIONAL, desplazamiento en los resultados devueltos. Valor por defecto = 0.
Integer pageSize = 10; //OPCIONAL, cantidad máxima de resultados retornados. Valor por defecto = 50.
String siteOperationId = null; //OPCIONAL, ID único de la transacción a nivel comercio (equivalente al site_transaction_id).
String sitetId = null;//OPCIONAl, ID Site del comercio.

try {
DecidirResponse pagos = decidir.getPayments(offset, pageSize, siteOperationId, siteId);
// Procesamiento de respuesta de listado de pagos
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Información de un Pago

Mediante este recurso, se genera una solicitud de información de un pago previamente realizado, pasando como parámetro el id del pago.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

long idPago = 000123L; //ID devuelto por la operacion de pago (NO CONFUNDIR con site_transaction_id asignado por el comercio)
try {
DecidirResponse pago = decidir.getPayment(idPago);
// Procesamiento de respuesta de consulta de pago
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)


### Devoluciones de pagos

A continuación se describen las diferentes operatorias para realizar anulaciones y devoluciones de pagos

[Volver a inicio](#inicio)

#### Anulación / Devolución Total de Pago

Mediante este recurso, se genera una solicitud de anulación / devolución total de un pago puntual, pasando como parámetro el id del pago y el usuario del cliente.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
long idPago = 000123L; //ID devuelto por la operacion de pago (NO CONFUNDIR con site_transaction_id asignado por el comercio)
String usuario = "usuario_que_realiza_la_accion"; //OPCIONAL NULLABLE, Usuario habilitado para realizar la anulacion/devolucion. Se utiliza para matener un registro de quien realiza la operacion
RefundPayment refundPayment = new RefundPayment(); //Se instancia sin datos
try {
DecidirResponse devolucion = decidir.refundPayment(idPago, refundPayment, usuario);
// Procesamiento de respuesta de la devolucion de pago
// ...codigo...
} catch (ValidateStatusException vse) {
// Manejo de excepcion en devolucion
String status = vse.getErrorDetail().getValidation_errors().getStatus();
vse.printStackTrace();
} catch (RefundException re) {
// Manejo de excepcion en devolucion
re.printStackTrace();
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

#### Anulación de Devolución Total

Mediante este recurso, se genera una solicitud de anulación de devolución total de un pago puntual, pasando como parámetro el id del pago, el id de la devolución y el usuario del cliente.
```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
long idPago = 000123L;//ID devuelto por la operacion de pago (NO CONFUNDIR con site_transaction_id asignado por el comercio)
long idDevolucion = 00012L;//ID devuelto por la operacion de devolucion
String usuario = "usuario_que_realiza_la_accion"; //OPCIONAL NULLABLE, Usuario habilitado para realizar la anulacion/devolucion. Se utiliza para matener un registro de quien realiza la operacion

try {
DecidirResponse anulacion = decidir. cancelRefund(idPago, idDevolucion, usuario)
// Procesamiento de respuesta de anulacion de devolucion
// ...codigo...
} catch (AnnulRefundException are) {
are.printStackTrace();
// Manejo de excepcion de anulacion de devolucion
// ...codigo...
} catch (ValidateStatusException vse) {
// Manejo de excepcion en devolucion
String status = vse.getErrorDetail().getValidation_errors().getStatus();
vse.printStackTrace();
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```
[Volver a inicio](#inicio)

#### Devolución Parcial de un Pago

Mediante este recurso, se genera una solicitud de devolución parcial de un pago puntual, pasando como parámetro el id del pago, el monto de la devolución y el usuario del cliente.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
long idPago = 000123L; //ID devuelto por la operacion de pago (NO CONFUNDIR con site_transaction_id asignado por el comercio)
String usuario = "usuario_que_realiza_la_accion"; //OPCIONAL NULLABLE, Usuario habilitado para realizar la anulacion/devolucion. Se utiliza para matener un registro de quien realiza la operacion
long montoDevolucion = 1250L // Expresado en centavos

RefundPayment refundPayment = new RefundPayment();
refundPayment.setAmount(montoDevolucion);
refundPayment.setSub_payments(new ArrayList());//Llenar en caso de solicitar devolucion parcial en transaccion distribuida
try {
DecidirResponse devolucion = decidir.refundPayment(idPago, refundPayment, usuario)
// Procesamiento de respuesta de la devolucion de pago
// ...codigo...
} catch (RefundException re) {
// Manejo de excepcion en devolucion
re.printStackTrace();
} catch (ValidateStatusException vse) {
// Manejo de excepcion en devolucion
String status = vse.getErrorDetail().getValidation_errors().getStatus();
vse.printStackTrace();
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

#### Anulación de Devolución Parcial

Mediante este recurso, se genera una solicitud de anulación de devolución parcial de un pago puntual, pasando como parámetro el id del pago, el id de la devolución el usuario del cliente.
```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
long idPago = 000123L;//ID devuelto por la operacion de pago (NO CONFUNDIR con site_transaction_id asignado por el comercio)
long idDevolucion = 00012L;//ID devuelto por la operacion de devolucion
String usuario = "usuario_que_realiza_la_accion"; //OPCIONAL NULLABLE, Usuario habilitado para realizar la anulacion/devolucion. Se utiliza para matener un registro de quien realiza la operacion
try {
DecidirResponse anulacion = decidir.cancelRefund(idPago, idDevolucion, usuario)
// Procesamiento de respuesta de anulacion de devolucion
// ...codigo...
} catch (AnnulRefundException are) {
are.printStackTrace();
// Manejo de excepcion de anulacion de devolucion
// ...codigo...
} catch (ValidateStatusException vse) {
// Manejo de excepcion en devolucion
String status = vse.getErrorDetail().getValidation_errors().getStatus();
vse.printStackTrace();
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```
[Volver a inicio](#inicio)

## Tokenización de tarjetas de crédito

Esta funcionalidad permite que luego de realizar una compra con una tarjeta, se genere un token alfanumerico unico en el backend de Payway, esto permite que a la hora de comprar nuevamente con esta tarjeta solo requerira el codigo de seguridad.
Como primer paso se debe realizar una un pago normal, el token generado estara en el campo "token" de la respuesta.

[Volver a inicio](#inicio)

### Listado de tarjetas tokenizadas

Este método permite conocer el listado de tarjetas tokenizadas que posee un usuario determinado. Para esto es necesario el nombre de usuario a la instancia de token.
Este recurso admite la posibilidad de agregar filtros adicionales.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

String usuario = "usuario_cliente"; // Usuario para el cual se consultan las tarjetas tokenizadas
String bin = "450799"; //OPCIONAL, bin de la tarjeta.
String ultimosCuatroDigitos = null; //OPCIONAL, ultimos 4 digitos de la tarjeta.
String mesVencimiento = null; //OPCIONAL, mes de vencimiento de la tarjeta.
String anioVencimiento = "18"; //OPCIONAL, año de vencimiento de la tarjeta.

try {
DecidirResponse tarjetasTokenizadas = decidir.getCardTokens(usuario, bin, ultimosCuatroDigitos, mesVencimiento, anioVencimiento);
// Procesamiento de respuesta de listado de tarjetas tokenizadas
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Ejecución de pago tokenizado

Una vez que se obtiene el token a partir de la tarjeta tokenizada, se deberá ejecutar la solicitud de pago. Además del token de pago y los parámetros propios de la transacción, el comercio deberá identificar la compra con el "site_transaction_id" y "user_id"(id
del Customer).

*Aclaracion* : amount es un campo long el cual representa el valor en centavos.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
Customer customer = new Customer();
customer.setId("test"); // user_id
customer.setEmail("test@payway.com"); // user_email

PaymentRequest paymentRequest = new PaymentRequest();
paymentRequest.setToken("ae9fc3e5-ff41-4de2-9c91-81030be1c4a6"); // token de pago
paymentRequest.setSite_transaction_id("0001234");
paymentRequest.setCustomer(customer);
paymentRequest.setPayment_method_id(1); //MASTERCARD
paymentRequest.setBin("45079");
paymentRequest.setAmount(23250L);//Valor en centavos: $232.50
paymentRequest.setCurrency(Currency.ARS);
paymentRequest.setInstallments(1);
paymentRequest.setPayment_type(PaymentType.SINGLE);
List sub_payments = new ArrayList() // Llenar en caso de transaccion distribuida
paymentRequest.setSub_payments(sub_payments);

try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Eliminación de tarjeta tokenizada

El servicio da la posibilidad de eliminar un token de tarjeta generadas, esto se logra instanciando token y utilizando el método DeleteCardToken(token). Funciona enviando la tarjeta tokenizada.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
try {
DecidirResponse respuesta = decidir.deleteCardToken("ae9fc3e5-ff41-4de2-9c91-81030be1c4a6");
// Procesamiento de respuesta de eliminacion de tarjeta tokenizada
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```
[Volver a inicio](#inicio)


## Tokenización Interna

Esta funcionalidad permite que luego de realizar una compra con una tarjeta, se genere un token alfanumerico unico en el backend de Payway, esto permite que a la hora de comprar nuevamente con esta tarjeta solo requerira el codigo de seguridad.
Como primer paso se debe realizar una un pago normal, el token generado estara en el campo "token" de la respuesta.


### Obtener el Token

Permite obtener el token.

```java
String apikey = "YKcWXjI2aoSnp60urwLd6TbLYNuybcWC";
CardDataRequestModel cardDataRequestModel = new CardDataRequestModel();
cardDataRequestModel.setCard_number("4507990000004905");
cardDataRequestModel.setExpiration_date("1250");
cardDataRequestModel.setCard_holder("Jorge Jorgelin");
cardDataRequestModel.setSecurity_code("123");
cardDataRequestModel.setAccount_number("12345678901234567890");
cardDataRequestModel.setEmail_holder("asd@medina.com");

InternalTokenRequest internalTokenRequest = new InternalTokenRequest();
internalTokenRequest.setCard_data(cardDataRequestModel);
internalTokenRequest.setEstablishment_number("11223344");
try {
return new ResponseEntity<>(internalTokenService.tokens(apikey, internalTokenRequest), HttpStatus.OK);
}
catch (InternalTokenException e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getResponse(), HttpStatus.valueOf(e.getStatus()));
}
catch (Exception e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
```

[Volver a inicio](#inicio)


### Pagar

Una vez que se obtiene el token a partir de la tarjeta tokenizada, se deberá ejecutar la solicitud de pago. Además del token de pago y los parámetros propios de la transacción, el comercio deberá identificar la compra con el "site_transaction_id" y "user_id"(id
del Customer).

```java
String apikey = "YKcWXjI2aoSnp60urwLd6TbLYNuybcWC";
TransactionDataRequestModel transactionDataRequestModel = new TransactionDataRequestModel();
transactionDataRequestModel.setMerchant_transaction_id("numero aleatorio");
transactionDataRequestModel.setPayment_method_id("1");
transactionDataRequestModel.setAmount("100");
transactionDataRequestModel.setCurrency("ARS");
transactionDataRequestModel.setInstallments("1");
transactionDataRequestModel.setPayment_type("single");
transactionDataRequestModel.setDescription("tx-tokenizada");
CustomerDataRequestModel customerDataRequestModel = new CustomerDataRequestModel();
customerDataRequestModel.setToken_id("66617169-68b1-4040-af8f-3c648d81b8f0");
customerDataRequestModel.setIdentification_type("dni");
customerDataRequestModel.setIdentification_number("12312312");
InternalTokenPaymentRequest internalTokenPaymentRequest = new InternalTokenPaymentRequest();
internalTokenPaymentRequest.setMerchant_id("11223344");
internalTokenPaymentRequest.setTransaction_data(transactionDataRequestModel);
internalTokenPaymentRequest.setCustomer_data(customerDataRequestModel);
try {
return new ResponseEntity<>(internalTokenService.payment(apikey, paymentRequestModel), HttpStatus.OK);
}
catch (DecidirException e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.valueOf(e.getStatus()));
}
catch (InternalTokenException e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getResponse(), HttpStatus.valueOf(e.getStatus()));
}
```

[Volver a inicio](#inicio)

## Integración con Cybersource

Para utilizar el Servicio de Control de Fraude Cybersource, en la operación SendAuthorizeRequest, deben enviarse datos adicionales sobre la operación de compra que se quiere realizar.
Se han definido cinco verticales de negocio que requieren parámetros específicos, así como también parámetros comunes a todas las verticales.

[Volver a inicio](#inicio)

### Parámetros Comunes

Los parámetros comunes a todas las verticales deben enviarse junto con los datos específicos de cada uno. A continuación, describiremos los párametros comúnes que se deberan agregar a los datos de cada vertical al momento de instanciar la clase correspondiente.

1. **bill_to**
```java
// ...codigo...
BillingData billTo = new BillingData();
billTo.setCity("Buenos Aires"); //Ciudad de facturación, MANDATORIO.
billTo.setCountry("AR"); //País de facturación. MANDATORIO. Código ISO. (http://apps.cybersource.com/library/documentation/sbc/quickref/countries_alpha_list.pdf)
billTo.setCustomer_id("test");//Identificador del usuario al que se le emite la factura. MANDATORIO. No puede contener un correo electrónico.
billTo.setEmail("usuario@email.com.ar");//Mail del usuario al que se le emite la factura. MANDATORIO.
billTo.setFirst_name("Usuario"); //Nombre del usuario al que se le emite la factura. MANDATORIO.
billTo.setLast_name("Prueba");//Apellido del usuario al que se le emite la factura. MANDATORIO.
billTo.setPhone_number("54116763329");//Teléfono del usuario al que se le emite la factura. No utilizar guiones, puntos o espacios. Incluir código de país. MANDATORIO.
billTo.setPostal_code("1414");//Código Postal de la dirección de facturación. MANDATORIO.
billTo.setState("C");//Provincia de la dirección de facturación. MANDATORIO. Ver tabla anexa de provincias.
billTo.setStreet1("THAMES 677");//Domicilio de facturación (calle y nro). MANDATORIO.
billTo.setStreet2("4to F");//Complemento del domicilio. (piso, departamento). OPCIONAL.
fraudDetectionData.setBill_to(billTo); //Subclase de com.decidir.sdk.dto.FraudDetectionDataRequest
// ...codigo...
```
2. **purchase_totals**
```java
// ...codigo...
PurchaseTotals purchaseTotals = new PurchaseTotals();
purchaseTotals.setCurrency(Currency.ARS); //com.decidir.sdk.dto.Currency. MANDATORIO.
purchaseTotals.setAmount(34900L);//Monto en centavos. MANDATORIO.
fraudDetectionData.setPurchase_totals(purchaseTotals); //Subclase de com.decidir.sdk.dto.FraudDetectionDataRequest
// ...codigo...
```

3. **customer_in_site**
```java
// ...codigo...
CustomerInSite customerInSite = new CustomerInSite();
customerInSite.setDays_in_site(243);
customerInSite.setIs_guest(Boolean.FALSE);
customerInSite.setPassword("abracadabra");
customerInSite.setNum_of_transactions(1);
customerInSite.setCellphone_number("1546763329");
fraudDetectionData.setCustomer_in_site(customerInSite); //Subclase de com.decidir.sdk.dto.FraudDetectionDataRequest
// ...codigo...
```
4. **copy_paste_card_data**
```java
// ...codigo...
CopyPasteCardData copyPasteCardData = new CopyPasteCardData();
copyPasteCardData.setCard_number(Boolean.TRUE);//valor booleano
copyPasteCardData.setSecurity_code(Boolean.TRUE);//valor booleano
fraudDetectionData.setCopy_paste_card_data(copyPasteCardData);//Subclase de com.decidir.sdk.dto.FraudDetectionDataRequest
// ...codigo...
```
5. _**Otros campos**_
```java
// ...codigo...
fraudDetectionData.setChannel(Channel.WEB);//Tambien puede recibir un valor de tipo String
fraudDetectionData.setDispatch_method("domicilio");//{domicilio, click and collect, courrier}
fraudDetectionData.setSend_to_cs(Boolean.true);// true o false
fraudDetectionData.setDevice_unique_id("fingerprint-del-cliente");//Subclase de com.decidir.sdk.dto.FraudDetectionDataRequest
// ...codigo...
```

[Volver a inicio](#inicio)

### Retail
Se enviá un `RetailFraudDetectionData` con los [parámetros comunes](#parametros-comunes) y con los siguientes parámetros que se deben enviar específicamente para la vertical Retail. Además se deben enviar datos específicos de cada producto involucrado en la transacción.

```java
// ...codigo...
RetailFraudDetectionData retail = new RetailFraudDetectionData();
//seteo de parámetros comunes
// ...codigo...
RetailTransactionData retailTransactionData = new RetailTransactionData();//Datos para la vertical Retail
//Datos de envio
ShippingData shipTo = new ShippingData();
shipTo.setCity("Buenos Aires"); //Ciudad de envío, MANDATORIO.
shipTo.setCountry("AR"); //País de envío. MANDATORIO. Código ISO. (http://apps.cybersource.com/library/documentation/sbc/quickref/countries_alpha_list.pdf)
shipTo.setEmail("usuario@email.com.ar");//Mail del destinatario. MANDATORIO.
shipTo.setFirst_name("Usuario"); //Nombre del destinatario. MANDATORIO.
shipTo.setLast_name("Prueba");//Apellido del destinatario. MANDATORIO.
shipTo.setPhone_number("54116763329");//Teléfono del destinatario. No utilizar guiones, puntos o espacios. Incluir código de país. MANDATORIO.
shipTo.setPostal_code("1414");//Código Postal de la dirección de envío. MANDATORIO.
shipTo.setState("C");//Provincia de la dirección de envío. MANDATORIO. Ver tabla anexa de provincias.
shipTo.setStreet1("THAMES 677");//Domicilio de envío (calle y nro). MANDATORIO.
shipTo.setStreet2("4to F");//Complemento del domicilio. (piso, departamento). OPCIONAL.
retailTransactionData.setShip_to(shipTo);//Datos de envio. MANDATORIO
retailTransactionData.setDays_to_delivery("2");
retailTransactionData.setTax_voucher_required(Boolean.TRUE);
retailTransactionData.setCustomer_loyality_number("123232");
setCoupon_code("cupon22");
//Items de compra (Al menos un item)
Item item = new Item();
item.setCode("popblacksabbat2016"); //MANDATORIO
item.setDescription("Popular Black Sabbath 2016"); //OPCIONAL
item.setName("popblacksabbat2016ss");//MANDATORIO
item.setSku("sku");//MANDATORIO
item.setTotal_amount(34900L);//MANDATORIO
item.setQuantity(1);//MANDATORIO
item.setUnit_price(34900L);//MANDATORIO
ticketingTransactionData.setItems(Arrays.asList(item); //Items de compra. MANDATORIO
retail.setRetail_transaction_data(retailTransactionData);//Datos de vertical Retail. MANDATORIO
// ...codigo...
```

Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase `RetailFraudDetectionData` de la siguiente manera.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout);
PaymentRequest paymentRequest = new PaymentRequest();
// Datos del pago
// ...codigo...
RetailFraudDetectionData retail = new RetailFraudDetectionData();
//Datos de vertical Retail
// ...codigo...
paymentRequest.setFraud_detection(retail);
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Ticketing

Se enviá un `TicketingTransactionData` con los [parámetros comunes](#parametros-comunes) y con los siguientes parámetros que se deben enviar específicamente para la vertical Ticketing. Además se deben enviar datos específicos de cada producto involucrado en la transacción.

```java
// ...codigo...
TicketingTransactionData ticketing = new TicketingTransactionData();
//seteo de parámetros comunes
// ...codigo...
TicketingTransactionData ticketingTransactionData = new TicketingTransactionData();//Datos para la vertical Ticketing

ticketingTransactionData.setDays_to_event(10); //MANDATORIO
ticketingTransactionData.setDelivery_type("Pick up"); //MANDATORIO
//Items de compra (Al menos un item)
Item item = new Item();
item.setCode("popblacksabbat2016"); //MANDATORIO
item.setDescription("Popular Black Sabbath 2016"); //OPCIONAL
item.setName("popblacksabbat2016ss");//MANDATORIO
item.setSku("sku");//MANDATORIO
item.setTotal_amount(34900L);//MANDATORIO
item.setQuantity(1);//MANDATORIO
item.setUnit_price(34900L);//MANDATORIO
ticketingTransactionData.setItems(Arrays.asList(item); //Items de compra. MANDATORIO
ticketing.setTicketing_transaction_data(ticketingTransactionData);//Datos de vertical Ticketing. MANDATORIO
// ...codigo...
```

Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase`TicketingTransactionData` de la siguiente manera.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout);

PaymentRequest paymentRequest = new PaymentRequest();
// Datos del pago
// ...codigo...
TicketingTransactionData ticketing = new TicketingTransactionData();
//Datos de vertical Ticketing
// ...codigo...
paymentRequest.setFraud_detection(ticketing);
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### RetailTP
Se enviá un `RetailTPFraudDetectionData` con los [parámetros comunes](#parametros-comunes) y con los siguientes parámetros que se deben enviar específicamente para la vertical RetailTP. Además se deben enviar datos específicos de cada producto involucrado en la transacción.

```java
// ...codigo...
RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
//seteo de parámetros comunes
// ...codigo...
RetailTPTransactionData retailTPTransactionData = new RetailTPTransactionData();//Datos para la vertical RetailTP
//Datos de envio
ShippingData shipTo = new ShippingData();
shipTo.setCity("Buenos Aires"); //Ciudad de envío, MANDATORIO.
shipTo.setCountry("AR"); //País de envío. MANDATORIO. Código ISO. (http://apps.cybersource.com/library/documentation/sbc/quickref/countries_alpha_list.pdf)
shipTo.setEmail("usuario@email.com.ar");//Mail del destinatario. MANDATORIO.
shipTo.setFirst_name("Usuario"); //Nombre del destinatario. MANDATORIO.
shipTo.setLast_name("Prueba");//Apellido del destinatario. MANDATORIO.
shipTo.setPhone_number("54116763329");//Teléfono del destinatario. No utilizar guiones, puntos o espacios. Incluir código de país. MANDATORIO.
shipTo.setPostal_code("1414");//Código Postal de la dirección de envío. MANDATORIO.
shipTo.setState("C");//Provincia de la dirección de envío. MANDATORIO. Ver tabla anexa de provincias.
shipTo.setStreet1("THAMES 677");//Domicilio de envío (calle y nro). MANDATORIO.
shipTo.setStreet2("4to F");//Complemento del domicilio. (piso, departamento). OPCIONAL.
retailTPTransactionData.setShip_to(shipTo);//Datos de envio. MANDATORIO
retailTPTransactionData.setDays_to_delivery("2");
retailTPTransactionData.setTax_voucher_required(Boolean.TRUE);
retailTPTransactionData.setCustomer_loyality_number("123232");
setCoupon_code("cupon22");
//Items de compra (Al menos un item)
Item item = new Item();
item.setCode("popblacksabbat2016"); //MANDATORIO
item.setDescription("Popular Black Sabbath 2016"); //OPCIONAL
item.setName("popblacksabbat2016ss");//MANDATORIO
item.setSku("sku");//MANDATORIO
item.setTotal_amount(34900L);//MANDATORIO
item.setQuantity(1);//MANDATORIO
item.setUnit_price(34900L);//MANDATORIO
ticketingTransactionData.setItems(Arrays.asList(item); //Items de compra. MANDATORIO

Account account = new Account();
account.setId("account_id");
account.setType("account_type");
account.setName("account_name");
account.setCategory(123);
account.setAntiquity(12);

Wallet wallet = new Wallet();
wallet.setId("wallet_id");
wallet.setAntiquity(12);

retailTPTransactionData.setAccount(account);
retailTPTransactionData.setWallet_account(wallet);
retailTPTransactionData.setPayment_method_risk_level(33);
retailTPTransactionData.setEnroled_card_quantity(22);
retailTPTransactionData.setDouble_factor_tp(1);

retailTP.setRetailTP_transaction_data(retailTPTransactionData);//Datos de vertical RetailTP. MANDATORIO
// ...codigo...
```

Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase `RetailTPFraudDetectionData` de la siguiente manera.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);
PaymentRequest paymentRequest = new PaymentRequest();
// Datos del pago
// ...codigo...
RetailTPFraudDetectionData retailTP = new RetailTPFraudDetectionData();
//Datos de vertical RetailTP
// ...codigo...
paymentRequest.setFraud_detection(retailTP);
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Digital Goods

Se enviá un `DigitalGoodsFraudDetectionData` con los [parámetros comunes](#parametros-comunes) y con los siguientes parámetros que se deben enviar específicamente para la vertical Digital Goods. Además se deben enviar datos específicos de cada producto involucrado en la transacción.

```java
// ...codigo...
DigitalGoodsFraudDetectionData digitalGoods = new DigitalGoodsFraudDetectionData();
//seteo de parámetros comunes
// ...codigo...
DigitalGoodsTransactionData digitalGoodsTransactionData = new DigitalGoodsTransactionData();//Datos para la vertical Digital Goods

digitalGoodsTransactionData.setDelivery_type("Pick up"); //MANDATORIO
//Items de compra (Al menos un item)
Item item = new Item();
item.setCode("popblacksabbat2016"); //MANDATORIO
item.setDescription("Popular Black Sabbath 2016"); //OPCIONAL
item.setName("popblacksabbat2016ss");//MANDATORIO
item.setSku("sku");//MANDATORIO
item.setTotal_amount(34900L);//MANDATORIO
item.setQuantity(1);//MANDATORIO
item.setUnit_price(34900L);//MANDATORIO
digitalGoodsTransactionData.setItems(Arrays.asList(item); //Items de compra. MANDATORIO
digitalGoods.setDigital_goods_transaction_data(digitalGoodsTransactionData);//Datos de vertical Digital Goods. MANDATORIO
// ...codigo...
```

Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase`DigitalGoodsFraudDetectionData` de la siguiente manera.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

PaymentRequest paymentRequest = new PaymentRequest();
// Datos del pago
// ...codigo...
DigitalGoodsFraudDetectionData digitalGoods= new DigitalGoodsFraudDetectionData();
//Datos de vertical Digital Goods
// ...codigo...
paymentRequest.setFraud_detection(digitalGoods);
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```

[Volver a inicio](#inicio)

### Travel

Se enviá un `TravelFraudDetectionData` con los [parámetros comunes](#parametros-comunes) y con los siguientes parámetros que se deben enviar específicamente para la vertical Travel. Además se deben enviar datos específicos de cada pasajero.

```java
// ...codigo...
TravelFraudDetectionData travel = new TravelFraudDetectionData();
//seteo de parámetros comunes
// ...codigo...
TravelTransactionData travelTransactionData = new TravelTransactionData();//Datos para la vertical Ticketing
travelTransactionData.setReservation_code("GJH784"); //MANDATORIO
travelTransactionData.setThird_party_booking(Boolean.FALSE); //MANDATORIO
travelTransactionData.setDeparture_city("EZE");//OPCIONAL
travelTransactionData.setFinal_destination_city("HND");//OPCIONAL
travelTransactionData.setInternational_flight(Boolean.TRUE);//OPCIONAL
travelTransactionData.setFrequent_flier_number("00000123");//OPCIONAL
travelTransactionData.setClass_of_service("class");//OPCIONAL
travelTransactionData.setDay_of_week_of_flight(DayOfWeekOfFlight.MONDAY);//OPCIONAL
travelTransactionData.setWeek_of_year_of_flight(5);//OPCIONAL
travelTransactionData.setAirline_code("AA");//OPCIONAL
travelTransactionData.setCode_share("SKYTEAM");//OPCIONAL
travelTransactionData.setAirline_number_of_passengers(1);//MANDATORIO
//Lista de Pasajeros
Passenger passenger = new Passenger();
passenger.setEmail("juan@mail.com");//MANDATORIO
passenger.setFirst_name("Juan");//MANDATORIO
passenger.setLast_name("Perez");//MANDATORIO
passenger.setPassport_id("412314851231"); //OPCIONAL
passenger.setPhone("541134356768");//MANDATORIO
passenger.setPassenger_status(PassengerStatus.GOLD);//MANDATORIO
passenger.setPassenger_type(PassengerType.ADULT);//MANDATORIO
travelTransactionData.setPassengers(Arrays.asList(passenger)); //Lista de pasajeros. MANDATORIO

//Fecha de partida (horario del aeropuerto de partida)
Calendar departureDateTime = Calendar.getInstance();
departureDateTime.setTimeZone(TimeZone.getTimeZone("GMT-0300"));
departureDateTime.set(2018, 06, 25, 8, 35);

DepartureDate departureDate = new DepartureDate();//MANDATORIO. Fecha de partida
departureDate.setDeparture_time(departureDateTime.getTime());//MANDATORIO. Horario de partida
departureDate.setDeparture_zone("GMT-0300");//MANDATORIO. Zona horaria de aeropuerto de partida
DecisionManagerTravel decisionManagerTravel = new DecisionManagerTravel();
decisionManagerTravel.setComplete_route("EZE-LAX:LAX-HND");//MANDATORIO. Ruta completa del viaje. Formato = PP1-DD1:PP2-DD2:... -> PPx = Aeropuerto de partida para escala x; DDx = Aeropuerto destino para escala x; : = Separador de escalas
decisionManagerTravel.setJourney_type(JourneyType.ONE_WAY);//MANDATORIO. Tipo de viaje
decisionManagerTravel.setDeparture_date(departureDate);//MANDATORIO. Fecha de partida

travelTransactionData.setDecision_manager_travel(decisionManagerTravel); ;//MANDATORIO
travel.setTravel_transaction_data(travelTransactionData);//Datos de vertical Ticketing. MANDATORIO
// ...codigo...
```

Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase`TravelFraudDetectionData` de la siguiente manera.

```java
// ...codigo...
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";//Private API Key habilitada para operar en ambiente Sandbox
String urlSandbox = "https://developers.decidir.com/api/v2/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
int timeout = 10; // 10 segundos de timeout
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir(privateApiKey, urlSandbox, timeout, grouper, developer);

PaymentRequest paymentRequest = new PaymentRequest();
// Datos del pago
// ...codigo...
TravelFraudDetectionData travel = new TravelFraudDetectionData();
//Datos de vertical Travel
// ...codigo...
paymentRequest.setFraud_detection(travel);
try {
DecidirResponse paymentResponse = decidir.payment(paymentRequest);
// Procesamiento de respuesta de ejecucion de pago
// ...codigo...
} catch (PaymentException pe) {
// Manejo de pago rechazado
// ...codigo...
} catch (DecidirException de) {
// Manejo de excepcion de Payway
// ...codigo...
} catch (Exception e) {
//Manejo de excepcion general
// ...codigo...
}
// ...codigo...
```
[Volver a inicio](#inicio)

## Uso de Responses

Luego de haber realizado una operación, Payway devuelve los siguientes objetos:

### PaymentResponse

Es usado en:
* [Transacción Simple](#single)
* [Transacción PCI](#pci)
* [Transacción GDS](#gds)
* [Transacción GDS PCI](#gdspci)
* [Transacción BSA PCI](#bsapci)
* [Transacción BSA no PCI](#bsanopci)
* [Transacción Agro no PCI](#agronopci)
* [Transacción Pci por Token]()
* [Información de un Pago](#getpaymentinfo)
* [Operación en dos pasos](#twosteps)

### Page
* [Listado de Pagos](#getallpayments)

### RefundPaymentHistoryResponse
* [Listado de Devoluciones]()

### RefundPaymentResponse
* [Anulación / Devolución Total de Pago](#totalrefund)
* [Devolución Parcial de un Pago](#partialrefund)

### AnnulRefundResponse
* [Anulación de Devolución Total](#deleterefund)
* [Anulación de Devolución Parcial](#deletepartialrefund)

### CardTokens

* [Listado de tarjetas tokenizadas](#listadotarjetastokenizadas)

[Volver a inicio](#inicio)

## Manejo de Excepciones

Todas las respuestas negativas del backend de Payway deberán ser manejadas mediante Excepciones.

Las Excepciones tienen dos naturalezas:

* Resultados de Transacciones y Operaciones:
* [PaymentException](#paymentException)
* [RefundException](#refundException)
* [AnnulRefundException](#annulRefundException)
* [ValidateStatusException](#validateStatusException)
* Errores en el proceso de Transacción y Operaciones:
* [DecidirException](#decidirException)
* [ValidateException](#validateException)
* [ApiException](#apiException)
* [NotFoundException](#notFoundException)


### PaymentException

El PaymentException será lanzado cuando:

* Un pago haya sido RECHAZADO
* El control de CyberSource haya rechazado el Pago (Excepto para Pagos en dos pasos).

#### Atributos
- status: int
- message: String
- paymentResponse: PaymentResponse

*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el PaymentException:
```java
try {
// ...codigo...
// Pago enviado a Payway
// ...codigo...
} catch (PaymentException pe) {
// Estado general de la Excepción
int httpStatus = pe.getStatus();
String exceptionMessage = pe.getMessage();

// Respuesta de DECIDIR
PaymentResponse paymentResponse = pe.getPayment();
}
```

### DecidirException

El DecidirException será lanzado cuando Payway no pueda procesar una solicitud.

#### Atributos
- status: int
- message: String

Además es superclass de las siguientes excepciones:


#### ValidateException

Es lanzado cuando Payway intenta procesar datos con formatos no esperados.

#### Atributos
- status: int
- message: String
- errorDetail: ValidateError
*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el ValidateException:
```java
try {
// ...codigo...
// Pago enviado a Payway
// ...codigo...
} catch (ValidateException ve) {
// Estado general de la Excepción
int httpStatus = ve.getStatus();
String exceptionMessage = ve.getMessage();

// Detalle de error en Payway
ValidateError errorDetail = ve.getErrorDetail();
}
```


#### ValidateStatusException

Es lanzado cuando Payway intenta realizar operaciones con estados no esperados.

#### Atributos
- status: int
- message: String
- errorDetail: ValidateStatusError
*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el ValidateStatusException:
```java
try {
// ...codigo...
// Pago enviado a Payway
// ...codigo...
} catch (ValidateStatusException ve) {
// Estado general de la Excepción
int httpStatus = ve.getStatus();
String exceptionMessage = ve.getMessage();

// Detalle de error en Payway
ValidateStatusError errorDetail = ve.getErrorDetail().getValidation_errors().getStatus();
}
```


#### ApiException

Es lanzado por los siguientes motivos:
* Inconvenientes de acceso a los endpoints del API Payway
* ApiKey incorrecta
* Llamadas demasiado frecuentes al API Payway

#### Atributos
- status: int
- message: String
- errorDetail: ApiError
*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el ApiException:
```java
try {
// ...codigo...
// Pago enviado a Payway
// ...codigo...
} catch (ApiException ae) {
// Estado general de la Excepción
int httpStatus = ae.getStatus();
String exceptionMessage = ae.getMessage();

// Detalle de error en Payway
ApiError errorDetail = ae.getErrorDetail();
}
```


#### NotFoundException

Es lanzado cuando Payway intenta procesar datos incompletos o no existentes en Payway.

#### Atributos
- status: int
- message: String
- errorDetail: NotFoundError
*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el NotFoundException:
```java
try {
// ...codigo...
// Pago enviado a Payway
// ...codigo...
} catch (NotFoundException nfe) {
int httpStatus = nfe.getStatus();
String exceptionMessage = nfe.getMessage();

// Detalle de error en Payway
NotFoundError errorDetail = nfe.getErrorDetail();
}
```


### RefundException

Es lanzado cuando Payway rechaza:

* Devoluciones totales
* Devoluciones parciales
* Anulaciones

#### Atributos
- status: int
- message: String
- refundPaymentResponse: RefundPaymentResponse

*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el RefundException:
```java
try {
// ...codigo...
// Devolución enviada a Payway
// ...codigo...
} catch (RefundException re) {
// Estado general de la Excepción
int httpStatus = re.getStatus();
String exceptionMessage = re.getMessage();

// Respuesta de Payway
RefundPaymentResponse refundPayment = re.getRefundPayment();
}
```


### AnnulRefundException

Es lanzado cuando Payway rechaza:

* Anulaciones de devoluciones totales
* Anulaciones de devoluciones parciales

#### Atributos
- status: int
- message: String
- annulRefundResponse: AnnulRefundResponse

*Ver los valores posibles en la tabla de [Atributos de Excepciones](#atributosExcepciones)*

Ejemplo de cómo capturar el AnnulRefundException:
```java
try {
// ...codigo...
// Anulación de devolución enviada a Payway
// ...codigo...
} catch (AnnulRefundException are) {
// Estado general de la Excepción
int httpStatus = are.getStatus();
String exceptionMessage = are.getMessage();

// Respuesta de Payway
AnnulRefundResponse annulRefund = are.getAnnulRefund();
}
```

[Volver a inicio](#inicio)


### Link Checkout

Este método permite obtener un hash de pago desde el checkout de payway

```java
// ...codigo...

String urlSandbox = "https://developers.decidir.com/api/checkout/";
// Variables para identificar el origen de la transacción, estas mismas pueden ser enviadas vacías.
// Grouper hace referencia al partner que esté consumiendo el servicio
String grouper = "";
// Developer hace referencia al desarrollador que cobra por transacción/otro
String developer = "";
//Ejemplo para el ambiente Sandbox
Decidir decidir = new Decidir("", urlSandbox, timeout, grouper, developer);

CheckoutRequest checkoutRequest = new CheckoutRequest();
checkoutRequest.setId("1234");
checkoutRequest.setOrigin_platform("qw121212");
CheckoutProductModel product = new CheckoutProductModel();
product.setId(4444);
product.setVolume(2.0);
product.setWeight(0.1);
product.setValue(1000.00);
product.setDescription("Remera");
product.setCategoryId(1);
product.setQuantity(3);
checkoutRequest.setProducts(product);
checkoutRequest.setTotal_price(3000.00);
checkoutRequest.setSite("00097001");
checkoutRequest.setSuccess_url("http://www.google.com/");
checkoutRequest.setRedirect_url("https://www.youtube.com/");
checkoutRequest.setCancel_url("http://www.google.com/");
checkoutRequest.setNotifications_url("http://192.168.76.14:10005/");
checkoutRequest.setLife_time("1000");
checkoutRequest.setTemplate_id("1");
int[] installments = {1};
checkoutRequest.setInstallments(installments);
checkoutRequest.setId_payment_method("credit_card");
checkoutRequest.setPlan_gobierno(false);

try {
return new ResponseEntity<>(checkoutService.checkoutHash("", checkoutRequest), HttpStatus.OK);

}catch (CheckoutException e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getResponse(), HttpStatus.valueOf(e.getStatus()));
}catch (Exception e) {
logger.error(e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}

```

[Volver a inicio](#inicio)

## Tablas de Referencia

### Códigos de Medios de pago

[Medios de pago disponibles](https://documentacion-ventasonline.payway.com.ar/docs/gateway/3jw3eiapx1jwu-medios-de-pago#medios-de-pago-disponibles)

1. Visa Debito no acepta devoluciones parciales en ecommerce.

[Volver a inicio](#inicio)

### Divisas Aceptadas

[Medios de pago con Divisas Aceptadas](https://documentacion-ventasonline.payway.com.ar/docs/gateway/3jw3eiapx1jwu-medios-de-pago#divisas-aceptadas)

| Divisa | Descripción | Código API
---------|-------------|--------
| AR$ | Pesos Argentinos | ARS
| U$S | Dólares Americanos | USD

**NOTA** Si bien la API RESTful de Payway admite compras en Dólares Americanos, la legislación argentina sólo permite transacciones en Pesos Argentinos. Es por esto que Payway recomienda que todas las transacciones se cursen en dicha moneda.

[Volver a inicio](#inicio)

### Provincias

[Códigos de Provincia para Cybersource](https://documentacion-ventasonline.payway.com.ar/docs/gateway/vwd3zic062ibr-manejo-de-errores-cyber-source#c%c3%b3digos-de-provincias-para-cybersource)

| Provincia | Código |
|----------|-------------|
| CABA | C |
| Buenos Aires | B |
| Catamarca | K |
| Chaco | H |
| Chubut | U |
| Córdoba | X |
| Corrientes | W |
| Entre Ríos | R |
| Formosa | P |
| Jujuy | Y |
| La Pampa | L |
| La Rioja | F |
| Mendoza | M |
| Misiones | N |
| Neuquén | Q |
| Río Negro | R |
| Salta | A |
| San Juan | J |
| San Luis | D |
| Santa Cruz | Z |
| Santa Fe | S |
| Santiago del Estero | G |
| Tierra del Fuego | V |
| Tucumán | T |

[Volver a inicio](#inicio)

### Parámetros
En ésta sección se describirán todos los parámetros utilizados por la SDK para realizar Operaciones
y Transacciones.


#### Parámetros de Pagos

|Campo |Definición |Obligatorio(SI/NO)|Validación |Ejemplo |
|:------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------|:-----------------------------------------------------------------------------------------------------------------|:--------------------------------------|
|user_id |usuario que esta haciendo uso del sitio (se utiliza para tokenizacion) |Condicional |Sin validacion |user_id: "marcos" |
|site_transaction_id|nro de operacion |SI |Alfanumerico de hasta 39 caracteres |site_transaction_id: "prueba 1" |
|site_id |Site relacionado a otro site, este mismo no requiere del uso de la apikey ya que para el pago se utiliza la apikey del site al que se encuentra asociado.|NO |Se debe encontrar configurado en la tabla site_merchant como merchant_id del site_idNumérico de 8 caracteres.|site_id: "28464385" |
|token |token generado en el primer paso |SI |Alfanumerico de hasta 36 caracteres. No se podra ingresar un token utilizado para un pago generado anteriormente.|token: "" |
|payment_method_id |id del medio de pago |SI |El id debe coincidir con el medio de pago de tarjeta ingresada. |payment_method_id: 1 |
|bin |primeros 6 numeros de la tarjeta |SI |Se valida que sean los primeros 6 digitos de la tarjeta ingresada al generar el token. |bin: "456578" |
|amount |importe del pago |SI |Importe minimo = 1 ($0.01) Importe Maximo = 9223372036854775807 ($92233720368547758.07) |amount: 20000 |
|currency |moneda |SI |Valores permitidos: ARS, USD |currency: "ARS" |
|installments |cuotas del pago |SI |Valor minimo = 1Valor maximo = 99 |installments: 1 |
|payment_type |forma de pago |SI |Valor permitido: single / distributed |payment_type: "single" |
|establishment_name |nombre de comercio |Condicional |Alfanumerico de hasta 25 caracteres |establishment_name : "prueba desa soft"|


##### Parámetros para PagoMisCuentas

|Campo |Definición |Obligatorio(SI/NO)|Validación |Ejemplo |
|:-----------------|:-----------------------------------------------------------------------------------------------------------------------------|:-----------------|:-------------------|:---------------------------------|
|bank_code |ID del banco que se utilizara para realizar el pago.Se guarda en la tabla spstransac.idbanco |SI |Dato variable |bank_code : "17" |
|invoice_expiration|Fecha y hora de vencimiento de la factura. Puede omitirse las 'horas' y 'minutos', informando solo la fecha con formato DDMMYY|SI |Formato: DDMMYY HHMM|invoice_expiration : "311219 2359"|

[Volver a inicio](#inicio)


##### Parámetros para Pagos Offline

|Campo |Definición |Obligatorio(SI/NO)|Validación |Ejemplo |
|:-----------------|:---------------------------------------------------------------------------------------------------------------------------------------------|:-----------------|:-------------------------------------|:------------------------------|
|cod_p3 |Son los días que existen entre el 1º y 2º vencimiento de la factura. Poner “00” si la factura no tiene 2º vencimiento. |SI |Longitud 2 caracteres numéricos |"cod_p3": "11" |
|cod_p4 |Son los días después del 1º vencimiento y hasta el que el cliente puede pagar la factura por Rapipago. |SI |Longitud 3 caracteres numéricos |"cod_p4": "134" |
|client |-Código de cliente provisto al momento de habilitar al comercio.-Nro de establecimiento visa dentro de visa, nro fijo para cada comercio|SI |8 dígitos numericos , dato fijo |"client": "12345678" |
|surcharge |Recargo por Vto. del plazo, dato generado por el comercio. Es un monto (no un porcentaje). 5 cifras enteras y 2 decimales. |SI |Longitud máxima 7 caracteres numericos|"surcharge": 1234567 |
|invoice_expiration|Fecha de vencimiento para el pago del cupón, dato generado por el comercio |SI |Formato: AAMMDD |"invoice_expiration" : "191223"|

[Volver a inicio](#inicio)


##### Parámetros para Pagos Distribuidos por Monto

|Campo |Definición |Obligatorio(SI/NO)|Validación |Ejemplo |
|:------------------------|:-----------------------------|:-----------------|:-----------------------------------------------------------------------------------|:------------------|
|sub_payments.site_id |site_id del sub_payment |SI |Numérico de 8 caracteres, se debe encontrar habilitado y vinculado al site padre |site_id: "28464384"|
|sub_payments.installments|Cuotas del sub_payment |SI |Valor minimo = 1 Valor maximo = 99 |installments: 5 |
|sub_payments.amount |Monto que lleva el sub_payment|SI |Monto total para un pago = 9223372036854775807. Este mismo es parte del amount Total|amount: 10000 |

[Volver a inicio](#inicio)


##### Parámetros para Pagos Distribuidos por Porcentaje

Las transacciones distribuidas por Porcentaje no llevan parámetros adicionales pues
la distribución de pagos se realiza estáticamente.

[Volver a inicio](#inicio)


##### Parámetros para pagos de Comercios Agregadores.

| Campo | Definición | Obligatorio(SI/NO) | Validación | Ejemplo |
|:----------------------|:--------------------------------------------------------------------------------------|:------------------------------|:--------------------------------------------------------------------------------------|:----------------------------------------|
| indicator | Indicador del tipo de documento | SI | Numérico, 1 dígito.Valores posibles: 0 CUIT, 1 CUIL, 2 Número único | "indicator" : "0" |
| identification_number | Numero de CUIT, CUIL o Numero Único (en este caso completar con ceros a la izquierda) | SI | Caracter, 11 posiciones | "identification_number" : "20380902325" |
| bill_to_pay | Numero de Factura a Pagar | SI (Visa), NO (Master) | Alfanumérico 12 caracteres. | "bill_to_pay" : "1234km1" |
| bill_to_refund | Número de factura de anulación/Devolución | SI (Visa), NO (Master) | Alfanumérico 12 caracteres. | "bill_to_refund" : "1234567m90120" |
| merchant_name | Nombre de comercio o nombre y apellido del vendedor | SI (Visa), NO (Master) | Alfanumérico 20 caracteres. En caso de nombre y apellido, deben estar separados por / | "merchant_name" : "dario/gomez" |
| street | Dirección del comercio o del vendedor | SI (Visa), NO (Master) | Alfanumérico 20 caracteres. | "street" : "Jose Maria" |
| number | Número de puerta | SI (Visa), NO (Master) | Alfanumérico 6 caracteres. | "number" : "9898" |
| postal_code | Código postal | SI (Visa), NO (Master) | Alfanumérico 8 caracteres. | "postal_code" : "1234" |
| category | Código de actividad (rubro) | SI (Visa), NO (Master) | Alfanumérico 5 caracteres. | "category" : "1234m" |
| channel | Código de canal | SI (Visa), NO (Master) | Alfanumérico 3 caracteres. | "channel" : "89j" |
| geographic_code | Código geográfico del vendedor | SI (Visa), NO (Master) | Alfanumérico 5 caracteres. | "geographic_code" : "12345" |
| city | Ciudad del domicilio del comercio vendedor | SI (Amex), NO (Visa / Master) | Alfanumérico 15 caracteres como máximo. | "city" : "C.A.B.A." |
| merchant_id | Identificador único del comercio vendedor | SI (Amex), NO (Visa / Master) | Numérico de 16 dígitos como máximo. | "merchant_id" : "12345" |
| province | Provincia del comercio vendedor | SI (Amex), NO (Visa / Master) | Caracter 1 posición. [Valores posibles](#provincias) | "province" : "C" |
| country | País del comercio vendedor | SI (Amex), NO (Visa / Master) | Numérico de 3 caracteres. "032" para Argentina | "country" : "032" |
| merchant_email | Email del comercio vendedor | SI (Amex), NO (Visa / Master) | Alfanumérico 40 caracteres como máximo. | "merchant_email" : "com@decidir.com" |
| merchant_phone | Teléfono del comercio vendedor | SI (Amex), NO (Visa / Master) | Numérico 20 caracteres como máximo. | "merchant_phone" : "48021111" |
| product | Producto que vende, en caso de no contar con el dato completar con espacios | NO | Alfanumérico 20 caracteres. | "product" : "producto_x" |
| origin_country | País de origen del comerciante | SI | Numérico de 3 dígitos. | "origin_country" : "032" |
| merchant_url | URL del Submerchant, en caso de no contar con la información enviar espacios | NO | Alfanumérico de 100 caracteres. | "merchant_url" : "https://merchant-url" |
| aggregator_name | Nombre o datos de vendedor | SI | Alfanumérico de 25 caracteres. | "aggregator_name" : "payfact" |
| gateway_id | ID Gateway | SI (Master), NO (Visa / Amex) | Alfanumérico de 11 caracteres. | "gateway_id" : "payway" |
| seller_id | ID Seller | SI (Amex) | Alfanumérico de 20 caracteres. | "seller_id": "SellerId1234567891011" |

[Volver a inicio](#inicio)


#### Parámetros para Devoluciones parciales, totales y Anulaciones.

|Campo |Definición |Obligatorio(SI/NO)|Validación |Ejemplo |
|:-----|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------|:---------------------------------------------------------------------------------------------------|:-----------|
|amount|Importe del pago a devolver. Si se completa el campo antes del cierre por un monto menor al de la compra se toma como devolucion parcial Si se ingresa el monto total o no se envia dicho campo se toma como anulacion.|NO |Monto total para un pago = 9223372036854775807. Este mismo se debe distribuir sobre los subpayments.|amount: 1000|

[Volver a inicio](#inicio)

### Atributos de Excepciones

|Atributo |Tipo |Descripción |Pertenece a |
|:----------------|:--------------------|:-------------------------------|:----------------------------------------------------------------------------------------------------------|
|status |int |Estado HTTP |Todas |
|message |String |Descripción del Estado HTTP |Todas |
|errorDetail |ValidateError |Descripción del error |[ValidateException](#validateException) |
|errorDetail |ValidateStatusError |Descripción del error |[ValidateStatusException](#validateStatusException) |
|errorDetail |ApiError |Descripción del error |[ApiException](#apiException) |
|errorDetail |NotFoundError |Descripción del error |[NotFoundException](#notFoundException) |
|validation_errors|List|Lista de Errores de validación |[ValidateError](#validateException) |
|validation_errors|ValidationStatus |Validación del estado erróneo |[ValidateStatusError](#validateStatusException) |
|code |String |Código de error |[ValidationError](#validateException)
[ApiError](#apiException)
[NotFoundError](#notFoundException)|
|param |String |Parámetro involucrado |[ValidationError](#validateException) |
|message |String |Descripción del error |[ApiError](#apiException)
[NotFoundError](#notFoundException) |
|id |String |Valor identificatorio |[NotFoundError](#notFoundException) |
|entityName |String |Nombre de la entidad involucrada|[NotFoundError](#notFoundException) |

[Volver a inicio](#inicio)

### Errores de Sistema
Estos códigos de Errores son los status en las Excepciones.

|Código(HTTP)|Mensaje |Descripción |
|:-----------|:----------------------|:-----------------------------------------------|
|400 |malformed_request_error|Error en la comunicación del SDK con el API REST|
|401 |authentication_error |ApiKey Inválido |
|402 |invalid_request_error |Error por datos inválidos |
|404 |not_found_error |Error con datos no encontrados |
|409 |api_error |Error inesperado en la API REST |

[Volver a inicio](#inicio)

### Campo TID (Transaction ID)
Es un identificador único de una transacción que permite vincular una compra con una liquidación o una compra con un contracargo.

Para las marcas Visa, Mastercard y American Express, es posible obtener un identificador llamado Transaction ID (de acá en más TID) como respuesta de una autorización o devolución.

Se informa el TID en la respuesta de Pago Simple, Pago Distribuido, Pre Autorizado y sus devoluciones.
Solo se retorna en transacciones aprobadas por las marcas.

#### Ejemplo de respuesta para una transacción simple:
```json
{
"id": 971344,
"site_transaction_id": "SINGLE_1527712473",
"payment_method_id": 1,
"card_brand": "Visa",
"amount": 2000,
"currency": "ars",
"status": "approved",
"status_details": {
"ticket": "4",
"card_authorization_code": "203430",
"address_validation_code": "VTE0011",
"error": null
},
"date": "2025-03-30T00:00Z",
"customer": {
"id": "juan",
"email": "jmejia@prismamp.com",
"ip_address": "192.168.0.1"
},
"bin": "373953",
"installments": 1,
"first_installment_expiration_date": null,
"payment_type": "single",
"sub_payments": [],
"site_id": "00020220",
"fraud_detection": {
"status": null
},
"establishment_name": null,
"spv": null,
"confirmed": null,
"pan": null,
"customer_token": "23e560af28e73b3c001f465d5d54c15ee1f34826744a4ddf68dc6b469dc604f5",
"card_data": "/tokens/971344",
"tid": "364656548412345"
}
```
#### Ejemplo de respuesta para una transacción distribuida:
```json
{
"id": 971255,
"site_transaction_id": "DISTRIBUTED_1527712473",
"payment_method_id": 1,
"card_brand": "Visa",
"amount": 2000,
"currency": "ars",
"status": "approved",
"status_details": {
"ticket": "4",
"card_authorization_code": "203430",
"address_validation_code": "VTE0011",
"error": null
},
"date": "2025-03-30T00:00Z",
"customer": {
"id": "juan",
"email": "jmejia@prismamp.com",
"ip_address": "192.168.0.1"
},
"bin": "373953",
"installments": 1,
"first_installment_expiration_date": null,
"payment_type": "distributed",
"sub_payments": [
{
"site_id": "04052023",
"installments": 1,
"amount": 1000,
"ticket": "211",
"card_authorization_code": "058205",
"subpayment_id": 1265395,
"tid": "234567891234567"
},
{
"site_id": "00009007",
"installments": 1,
"amount": 1000,
"ticket": "626",
"card_authorization_code": "048246",
"subpayment_id": 1265394,
"tid": "345678912345678"
}
],
"site_id": "00020220",
"fraud_detection": {
"status": null
},
"establishment_name": null,
"spv": null,
"confirmed": null,
"pan": null,
"customer_token": "23e560a3b3c001f465d5d55ee1f3542c468712744a4ddf68dc6b469dc604f5",
"card_data": "/tokens/971255",
"tid": "123456789123456"
}
```
[Volver a inicio](#inicio)