Modulo para conexión con gateway de pago Payway
- Introducción
- Instalación
- Uso
- Inicializar la clase correspondiente al conector
- Operatoria del Gateway
- Tokenización de tarjetas de crédito
- Tokenización Interna
- Integración con Cybersource
- Uso de Responses
- Manejo de Excepciones
- Link Checkout
- Tablas de referencia
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 :
- Procesamiento de pago. Se utiliza alguna de las siguentes sdks back-end :
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 privada1 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:
_1 - Las API Keys serán provistas por el equipo de Soporte de Payway ventas online(soporte@payway.com.ar). _
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)
El flujo de una transacción a través de las sdks consta de dos pasos, a saber:
-
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.
-
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.
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.
- repositoryUrl: http://repo.dev.redbee.io/content/repositories/decidir-sdk/
- groupId: com.decidir.api
- artifactId: decidir2-sdk-java7
- version: 2.7.1
La versión implementada de la SDK, está testeada para versiones a partir de Java 1.6
La sdk Java permite trabajar con los ambientes Sandbox y Produccón de Payway. El ambiente se debe instanciar indicando su URL.
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...
}
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.
// ...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...
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).
A continuación se muestra un ejemplo con una transacción simple sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // Llenar en caso de transaccion distribuida por monto
paymentRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia
try {
DecidirResponse<PaymentResponse> 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...
A continuación se muestra un ejemplo con una transacción pci sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // Llenar en caso de transaccion distribuida por monto
paymentPciRequest.setSub_payments(sub_payments); //Debe enviarse una lista vacia
try {
DecidirResponse<PaymentResponse> 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...
A continuación se muestra un ejemplo con una transacción pci sin Cybersource tokenizado.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // 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("Buenos Aires");
aggregateData.setCountry("Argentina")
aggregateData.setMerchant_email("qa@decidir.com");
aggregateData.setMerchant_phone("+541135211111");
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> 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...
A continuación se muestra un ejemplo con una transacción GDS simple sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // 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> 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...
A continuación se muestra un ejemplo con una transacción PCI sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // 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> 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...
A continuación se muestra un ejemplo con una transacción BSA PCI sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // 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> 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...
Las transacciones BSA no PCI operan de manera idéntica a las transacciones simples, para realizar una operacion por bsa no pci basta con seguir el mismo ejemplo que el visto en las transacciones simples.
A continuación se muestra un ejemplo con una transacción Agro simple sin Cybersource.
Aclaracion : amount es un campo long el cual representa el valor en centavos.
// ...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<InstallmentData> l = new ArrayList<InstallmentData>();
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<SubPayment> sub_payments = new ArrayList<SubPayment>(); // Llenar en caso de transaccion distribuida por monto
agroPaymentRequestNoPCI.setSub_payments(sub_payments); //Debe enviarse una lista vacia
try {
DecidirResponse<AgroPaymentResponse> 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...
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. 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.
// ...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<SubPayment> subPayments = new ArrayList<SubPayment>(); // 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> 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...
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.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>(); //Nunca se utiliza en 2 pasos (se envia vacio)
paymentRequest.setSub_payments(sub_payments);
try {
DecidirResponse<PaymentResponse> 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<PaymentResponse> 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...
En este caso se necesita agregar el flag "cardholder_auth_required" en true y se le debe pasar el objeto "auth_3ds_data".
// ...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<PaymentAuth3dsResponse> 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...
Ejemplo de resolucion al ejecutar el pago que nos devuelve el resultado con el estado CHALLENGE_PENDING o FINGERPRINT_PENDING,
// ...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<PaymentAuth3dsResponse> 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...
Mediante este recurso, se genera una solicitud de listado de pagos. Este recurso admite la posibilidad de agregar filtros adicionales
// ...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<Page> 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...
Mediante este recurso, se genera una solicitud de información de un pago previamente realizado, pasando como parámetro el id del pago.
// ...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<PaymentResponse> 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...
A continuación se describen las diferentes operatorias para realizar anulaciones y devoluciones de pagos
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.
// ...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<RefundPaymentResponse> 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...
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.
// ...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<AnnulRefundResponse> 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...
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.
// ...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<RefundSubPayment>());//Llenar en caso de solicitar devolucion parcial en transaccion distribuida
try {
DecidirResponse<RefundPaymentResponse> 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...
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.
// ...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<AnnulRefundResponse> 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...
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.
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.
// ...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<CardTokens> 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...
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.
// ...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<SubPayment> sub_payments = new ArrayList<SubPayment>() // Llenar en caso de transaccion distribuida
paymentRequest.setSub_payments(sub_payments);
try {
DecidirResponse<PaymentResponse> 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...
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.
// ...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<Void> 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...
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.
Permite obtener el token.
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);
}
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).
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()));
}
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.
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.
- bill_to
// ...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...
- purchase_totals
// ...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...
- customer_in_site
// ...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...
- copy_paste_card_data
// ...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...
- Otros campos
// ...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...
Se enviá un RetailFraudDetectionData
con los parámetros 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.
// ...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.
// ...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> 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...
Se enviá un TicketingTransactionData
con los parámetros 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.
// ...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 claseTicketingTransactionData
de la siguiente manera.
// ...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> 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...
Se enviá un RetailTPFraudDetectionData
con los parámetros 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.
// ...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.
// ...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> 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...
Se enviá un DigitalGoodsFraudDetectionData
con los parámetros 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.
// ...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 claseDigitalGoodsFraudDetectionData
de la siguiente manera.
// ...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> 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...
Se enviá un TravelFraudDetectionData
con los parámetros 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.
// ...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 claseTravelFraudDetectionData
de la siguiente manera.
// ...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> 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...
Luego de haber realizado una operación, Payway devuelve los siguientes objetos:
Es usado en:
- Transacción Simple
- Transacción PCI
- Transacción GDS
- Transacción GDS PCI
- Transacción BSA PCI
- Transacción BSA no PCI
- Transacción Agro no PCI
- Transacción Pci por Token
- Información de un Pago
- Operación en dos pasos
Todas las respuestas negativas del backend de Payway deberán ser manejadas mediante Excepciones.
Las Excepciones tienen dos naturalezas:
- Resultados de Transacciones y Operaciones:
- Errores en el proceso de Transacción y Operaciones:
El PaymentException
será lanzado cuando:
- Un pago haya sido RECHAZADO
- El control de CyberSource haya rechazado el Pago (Excepto para Pagos en dos pasos).
- status: int
- message: String
- paymentResponse: PaymentResponse
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el PaymentException
:
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();
}
El DecidirException
será lanzado cuando Payway no pueda procesar una solicitud.
- status: int
- message: String
Además es superclass
de las siguientes excepciones:
Es lanzado cuando Payway intenta procesar datos con formatos no esperados.
- status: int
- message: String
- errorDetail: ValidateError
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el ValidateException
:
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();
}
Es lanzado cuando Payway intenta realizar operaciones con estados no esperados.
- status: int
- message: String
- errorDetail: ValidateStatusError
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el ValidateStatusException
:
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();
}
Es lanzado por los siguientes motivos:
- Inconvenientes de acceso a los endpoints del API Payway
- ApiKey incorrecta
- Llamadas demasiado frecuentes al API Payway
- status: int
- message: String
- errorDetail: ApiError
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el ApiException
:
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();
}
Es lanzado cuando Payway intenta procesar datos incompletos o no existentes en Payway.
- status: int
- message: String
- errorDetail: NotFoundError
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el NotFoundException
:
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();
}
Es lanzado cuando Payway rechaza:
- Devoluciones totales
- Devoluciones parciales
- Anulaciones
- status: int
- message: String
- refundPaymentResponse: RefundPaymentResponse
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el RefundException
:
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();
}
Es lanzado cuando Payway rechaza:
- Anulaciones de devoluciones totales
- Anulaciones de devoluciones parciales
- status: int
- message: String
- annulRefundResponse: AnnulRefundResponse
Ver los valores posibles en la tabla de Atributos de Excepciones
Ejemplo de cómo capturar el AnnulRefundException
:
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();
}
Este método permite obtener un hash de pago desde el checkout de payway
// ...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);
}
- Visa Debito no acepta devoluciones parciales en ecommerce.
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.
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 |
En ésta sección se describirán todos los parámetros utilizados por la SDK para realizar Operaciones y Transacciones.
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_id Numé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 | Valor permitido: ARS | currency: "ARS" |
installments | cuotas del pago | SI | Valor minimo = 1 Valor 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" |
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" |
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" |
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 |
Las transacciones distribuidas por Porcentaje no llevan parámetros adicionales pues la distribución de pagos se realiza estáticamente.
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 | "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" |
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 |
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 |
errorDetail | ValidateStatusError | Descripción del error | ValidateStatusException |
errorDetail | ApiError | Descripción del error | ApiException |
errorDetail | NotFoundError | Descripción del error | NotFoundException |
validation_errors | List | Lista de Errores de validación | ValidateError |
validation_errors | ValidationStatus | Validación del estado erróneo | ValidateStatusError |
code | String | Código de error | ValidationError ApiError NotFoundError |
param | String | Parámetro involucrado | ValidationError |
message | String | Descripción del error | ApiError NotFoundError |
id | String | Valor identificatorio | NotFoundError |
entityName | String | Nombre de la entidad involucrada | NotFoundError |
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 |