A partir de la version 2.0 el campo amount de todos los pagos y operaciones son de tipo Long, se consideran los 2 ultimos digitos como la parte decimal del importe.
Monto | Ejemplo SDK |
---|---|
$1250,45 | 125045 |
$1.500.250,50 | 150025050 |
$3000,00 | 300000 |
Modulo para conexión con gateway de pago Payway
- Introducción
- Instalación
- Uso
- Inicializar la clase correspondiente al conector
- Operatoria del Gateway
- Health Check
- Ejecución del Pago
- Ejecución del pago PCI
- Ejecución del pago PCI Tokenizado
- Ejecución de pago simple con 3ds
- Ejecución del Pago Offline
- Formulario de Pago
- Listado de Pagos
- Información de un Pago
- Anulación / Devolución Total de Pago
- Anulación de Devolución Total
- Devolución Parcial de un Pago
- Anulación de Devolución Parcial
- Obtención de Token
- Obtención de Token BSA
- Tokenización de tarjetas de crédito
- Integración con Cybersource
- 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 Net 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.
- El comercio que se integre, debe realizar un [POST] al endpoint de Forms /validate
En el header debe enviarse la apikey pci. El body de dicho post contendrá lo siguiente:
{
"site": {
"id": "00123123",
"transaction_id": "0000001111"
},
"customer": {
"id": "test",
"email" : "[email protected]"
},
"payment": {
"amount": 99999,
"currency": "ARS",
"payment_type": "distributed",
"sub_payments" : [
{
"site_id": "00111116",
"amount": 60000,
"installments": 3
},
{
"site_id": "00111117",
"amount": 39999,
"installments": 3
}
]
},
"success_url": "http://www.ituran.com.ar/home",
"cancel_url": "http://www.ituran.com.ar/pagos"
}
- CAMPO ID (SITE): Dato no requerido.En caso de que ingrese con un site (que viene en la apikey), y quiera realizar un pago con otro site.
- CAMPO TRANSACTION_ID (SITE): Numero de operación.
- CAMPO ID (CUSTOMER): Nombre de usuario registrado en el sitio, dato para obtener tokes de tarjetas.
- CAMPO EMAIL (CUSTOMER): Email donde se enviará información del pago.
- CAMPO AMOUNT (PAYMENT): Es el monto, el mismo viaja como Long.
- CAMPO CURRENCY (PAYMENT): Tipo de moneda.
- CAMPO PAYMENT_TYPE (PAYMENT): Si el pago es simple "single" en cambio si es distribuida como en en ejemplo "distributed".
- CAMPO SUB_PAYMENTS (PAYMENT): Para el caso de un pago simple el mismo debe ir de la siguiente manera: "sub_payments" : [ ]
- CAMPO SUCCESS_URL: Url donde rediccionara una vez realizado el pago con exito.
- CAMPO CANCEL_URL: Url donde rediccionara si el cliente quiere cancelar el formulario.
El resto de la información que no se encuentra en dicho Post, sea los medio de pago o cuotas habilitadas para dicho sitio, se encuentran en el template.
El resultado del validate contendrá un hash de la información enviada. Ejemplo: { "hash": "generatedHash" }
-
Con el hash obtenido, el browser tendrá que ser redirigido con un [GET] al recurso /form?hash={generatedHash} mostrando el template renderizado para hacer el pago.
-
El usuario pondrá optar por una tarjeta tokenizada o ingresará los datos de una nueva. Una vez completado el formulario, al seleccionar pagar, este hará un [POST] al enpoint /payments de Forms. Forms intentará realizar un pago. En caso de que sea satisfactorio, este redirigirá a la página seteada en el campo "success_url" (paso 1), caso contrario renderizará el template de error.
Para generar el token de pago, la aplicación cliente realizará con Payway a través de alguna de las siguentes sdks front-end:
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 debe descargar la última versión del SDK desde el botón Download ZIP del branch master. Una vez descargado y descomprimido, se debe agregar la librería Decidir.dll que se encuentra dentro de la carpeta dist, a las librerías del proyecto y en el codigo se debe agregar siguiente using.
using Decidir;
using Decidir.Constants;
using Decidir.Model;
using Decidir.Exceptions;
La versión implementada de la SDK, esta testeada para versiones desde .net 3.5
Se encuentra disponible la documentación Manual de Integración Payway para su consulta online, en este detalla el proceso de integración. En el mismo se explican los servicios y operaciones disponibles, con ejemplos de requerimientos y respuestas, aquí sólo se ejemplificará la forma de llamar a los distintos servicios utilizando la presente SDK.
El SDK-Net permite trabajar con los ambientes de desarrollo y de producción de Payway. El ambiente se debe instanciar como se indica a continuación.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
//Para el ambiente de produccion
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_PRODUCCION, privateApiKey, publicApiKey);
Instanciación de la clase DecidirConnector
La misma recibe como parámetros la public key o private key provisto por Payway para el comercio y el ambiente en que se trabajara.
Ambas API Keys serán provistas por el equipo de Soporte de Payway ([email protected]).
Es de importancia mencionar que a lo largo de toda la presente documentación, se utilizarán las siguientes API Keys de prueba para los Requests
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Este recurso permite conocer el estado actual de la API RESTful de Payway.
using Decidir;
using Decidir.Constants;
using Decidir.Model;
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, "", "");
HealthCheckResponse response = decidir.HealthCheck();
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.
Aclaracion : amount es un campo Long, los últimos dos números se considerarán como decimales.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
payment.site_transaction_id = "[ID DE LA TRANSACCIÓN]";
payment.payment_method_id = 1;
payment.token = "[TOKEN DE PAGO]";
payment.bin = "450799";
payment.amount = 2000;
payment.currency = "ARS";
payment.installments = 1;
payment.description = "";
payment.payment_type = "single";
payment.establishment_name = "single";
try
{
PaymentResponse resultPaymentResponse = decidir.Payment(payment);
}
catch (ResponseException)
{
}
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
payment.site_transaction_id = "[ID DE LA TRANSACCIÓN]";
payment.payment_method_id = 1;
payment.amount = 2000;
payment.currency = "ARS";
payment.installments = 1;
payment.description = "";
payment.payment_type = "single";
payment.establishment_name = "single";
CardData card_data = new CardData();
card_data.card_holder_name: "Luis Perez",
card_data.card_expiration_month: "02",
card_data.card_expiration_year: "23",
card_data.card_number: "4517613063087082",
card_data.security_code="444"
CardHolderIdentification card_holder_identification = new CardHolderIdentification();
card_holder_identification.number: "35080911",
card_holder_identification.type: "dni"
card_data.card_holder_identification = card_holder_identification;
payment.card_data = card_data;
AggregateDataPayment aaggregate_data = new AggregateDataPayment();
aagregate_data.indicator: "1";
aagregate_data.identification_number: "30598910045";
aagregate_data.bill_to_pay: "Decidir_Test";
aagregate_data.bill_to_refund: "Decidir_Test";
aagregate_data.merchant_name: "DECIDIR";
aagregate_data.street: "Lavarden";
aagregate_data.number: "247";
aagregate_data.postal_code: "C1437FBE";
aagregate_data.category: "05044";
aagregate_data.channel: "005";
aagregate_data.geographic_code: "C1437";
aagregate_data.city: "Ciudad de Buenos Aires";
aagregate_data.merchant_id: "decidir_Agregador";
aagregate_data.province: "Buenos Aires";
aagregate_data.country: "Argentina";
aagregate_data.merchant_email: "[email protected]";
aagregate_data.merchant_phone: "+541135211111";
payment.aggregate_data = aaggregate_data;
try
{
PaymentResponse resultPaymentResponse = decidir.Payment(payment);
}
catch (ResponseException){}
catch (PaymentResponseException){}
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
payment.site_transaction_id = "[ID DE LA TRANSACCIÓN]";
payment.payment_method_id = 1;
payment.amount = 2000;
payment.currency = "ARS";
payment.installments = 1;
payment.description = "";
payment.payment_type = "single";
payment.establishment_name = "single";
CardData card_data = new CardData();
card_data.card_holder_name: "Luis Perez",
card_data.card_expiration_month: "02",
card_data.card_expiration_year: "23",
card_data.card_number: "4517613063087082",
card_data.security_code="444"
CardHolderIdentification card_holder_identification = new CardHolderIdentification();
card_holder_identification.number: "35080911",
card_holder_identification.type: "dni"
card_data.card_holder_identification = card_holder_identification;
payment.card_data = card_data;
AggregateDataPayment aaggregate_data = new AggregateDataPayment();
aagregate_data.indicator: "1";
aagregate_data.identification_number: "30598910045";
aagregate_data.bill_to_pay: "Decidir_Test";
aagregate_data.bill_to_refund: "Decidir_Test";
aagregate_data.merchant_name: "DECIDIR";
aagregate_data.street: "Lavarden";
aagregate_data.number: "247";
aagregate_data.postal_code: "C1437FBE";
aagregate_data.category: "05044";
aagregate_data.channel: "005";
aagregate_data.geographic_code: "C1437";
aagregate_data.city: "Ciudad de Buenos Aires";
aagregate_data.merchant_id: "decidir_Agregador";
aagregate_data.province: "Buenos Aires";
aagregate_data.country: "Argentina";
aagregate_data.merchant_email: "[email protected]";
aagregate_data.merchant_phone: "+541135211111";
payment.aggregate_data = aaggregate_data;
TokenCardData token_card_data = new TokenCardData();
token_card_data.token= "4540730005109054",
token_card_data.eci= "05",
token_card_data.cryptogram= "cryptogram_123467890"
payment.token_card_data = paymentRequest.token_card_data;
payment.is_tokenized_payment: true;
try
{
PaymentResponse resultPaymentResponse = decidir.Payment(payment);
}
catch (ResponseException){}
catch (PaymentResponseException){}
En este caso se necesita agregar el flag "cardholder_auth_required" en true y se le debe pasar el objeto "auth_3ds_data".
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
payment.site_transaction_id = "[ID DE LA TRANSACCIÓN]";
payment.payment_method_id = 1;
payment.token = "[TOKEN DE PAGO]";
payment.bin = "450799";
payment.amount = 2000;
payment.currency = "ARS";
payment.installments = 1;
payment.description = "";
payment.payment_type = "single";
payment.establishment_name = "single";
payment.cardholder_auth_required =true;
Auth3dsData auth_3ds_data = new Auth3dsData ();
auth_3ds_data.device_type= "BROWSER";
auth_3ds_data.accept_header= "application/json";
auth_3ds_data.user_agent= "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101";
auth_3ds_data.ip= "1.12.123.255";
auth_3ds_data.java_enabled= true;
auth_3ds_data.language= "es";
auth_3ds_data.color_depth= "32";
auth_3ds_data.screen_height= 500;
auth_3ds_data.screen_width= 4;
auth_3ds_data.time_zone_offset= 570;
payment.auth_3ds_data = auth_3ds_data;
try
{
PaymentResponse resultPaymentResponse = decidir.Payment(payment);
}
catch (ResponseException){}
catch (PaymentResponseException){}
catch (PaymentAuth3dsResponseException){}
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.
Aclaracion : amount es un campo Long, los últimos dos números se considerarán como decimales.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
OfflinePayment payment = new OfflinePayment();
payment.site_transaction_id = "[ID DE LA TRANSACCIÓN]";
payment.payment_method_id = 48;
payment.token = "[TOKEN DE PAGO]";
payment.amount = 2000;
payment.currency = "ARS";
payment.payment_type = "single";
payment.establishment_name = "";
payment.email = "[email protected]";
payment.invoice_expiration = "191123";
payment.cod_p3 = "01";
payment.cod_p4 = "134";
payment.client = "12345678";
payment.payment_mode = "offline";
payment.second_invoice_expiration = "191223";
payment.surcharge = 1001;
try
{
PaymentResponse resultPaymentResponse = decidir.Payment(payment);
}
catch (ResponseException)
{
}
Este servicio permite integrar en el comercio un formulario de pago. Utiliza el recurso "validate" para obtener un hash a partir de los datos de la operacion, luego este hash sera utilizado al momento de llamar al recurso "form" el cual devolvera el formulario renderizado propio para cada comercio listo para ser utilizado y completar el flujo de pago.
Campo | Descripcion | Oblig | Restricciones | Ejemplo |
---|---|---|---|---|
site.id | Merchant | Condicional | Numérico de 20 digitos | id: "12365436" |
site.template.id | Id de formulario de pago, el id es unico para cada comercio y es generado previamente por Payway | SI | Numérico de 20 digitos | |
site.transaction_id | Numero de operación | SI | Alfanumérico de 40 digitos | |
customer.id | d que identifica al usuario | NO | Alfanumérico de 40 digitos | |
customer.email | Email del cliente. Se envía información del pago | Es requerido si se desea realizar el envío de mails | Alfanumérico de 40 digitos | email:"[email protected]" |
payment.amount | Monto de la compra | SI | Numérico | |
payment.currency | Tipo de moneda | NO | Letras | |
payment.payment_method_id | Id del medio de pago | SI | Númerico | |
payment.bin | Primeros 6 dígitos de la tarjeta | NO | Númerico | |
payment.installments | Cantidad de cuotas | SI | Númerico | |
payment.payment_type | Indica si es simple o distribuida | SI | Valores posibles: "single", "distributed" | |
payment.sub_payments | Se utiliza para pagos distribuidos. Informa los subpayments | Es requerido si el | ||
pago es distribuido por monto, ya que si es por porcentaje toma los configurados desde Adm Sites (SAC) | NA | |||
success_url | Url a donde se rediccionará una vez que el usuario finalice la operación desde la página de feedback | SI | Númerico | |
cancel_url | Url donde se rediccionará si el cliente quiere cancelar el formulario | SI | NA | |
redirect_url | Url en la cual se enviaran los datos de la operación una vez finalizada la misma para que el comercio pueda capturarlos y mostrarlos como lo desee | Es requerido en los casos donde no informe el campo "success_url" | NA |
//Para esta funcion es necesario enviar junto al public y private key el "form_key".
/**************** VALIDATE *******************/
ValidateCustomer validateCustomer = new ValidateCustomer();
validateCustomer.email = "[email protected]";
validateCustomer.id = "[email protected]";
SiteInfo site = new SiteInfo();
TemplateValidate template =new TemplateValidate();
template.id = 5;
site.transaction_id = "1";
site.template = template;
ValidateData validateData = new ValidateData();
validateData.site = site;
validateData.customer = validateCustomer;
ValidatePayment validatePayment = new ValidatePayment();
validatePayment.amount = 500;
validatePayment.currency = "ARS";
validatePayment.payment_method_id = 1;
validatePayment.bin = "45979";
validatePayment.installments = 4;
validatePayment.payment_type = "single";
validatePayment.sub_payments = new List<object>();
validateData.payment = validatePayment;
validateData.success_url = "https://shop.swatch.com/es_ar/";
validateData.redirect_url = null; // si success_url esta vacio redirect_url es requerido
validateData.cancel_url = "https://swatch.com/api/result";
// En este ejemplo se utiliza el vertical Travel el cual debe ser completado con sus respectivos campos
TravelFraudDetection travel = new TravelFraudDetection();
validateData.fraud_detection = retail;
String privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
String publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
String validateApiKey = "5cde7e72ea1e430db94d436543523744";
String merchant = "00020621";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey, validateApiKey, merchant);
//validateData.fraud_detection = new Dictionary<string, object>(); // travel;
ValidateResponse ValidateResponse = decidir.Validate(validateData);
{
"statusCode":201,
"hash":"a1652d02-ba6e-427e-833f-b686efeed29f"
}
Utiliza el siguiente enlace para generar dinámicamente un formulario a partir de un hash específico:
- Ambiente Developers (Sandbox) -> https://developers.decidir.com/web/forms/4daa07cf-40b8-42ba-b2af-38c26ada763f?apikey=9pX3bRdGqZfV7JhY6Nk2L1oM4sT5wI8e
- Ambiente Productivo -> https://ventasonline.payway.com.ar/web/forms/83bbf463-950f-4af4-9a0c-eb651cef0cp4?apikey=9pX3bRdGqZfV7JhY6Nk2L1oM4sT5wI8e
Composición:
https:{ruta-ambiente-payway}/web/forms/{hash-generado}?apikey={apikey-publica}
Este enlace compone la URL para acceder al formulario, donde {hash}
es el hash que tuvimos como respuesta y sirve para renderizar el formulario y {apikey-publica}
es la clave pública requerida para la autenticación.
Este enlace te llevará al formulario específico basado en el hash generado.
Mediante este recurso, se genera una solicitud de listado de pagos. Este recurso admite la posibilidad de agregar los filtros adicionales:
- (opcional) offset: desplazamiento en los resultados devueltos. Valor por defecto = 0.
- (opcional) pageSize: cantidad máxima de resultados retornados. Valor por defecto = 50.
- (opcional) siteOperationId: ID único de la transacción a nivel comercio (equivalente al site_transaction_id).
- (opcional) merchantId: ID Site del comercio.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
GetAllPaymentsResponse pagos = decidir.GetAllPayments();
Mediante este recurso, se genera una solicitud de información de un pago previamente realizado, pasando como parámetro el id del pago.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
long paymentId = 0;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
PaymentResponse paymentInfoResponse = decidir.GetPaymentInfo(paymentId);
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.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
long paymentId = 0;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
RefundResponse refund = decidir.Refund(paymentId);
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 y el id de la devolución.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
long paymentId = 0;
long refundId = 0;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
RefundResponse deleteRefund = decidir.DeleteRefund(paymentId, refundId);
Mediante este recurso, se genera una solicitud de devolución parcial de un pago puntual, pasando como parámetro el id del pago y el monto de la devolución.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
long paymentId = 0;
RefundAmount refundAmount = new RefundAmount();
refundAmount.amount = 1050;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
RefundPaymentResponse refund = decidir.PartialRefund(paymentId, refundAmount);
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 y el id de la devolución.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
long paymentId = 0;
long refundId = 0;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
RefundResponse deleteRefund = decidir.DeletePartialRefund(paymentId, refundId);
Se debe llamar al servicio getToken para obtener el token con el que se hará el pago en Payway
crear el request o directamente mandar el body
TokenRequest request = new TokenRequest();
request.card_number = "4509790112684851";
request.card_expiration_month = "12";
request.card_expiration_year = "30";
request.card_holder_name = "Barb";
request.security_code = "123";
CardHolderIdentification card_holder_identification = new CardHolderIdentification();
card_holder_identification.type = "dni";
card_holder_identification.number = "29123456";
request.card_holder_identification = card_holder_identification;
TokenFraudDetection fraud_detection = new TokenFraudDetection();
fraud_detection.device_unique_identifier = "12345";
request.fraud_detection = fraud_detection;
request.ip_address = "192.168.100.1";
body:
{
"card_number": "4509790112684851",
"card_expiration_month": "12",
"card_expiration_year": "30",
"card_holder_name": "Barb",
"security_code": "123",
"card_holder_identification": {
"type": "dni",
"number": "29123456"
},
"fraud_detection": {
"device_unique_identifier": "12345"
},
"ip_address": "192.168.100.1"
}
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey_payway, publicApiKey_payway);
try
{
GetTokenResponse resultGetTokenResponse = decidir.GetToken(request);
string outputResutGetToken = JsonConvert.SerializeObject(resultGetTokenResponse);
}
catch (Exception e)
{
Debug.WriteLine("{0} Exception caught.", e);
}
Se debe llamar al servicio getToken para obeter el token con el que se hará el pago en Payway
CardHolderIdentification card_holder_identification = new CardHolderIdentification();
card_holder_identification.type = "DNI";
card_holder_identification.number = "33222444";
FraudDetectionBSA fraud_detection = new FraudDetectionBSA();
fraud_detection.device_unique_identifier = "12345";
CardTokenBsa card_token_bsa = new CardTokenBsa();
card_token_bsa.public_token = 96291105;
card_token_bsa.issue_date = "20190108";
card_token_bsa.merchant_id = "1234567890";
card_token_bsa.card_holder_name = "Comprador";
card_token_bsa.card_holder_identification = card_holder_identification;
card_token_bsa.fraud_detection = fraud_detection;
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey_decidir, publicApiKey_decidir);
try
{
GetTokenResponse resultGetTokenResponse = decidir.GetToken(card_token_bsa);
string outputResutGetToken = JsonConvert.SerializeObject(resultGetTokenResponse);
}
catch (Exception e)
{
Debug.WriteLine("{0} Exception caught.", e);
}
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.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
GetAllCardTokensResponse resultTokens = new GetAllCardTokensResponse();
resultTokens = decidir.GetAllCardTokens("prueba");
Al cargar el formulario de pago este mostrara las tarjetas tokenizadas que posee el usuario.
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 el objeto "customer".
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
PaymentResponse resultPaymentResponse = new PaymentResponse();
Payment payment = new Payment();
payment.site_transaction_id = "12042017_20";
payment.customer.email = "[email protected]";
payment.customer.id = "12345678";
payment.payment_method_id = 1;
payment.token = "be211413-757b-487e-bb0c-283d21c0fb6f";
payment.bin = "450799";
payment.amount = 3000;
payment.currency = "ARS";
payment.installments = 1;
payment.description = "";
payment.payment_type = "single";
payment.establishment_name = "";
resultPaymentResponse = decidir.Payment(payment);
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 el token de la tarjeta tokenizada.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
bool result = false;
result = decidir.DeleteCardToken("af49025a-f1b7-4363-a1cb-1ed38c3d4d75");
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.
Los siguientes parámetros 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.
RetailFraudDetection retail = new RetailFraudDetection();
retail.channel = "Web/Mobile/Telefonica"; //una de las tres opciones es válida
//bill_to
retail.bill_to.city = "Buenos Aires"; //Ciudad de facturación, MANDATORIO.
retail.bill_to.country = "AR"; //País de facturación. MANDATORIO. Código ISO. (http://apps.cybersource.com/library/documentation/sbc/quickref/countries_alpha_list.pdf)
retail.bill_to.customer_id = "useridprueba"; //Identificador del usuario al que se le emite la factura. MANDATORIO. No puede contener un correo electrónico.
retail.bill_to.email = "[email protected]"; //Mail del usuario al que se le emite la factura. MANDATORIO.
retail.bill_to.first_name = "nombre"; //Nombre del usuario al que se le emite la factura. MANDATORIO.
retail.bill_to.last_name = "apellido"; //Apellido del usuario al que se le emite la factura. MANDATORIO.
retail.bill_to.phone_number = "1512341234"; //Teléfono del usuario al que se le emite la factura. No utilizar guiones, puntos o espacios. Incluir código de país. MANDATORIO.
retail.bill_to.postal_code = "1427"; //Código Postal de la dirección de facturación. MANDATORIO.
retail.bill_to.state = "BA"; //Provincia de la dirección de facturación. MANDATORIO. Ver tabla anexa de provincias.
retail.bill_to.street1 = "Cerrito 123"; //Domicilio de facturación (calle y nro). MANDATORIO.
retail.bill_to.street2 = "Mexico 123"; //Complemento del domicilio. (piso, departamento). NO MANDATORIO.
//purchase_totals
retail.purchase_totals.currency = "ARS"; //Moneda. MANDATORIO.
retail.purchase_totals.amount = 2000;
//customer_in_site
retail.customer_in_site.days_in_site = 243;
retail.customer_in_site.is_guest = false;
retail.customer_in_site.password = "abracadabra";
retail.customer_in_site.num_of_transactions = 1;
retail.customer_in_site.cellphone_number = "12121";
retail.customer_in_site.date_of_birth = "129412";
retail.customer_in_site.street = "RIO 4041";
//retail_transaction_data
retail.retail_transaction_data.ship_to.city = "Buenos Aires";
retail.retail_transaction_data.ship_to.country = "AR";
retail.retail_transaction_data.ship_to.customer_id = "useridprueba";
retail.retail_transaction_data.ship_to.email = "[email protected]";
retail.retail_transaction_data.ship_to.first_name = "nombre";
retail.retail_transaction_data.ship_to.last_name = "apellido";
retail.retail_transaction_data.ship_to.phone_number = "1512341234";
retail.retail_transaction_data.ship_to.postal_code = "1427";
retail.retail_transaction_data.ship_to.state = "BA";
retail.retail_transaction_data.ship_to.street1 = "Cerrito 123";
retail.retail_transaction_data.ship_to.street2 = "Mexico 123";
retail.retail_transaction_data.days_to_delivery = "55";
retail.retail_transaction_data.dispatch_method = "storepickup";
retail.retail_transaction_data.tax_voucher_required = true;
retail.retail_transaction_data.customer_loyality_number = "123232";
retail.retail_transaction_data.coupon_code = "cupon22";
CSItem item = new CSItem();
item.code = "estoesunapruebadecs";
item.description = "Prueba de CyberSource";
item.name = "CyberSource";
item.sku = "prueba";
item.total_amount = 2000;
item.quantity = 1;
item.unit_price = 2000;
retail.retail_transaction_data.items.Add(item);
for (int i = 17; i < 35; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
retail.csmdds.Add(csmdds);
}
for (int i = 43; i < 101; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
retail.csmdds.Add(csmdds);
}
Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase Decidir\Data\Cybersource\Retail de la siguiente manera.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
PaymentResponse resultPaymentResponse = new PaymentResponse();
payment.fraud_detection = retail;
resultPaymentResponse = decidir.Payment(payment);
Los siguientes parámetros 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.
TicketingFraudDetection ticketing = new TicketingFraudDetection();
ticketing.channel = "Web/Mobile/Telefonica";
//bill_to
ticketing.bill_to.city = "Buenos Aires";
ticketing.bill_to.country = "AR";
ticketing.bill_to.customer_id = "useridprueba";
ticketing.bill_to.email = "[email protected]";
ticketing.bill_to.first_name = "nombre";
ticketing.bill_to.last_name = "apellido";
ticketing.bill_to.phone_number = "1512341234";
ticketing.bill_to.postal_code = "1427";
ticketing.bill_to.state = "BA";
ticketing.bill_to.street1 = "Cerrito 123";
ticketing.bill_to.street2 = "Mexico 123";
//purchase_totals
ticketing.purchase_totals.currency = "ARS";
ticketing.purchase_totals.amount = 2000;
//customer_in_site
ticketing.customer_in_site.days_in_site = 243;
ticketing.customer_in_site.is_guest = false;
ticketing.customer_in_site.password = "abracadabra";
ticketing.customer_in_site.num_of_transactions = 1;
ticketing.customer_in_site.cellphone_number = "12121";
ticketing.customer_in_site.date_of_birth = "129412";
ticketing.customer_in_site.street = "RIO 4041";
//ticketing_transaction_data
ticketing.ticketing_transaction_data.days_to_event = 55;
ticketing.ticketing_transaction_data.delivery_type = "Pick up";
CSItem item = new CSItem();
item.code = "estoesunapruebadecs";
item.description = "Prueba de CyberSource";
item.name = "CyberSource";
item.sku = "prueba";
item.total_amount = 2000;
item.quantity = 1;
item.unit_price = 2000;
ticketing.ticketing_transaction_data.items.Add(item);
ticketing.csmdds.Add(new Csmdds() { code = 12, description = "MDD12" });
for (int i = 14; i < 33; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
ticketing.csmdds.Add(csmdds);
}
for (int i = 43; i < 101; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
ticketing.csmdds.Add(csmdds);
}
Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase Decidir\Data\Cybersource\Ticketing de la siguiente manera.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
PaymentResponse resultPaymentResponse = new PaymentResponse();
payment.fraud_detection = ticketing;
resultPaymentResponse = decidir.Payment(payment);
Los siguientes parámetros 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.
DigitalGoodsFraudDetection digitalGoods = new DigitalGoodsFraudDetection();
digitalGoods.channel = "Web/Mobile/Telefonica";
//bill_to
digitalGoods.bill_to.city = "Buenos Aires";
digitalGoods.bill_to.country = "AR";
digitalGoods.bill_to.customer_id = "useridprueba";
digitalGoods.bill_to.email = "[email protected]";
digitalGoods.bill_to.first_name = "nombre";
digitalGoods.bill_to.last_name = "apellido";
digitalGoods.bill_to.phone_number = "1512341234";
digitalGoods.bill_to.postal_code = "1427";
digitalGoods.bill_to.state = "BA";
digitalGoods.bill_to.street1 = "Cerrito 123";
digitalGoods.bill_to.street2 = "Mexico 123";
//purchase_totals
digitalGoods.purchase_totals.currency = "ARS";
digitalGoods.purchase_totals.amount = 2000;
//customer_in_site
digitalGoods.customer_in_site.days_in_site = 243;
digitalGoods.customer_in_site.is_guest = false;
digitalGoods.customer_in_site.password = "abracadabra";
digitalGoods.customer_in_site.num_of_transactions = 1;
digitalGoods.customer_in_site.cellphone_number = "12121";
digitalGoods.customer_in_site.date_of_birth = "129412";
digitalGoods.customer_in_site.street = "RIO 4041";
//device_unique_id
digitalGoods.device_unique_id = "devicefingerprintid";
//digital_goods_transaction_data
digitalGoods.digital_goods_transaction_data.delivery_type = "Pick up";
CSItem item = new CSItem();
item.code = "estoesunapruebadecs";
item.description = "Prueba de CyberSource";
item.name = "CyberSource";
item.sku = "prueba";
item.total_amount = 2000;
item.quantity = 1;
item.unit_price = 2000;
digitalGoods.digital_goods_transaction_data.items.Add(item);
for (int i = 17; i < 35; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
digitalGoods.csmdds.Add(csmdds);
}
for (int i = 43; i < 101; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
digitalGoods.csmdds.Add(csmdds);
}
Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase Decidir\Data\Cybersource\Ticketing de la siguiente manera.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
PaymentResponse resultPaymentResponse = new PaymentResponse();
payment.fraud_detection = digitalGoods;
resultPaymentResponse = decidir.Payment(payment);
Los siguientes parámetros se deben enviar específicamente para la vertical Services. Además se deben enviar datos específicos de cada producto involucrado en la transacción.
ServicesFraudDetection services = new ServicesFraudDetection();
services.channel = "Web/Mobile/Telefonica";
//bill_to
services.bill_to.city = "Buenos Aires";
services.bill_to.country = "AR";
services.bill_to.customer_id = "useridprueba";
services.bill_to.email = "[email protected]";
services.bill_to.first_name = "nombre";
services.bill_to.last_name = "apellido";
services.bill_to.phone_number = "1512341234";
services.bill_to.postal_code = "1427";
services.bill_to.state = "BA";
services.bill_to.street1 = "Cerrito 123";
services.bill_to.street2 = "Mexico 123";
//purchase_totals
services.purchase_totals.currency = "ARS";
services.purchase_totals.amount = 2000;
//customer_in_site
services.customer_in_site.days_in_site = 243;
services.customer_in_site.is_guest = false;
services.customer_in_site.password = "abracadabra";
services.customer_in_site.num_of_transactions = 1;
services.customer_in_site.cellphone_number = "12121";
services.customer_in_site.date_of_birth = "129412";
services.customer_in_site.street = "RIO 4041";
//services_transaction_data
services.services_transaction_data.service_type = "tiposervicio";
services.services_transaction_data.reference_payment_service1 = "reference1";
services.services_transaction_data.reference_payment_service2 = "reference2";
services.services_transaction_data.reference_payment_service3 = "reference3";
CSItem item = new CSItem();
item.code = "estoesunapruebadecs";
item.description = "Prueba de CyberSource";
item.name = "CyberSource";
item.sku = "prueba";
item.total_amount = 2000;
item.quantity = 1;
item.unit_price = 2000;
services.services_transaction_data.items.Add(item);
for (int i = 17; i < 35; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
services.csmdds.Add(csmdds);
}
for (int i = 43; i < 101; i++)
{
Csmdds csmdds = new Csmdds();
csmdds.code = i;
csmdds.description = "MDD" + i.ToString();
services.csmdds.Add(csmdds);
}
Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase Decidir\Data\Cybersource\Ticketing de la siguiente manera.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
PaymentResponse resultPaymentResponse = new PaymentResponse();
payment.fraud_detection = services;
resultPaymentResponse = decidir.Payment(payment);
Los siguientes parámetros se deben enviar específicamente para la vertical Travel. Además se deben enviar datos específicos de cada producto involucrado en la transacción.
TravelFraudDetection travel = new TravelFraudDetection();
//bill_to
travel.bill_to.city = "Buenos Aires";
travel.bill_to.country = "AR";
travel.bill_to.customer_id = "useridprueba";
travel.bill_to.email = "[email protected]";
travel.bill_to.first_name = "nombre";
travel.bill_to.last_name = "apellido";
travel.bill_to.phone_number = "1512341234";
travel.bill_to.postal_code = "1427";
travel.bill_to.state = "BA";
travel.bill_to.street1 = "Cerrito 123";
travel.bill_to.street2 = "Mexico 123";
//purchase_totals
travel.purchase_totals.currency = "ARS";
travel.purchase_totals.amount = 2000;
//customer_in_site
travel.customer_in_site.days_in_site = 243;
travel.customer_in_site.is_guest = false;
travel.customer_in_site.password = "abracadabra";
travel.customer_in_site.num_of_transactions = 1;
travel.customer_in_site.cellphone_number = "12121";
travel.customer_in_site.date_of_birth = "129412";
travel.customer_in_site.street = "RIO 4041";
//travel_transaction_data
travel.travel_transaction_data.reservation_code = "GJH784";
travel.travel_transaction_data.third_party_booking = false;
travel.travel_transaction_data.departure_city = "EZE";
travel.travel_transaction_data.final_destination_city = "HND";
travel.travel_transaction_data.international_flight = true;
travel.travel_transaction_data.frequent_flier_number = "00000123";
travel.travel_transaction_data.class_of_service = "class";
travel.travel_transaction_data.day_of_week_of_flight = 2;
travel.travel_transaction_data.week_of_year_of_flight = 5;
travel.travel_transaction_data.airline_code = "AA";
travel.travel_transaction_data.code_share = "SKYTEAM";
//>>>>>>>>>>>>>>>>>>>>>>>
DepartureDate depDate = new DepartureDate();
depDate.departure_time = "2017-05-30T09:00Z";
depDate.departure_zone = "GMT-0300";
DecisionManagerTravel decManager = new DecisionManagerTravel();
decManager.complete_route = "EZE-LAX:LAX-HND";
decManager.journey_type = "one way";
decManager.departureDate.Add(depDate);
travel.travel_transaction_data.managerTravel.Add(decManager);
//>>>>>>>>>>>>>>>>>>>>>>>
Passengers passenger = new Passengers();
passenger.email = "[email protected]";
passenger.first_name = "Juan";
passenger.last_name = "Perez";
passenger.passport_id = "412314851231"
passenger.phone = "541134356768"
passenger.passenger_status = "gold";
passenger.passenger_type = "ADT";
travel.travel_transaction_data.passengers.Add(passenger);
//>>>>>>>>>>>>>>>>>>>>>>>
travel.travel_transaction_data.airline_number_of_passengers = 1;
Para incorporar estos datos en el requerimiento inicial, se debe instanciar un objeto de la clase Decidir\Data\Cybersource\Travel de la siguiente manera.
string privateApiKey = "92b71cf711ca41f78362a7134f87ff65";
string publicApiKey = "e9cdb99fff374b5f91da4480c8dca741";
//Para el ambiente de desarrollo
DecidirConnector decidir = new DecidirConnector(Ambiente.AMBIENTE_SANDBOX, privateApiKey, publicApiKey);
Payment payment = new Payment();
PaymentResponse resultPaymentResponse = new PaymentResponse();
payment.fraud_detection = travel;
resultPaymentResponse = decidir.Payment(payment);
- 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 |