# Introducción

\
Plexo ofrece a los e-commerce la posibilidad de pagar con todos los medios de pago disponibles en el País. Facilita la utilización de estos medios de pago, permitiendo desacoplar toda complejidad asociada a la integración con cada uno de ellos en una sola.

#### Definición de actores <a href="#toc68768094" id="toc68768094"></a>

**Usuario** - El posible comprador que está navegando la tienda online. Puede ser usuario por primera vez, registrado o anónimo

**Comercio** - La tienda online que está por realizar la venta

**Plexo** - Quien intermedia entre el Comercio y los Medios de pago para simplificar esta gestión

**Medio de pago** - Tarjetas, bancos, prepagas, etc

**Flujo**

<figure><img src="/files/QbEFqVH6pJRbHDvBQgBi" alt=""><figcaption></figcaption></figure>

#### Cómo funciona <a href="#toc68768096" id="toc68768096"></a>

Plexo provee una serie de servicios REST con intercambio de mensajes en formato JSON (Content-Type: application/json) y una página WEB que puede ser embebida en el e-commerce, brindando a sus clientes una experiencia de pago mejorada, pudiendo solicitar los datos de tarjeta "como si estuviera" en el propio e-commerce.&#x20;

## PCI-DSS

Nuestros servicios cuentan con certificación **PCI-DSS**, la cual nos permite almacenar y procesar los números de tarjeta y otros datos sensibles del cliente.

A través de nuestro formulario de captura de datos sensibles, diseñado para poder ser embebido en el e-commerce o APPs, su comercio puede aceptar pagos sin que sus servidores reciban los datos confidenciales del cliente, dándole seguridad a la operación y facilidad de uso.

### Interacción entre sistemas <a href="#toc38633217" id="toc38633217"></a>

En el siguiente diagrama se muestra cómo interactúan los diferentes sistemas en la solución. Para el usuario final es totalmente transparente y todo ocurre dentro del sitio Web (o APP) del comercio, nunca es redirigido a otra página web a seleccionar o registrar un medio de pago. Para ello Plexo provee de una página Web que es embebida en la del comercio.

La comunicación entre el servidor del comercio y el de Plexo se puede establecer de dos formas distintas: Webservices o con un Cliente SDK.

<figure><img src="/files/F0MwoC6Tv0lXYSgNjsJW" alt=""><figcaption></figcaption></figure>


# Servicios

El principal servicio de Plexo es la tokenización (almacenamiento) de medios de pago siguiendo los estándares de seguridad de PCI DSS, que serán utilizados luego para realizar autorizaciones de pagos para la compra de bienes o servicios de los clientes.

Se cuenta luego con una cantidad de servicios complementarios (ver seccion ***Interacción***) para la administracion de comercios y medios de pago habilitados para cada e-commerce, asi como para la realización de devoluciones y otras operaciones de pago secundarias, consultas sobre transacciones realizadas, etc.

Todos los servicios disponibles se pueden ver en la siguiente URL: <https://github.com/plexouy/Plexo.Models/blob/master/ISecurePaymentGateway.cs>


# Selección y uso de medios de pago

Plexo permite tokenizar (el token representa un medio de pago) aquellos medios de pago que asi lo permiten, como ser principalmente tarjetas de Crédito, Débito o Prepagas. La forma de registrar o seleccionar un medio de pago, se describe en los puntos 1, 2 y 3.

El primer paso es solicitar una sesión mediante el servicio de **Autorización**, con la URL obtenida se abre la Web de Plexo donde el usuario registra o selecciona un medio de pago ya registrado y mediante un servicio de **callback** se envía el token asociado al mismo.

El e-commerce puede optar por guardar este token para ser ofrecido en compras posteriores a su cliente o solicitarlo cada vez a Plexo con el servicio de Autorización y que el cliente seleccione que medio de pago va a utilizar para la compra, o registrar uno nuevo.


# Antes de comenzar

Para poder comenzar con la integración de Plexo, se debe solicitar al área de Soporte las credenciales para poder acceder. Estas credenciales son un nombre de cliente (ClientName) y un certificado .PFX el cual esta asociado al cliente y se utilizara para firmar los mensajes JSON,  utilizando la clave provada de dicho certificado.

El e-commerce debe proveer a Plexo de una URL a donde Plexo enviara los tokens que sean registrados, para que el e-commerce los administre a su gusto. Estos tokens pueden ser almacenados para que los usuarios no deban ingresar nuevamente una tarjeta de Crédito ya utilizada en la plataforma.

Se recomienda comenzar dando de alta un comercio y configurar al menos un medio de pago (solicitar a Soporte datos de prueba) para poder comenzar con la integracion. Ver punto **7 Alta, Baja y Modificaciones de comercios**. El Alta de comercio es uno de los mensajes más simples, y ya se puede validar el firmado de mensajes utilizando el certificado provisto. Tenes al menos un comercio configurado con un medio de pago, es necesario para luego comenzar a probar la integración del servicio de **Autorización**.


# Interacción

En la versión 4.0 se incorpora una nueva WEB con mayores funcionalidades y una interfaz más moderna. También hay nuevas funcionalidades como la posibilidad de separar requerimientos de distintos medios de pagos según el emisor, y nuevos medios de pago como débito bancario y solicitudes de crédito.

Especificación de endpoint:

<https://github.com/plexouy/Plexo.Models/blob/master/ISecurePaymentGateway.cs>


# Diagrama de secuencia

Aqui se muestra la interacción entre el e-commerce y Plexo para el punto 1 (Autorización) y 2 (mostrar Web).

<figure><img src="/files/zdSSQq8MurBnTE8Ej3rP" alt=""><figcaption></figcaption></figure>


# 1. Autorización

El llamado a este servicio WEB se hace desde el servidor del comercio y es el primer paso para interactuar con Plexo, obteniendo como resultado una sesión de usuario. Autorización enviada como objeto

El llamado a este servicio REST se hace desde el servidor del comercio y como resultado se obtiene una sesión de usuario para interactuar con la Web de Plexo, cuyo layout y comportamiento se basará en las opciones que se especifiquen en la invocación.

* **Se hará un post a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Auth>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto [Authorization](https://github.com/plexouy/Plexo.Models/blob/master/Authorization.cs)

* **Campos de una autorización**

Los campos **requeridos** se detallan a continuación:

* [ ] **AuthorizationType**

  Anonymous si no quiere dejar registro de usuario (el token se borra en 24 hrs) y sino por OAuth o ClientReference (se guarda referencia al usuario).
* [ ] **MetaReference**

  Si el AuthorizationType no es Anonymous, debe pasarse en este campo una referencia - ejemplo una casilla de correo - para que Plexo guarde una referencia a dicho usuario.
* [ ] **ActionType (flags)**

  ○     SelectInstrument

  Es solamente para seleccionar los medios de pago previamente registrados por el cliente.

  ○     RegisterInstrument

  Si se envía, da la opción de solamente poder registrar un nuevo medio de pago.

  ○     DeleteInstrument

  Si se envía, en la lista de medios de pago disponibles se habilita la opción de borrar.
* [ ] **RedirectUri**

  URL donde se va a redirigir al cliente web luego de finalizar el caso de uso.

Los campos **opcionales** se detallan a continuación:

* [ ] **OptionalMetadata**

  En este campo se puede guardar cualquier información que se quiera recibir en el callback y evitar mantenerlo en sesión.
* [ ] **OptionalCommerceId**

  Este campo es mandatorio para quienes son multicomercio, donde se debe especificar el ID del comercio que está operando. Para quienes solo utilizan un comercio, pueden obviar el envío de este campo, pero deben definir un comercio por defecto (se especifica más adelante).
* [ ] **ClientInformation**

  Es un diccionario de datos que se guarda en la base de datos para uso futuro. La idea es guardar datos para autocompletar formularios, donde se solicite por ejemplo el email, dirección, número y tipo de documento, etc. Los valores se definen en[ ](https://github.com/plexouy/Plexo.Models/blob/master/FieldType.cs)

{% embed url="<https://github.com/plexouy/Plexo.Models/blob/master/FieldType.cs>" %}

* [ ] **LimitIssuers**

  Si se envía, se despliega solamente la lista de medios de pago indicados en este campo (4=MasterCard, 11=VISA, 15=OCA. Solicitar la lista en el método ISecurePaymentGateway.GetSupportedIssuers(ClientSignedRequest creq)).

  La Web de Plexo se encarga de solicitar el valor del CVC si la tarjeta que está ingresando el usuario es de este banco y lo guarda por unos segundos para evitar que el cliente vuelva a ingresar el valor si va a realizar la compra inmediatamente después de registrar su tarjeta.
* [ ] **ExtendedBINInformation**                                                                                                                                          Es un nuevo parámetro opcional para obtener por separado el BIN de la tarjeta registrada. Debido a la nueva especificación de BINes de 8 dígitos, se agrega esta funcionalidad para obtener este dato en el InstrumentCallback, donde se recibirá el valor en OptionalBIN dentro de OptionalMetadata.
* [ ] **WebFormSettings**

  Estas es una nueva funcionalidad de la versión 4.2, donde se permite hacer ciertas configuraciones en el formato de la Web de Plexo. Se puede cambiar el color primario, secundario y de fondo, así como el tema, logo, pie, titulo, etc.

<figure><img src="/files/w4nWx4mdDabCqNMfF2GH" alt=""><figcaption></figcaption></figure>

Ver en los Modelos de Plexo la especificación de WebFormSettings en

{% embed url="<https://github.com/plexouy/Plexo.Models/blob/master/WebFormSettingsDto.cs>" %}

Como ejemplo:

```
WebFormSettingsDto webSettings = new WebFormSettingsDto();
UIOptionsDto uiOptions = new UIOptionsDto();
TokenizationSettingsDto tokenizDto = new TokenizationSettingsDto();
DisplayOptionsDto displayDto = new DisplayOptionsDto();
Map<String, String> colours = new HashMap<>();
colours.put("Primary","#000080");
colours.put("Secondary","#008080");
colours.put("Background","#C0C0C0");
uiOptions.setColors(colours);
uiOptions.setAutoDarkTheme(true);
uiOptions.setTheme("dark");
uiOptions.setLogoURL("https://via.placeholder.com/196x64.png?text=MiComercio");
webSettings.setuI(uiOptions);
displayDto.setAccessibility(true);
displayDto.setDetails(true);
displayDto.setFooter(false);
displayDto.setLogo(true);
displayDto.setTitles(false);
```

<figure><img src="/files/WeDbTKPvlK1r85tnGEwp" alt=""><figcaption></figcaption></figure>

Como resultado se obtendrá un ID de sesión (\*) en formato string que se usará en el siguiente paso.


# 2. Mostrar WEB

Luego de obtener el SessionId, se inicia el proceso de registro o selección de un medio de pago. Para ello se despliega desde el sitio del cliente la página WEB que provee la solución (<https://web.testing.plexo.com.uy/sessionid>), típicamente embebida en un iFrame u objeto similar.

Cuando el usuario del sistema termina de interactuar con esta página WEB, se genera un callback hacia el servidor del cliente, donde se recibe entre otros parámetros el token que identifica al medio de pago seleccionado.

Se enviará un POST firmado con un objeto [IntrumentCallback](https://github.com/plexouy/Plexo.Models/blob/master/IntrumentCallback.cs) (REST, se debe proveer URL) en formato JSON, donde fundamentalmente tendrán:

* **SessionId (\*)** Con lo que identificarán al usuario
* **PaymentInstrument** Que a su vez tiene:

  · InstrumentToken (el token para pagar).

  · Información como su expiración, su nombre fantasía, información sobre el medio de pago en sí (si proviene de Visa, Oca, Master, etc.), lista de requerimientos adicionales (si solicita CVC, etc).

Como respuesta al POST del Callback, se envia un objeto ClientSignedResponse en formato JSON firmado que contiene un [ResultCode](https://github.com/plexouy/Plexo.Models/blob/master/ResultCodes.cs) y un mensaje de error (string) definido por el cliente.

Ante la respuesta de recibido por parte del servidor del cliente, la página WEB hace un redirect a la URL especificada en el paso de Autorización (RedirectUri). Esto se hace para que el cliente tome el control de la situación y se dé por enterado de que la interacción con el cliente finaliza, y que ya está en su poder una un token para poder efectuar el pago.


# 3. Realizar pago

Como último paso se puede optar por realizar el pago con el token obtenido en el momento y finalizar el proceso, y en forma opcional también guardar el token devuelto (solo para usuarios identificados, no válido para usuario anónimos) para hacer compras futuras con ese medio de pago registrado para el cliente.

* **Para el caso del pago, se hará un POST a:**&#x20;

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Purchase>" %}

Firmado como todos los demás paquetes con la versión JSON del objeto [PaymentRequest](https://github.com/plexouy/Plexo.Models/blob/master/PaymentRequest.cs), que deberá contener:

* [ ] **ClientReferenceId**

  Referencia de la transacción para trazabilidad de vuestro lado (string, máximo 128 caracteres)
* [ ] **CurrencyId**

  Código de moneda de la compra (1-Peso, 2-Dolar)
* [ ] **FinancialInclusion**

  Campo para enviar información sobre la Ley de Inclusión Financiera, que contiene:

  ○     **BilledAmount**: monto total de la compra con impuestos

  ○     **InvoiceNumbe**: número de factura

  ○     **TaxedAmount**: monto neto de la venta que lleva impuestos

  ○     **Type**: tipo de Ley que aplica: 0-No aplica, 1-Ley 17934, 6-Ley 19210.
* [ ] ○     **VATAmount** (\*Opcional): monto que corresponde a los impuestos de la venta
* [ ] **Installments**

  Cantidad de cuotas
* [ ] **Items**

  Es una lista con los ítems de la compra, que contiene los siguientes campos:

  ○     **Amount** : monto del item

  ○     **ClientItemReferenceId** : ID del item (string, máximo 200 caracteres)

  No se puede especificar la moneda para cada ítem, se asume que es para todos la misma que se especificó en el campo CurrencyId.
* [ ] **PaymentInstrumentInput**

  Contiene fundamentalmente el InstrumentToken y una lista de valores opcionales (como el CCV, si es requerido) que deben mandarse según los requerimientos del proveedor de medio de pago. Para la etapa de testing esto no es importante.
* [ ] **OptionalCommerceId**&#x20;

  Cada cliente debe configurar sus comercios por cada medio de pago (**y** **definir uno por defecto**), pero hay casos donde el comercio es una plataforma que ofrece servicios a múltiples comercios (o no definió uno por defecto). Para especificar a qué comercio se le debe adjudicar la transacción, se utiliza este campo opcional.

  **IMPORTANTE**: Tener en cuenta que es ***solo opcional si ya tienes un comercio dado de alta y configurado por defecto***. Si no, antes de intentar un pago, hay que definir un comercio, hacer el alta, setearlo por defecto y luego configurarle los medios de pago. Dar alta a un comercio
* [ ] **LoyaltyProgramAmount** (\*Opcional)

  Nuevo campo opcional para el pago con productos de afinidad, como por ejemplo Metros de OCA. En este campo se envía la cantidad de metros a utilizar como forma de pago.
* [ ] **OptionalInstrumentFields** (\*Opcional)

  Algunos medios de pago, pueden requerir información adicional en las transacciones, como es el caso específico de VISA.
* [ ] **CommerceReserveExpirationInSeconds** (\*Opcional)                                                                             Para el caso de pagos asincrínicos, se puede modificar el tiempo de expiración por defecto (24 hrs) mediante este parámetro. Si se quiere esperar solamente que un cliente realice un pago con débito bancario en 30 minutos, entonces se debe enviar el valor 1800 (segundos).
* [ ] **ThreeDSReferenceId** (\*Opcional)                                                                                                                            Es un parametro para enviar el ClientReferenceId que se utilizo en caso de querer validar la compra con 3DSecure (ver punto 15. Autenticación 3DSecure).

{% embed url="<https://github.com/plexouy/Plexo.Models/blob/master/FieldType.cs>" %}

**El campo CybersourceDeviceFingerprint es mandatorio para todas las transacciones con VISA (por Totalnet) y cuya implementación se detalla más adelante.**

Se obtendrá como respuesta la versión en JSON de un objeto Transaction con la información de la transacción realizada

**IMPORTANTE**: Hay que tener importante cuidado en el manejo de los campos de tipo “decimal” en Objetos como Item.Amount o FinancialInclusion.BilledAmount donde por motivos de deserialización JSON del lado del servidor, los valores enteros deben venir siempre con un formato “#.0” que indique un número decimal. Es decir, si pretendemos enviar un valor de 300, debe generarse como 300.0 antes de generar la firma y ser enviado (el punto como separador de decimales).

**DeviceFingerprint para VISA y MasterCard (adquirencia de Totalnet u OCA)**

Para estos casos se solicita la implementación de la captura del DeviceFingerprint en cada transacción obligatoriamente, información que se utiliza en los sistemas de control de fraude.

Antes de hacer una invocación a Plexo con el token del medio de pago, desde la Web o APP de e-commerce deben primero obtener el DeviceFingerprint del dispositivo del usuario final (un script en la Web, o API desde una APP).

La URL es <https://h.online-metrix.net/fp/tags.js?org\\_id=**IdEnvironment**\\&session\\_id=**IdComercio>\*\* **IdInvocacion** donde:

* **IdEnvironment**: donde se debe utilizar **45ssiuz3** para test y **9ozphlqx** para producción.
* **IdComercio**: en el caso de VISA es el ID del comercio para el cual se va a hacer la transacción. Si es MasterCard procesado por OCA se utiliza **oca\_plexo**.
* **IdInvocacion**: es un ID que tiene que ser único por invocación. Se recomienda utilizar el mismo ID de la transacción de pago (idealmente un GUID, máximo 36 caracteres).

Agregar Script de invocación a la Web de e-commerce:

```html
<head>
 <script type="text/javascript" 
 src="https://h.online-metrix.net/fp/tags.js?org_id=45ssiuz3&session_id=visanetuy_px_1234TRX2157"></script>
</head>

<body>
 <noscript>
 <iframe style="width: 100px; height: 100px; border: 0; position: absolute; top: -5000px;" 
 src="https://h.online-metrix.net/fp/tags?org_id=45ssiuz3&session_id=visanetuy_px_1234TRX2157"></iframe>
 </noscript>
</body>

```

En este ejemplo, se ejecuta este Script en el e-commerce del cliente antes de invocar a Plexo, para el comercio “visanetuy\_px\_1234” (oca\_plexo en caso de Master vía OCA) y con un ID “TRX2157”. Luego en el momento de invocar a Plexo, se envía en el campo opcional CybersourceDeviceFingerprint el valor TRX2157.

En el caso de requerir implementar esto para una APP, se puede ver la guia de integracion [aqui](https://drive.google.com/file/d/1btIGIeglWsRRNZLghTHLY0XOLS7Fjjsa/view?usp=sharing). Para descargar SDK de IOS haga click [aqui ](https://drive.google.com/file/d/1FSdnBOSyaxAx8dKib37URYxhcsz1Zgyl/view?usp=sharing)y para Android [aqui](https://drive.google.com/file/d/1gcwiAs-NEfbue8eRLKzTZZR7V2bVXA2x/view?usp=sharing).


# 3.1. Pagos recurrentes

Los pagos recurrentes se realizan sin el tarjetahabiente presente. Dependiendo del procesador, la instancia de alta de servicio y cargo posterior puede variar.

### **Procesadores Totalnet / Fiserv**

En el caso de pagos de servicios por recurrencia, se debe enviar un parámetro más para que los procesadores de **Totalnet o Fiserv** no rechacen las transacciones por antifraude al repetir el mismo DeviceFingerprint, y/o asocie la transacción de Alta con las siguientes de pago de recurrecia.

Para este caso se agregan dos campos opcionales:

* **RecurringPayment:** este campo es un nuevo FieldType que se envía dentro de OptionalInstrumentFields con el valor “true” para el “ALTA” del servicio. Se debe guardar el valor de ExtendedResponse dentro de TransactionResultText.
* **Plan:** luego del proceso de Alta, al siguiente movimiento de cobro se debe volver a enviar RecurringPayment = true y Plan=valor de ExtendedResponse obtenido en el Alta previa (**Totalnet**) o el mismo ExternalId que se envio en el Alta (**Fiserv**).

Entonces el procedimiento es el siguiente:

1. Para especificar que se trata de un servicio de RECURRENCIA, en el primer movimiento de ALTA del servicio donde se registra la tarjeta, se debe agregar el campo opcional **FieldType.RecurringPayment = "true"**.
2. Para el caso de operar con **Totalnet**, de la respuesta (en el Callback), se debe guardar el valor de **ExtendedResponse** dentro de **TransactionResultText** (ej: "TransactionResultText":"Operacion Aprobada - RRN: 5813575255396483804011 AuthorizationCode: 831000 ExtendedResponse: <mark style="background-color:yellow;">016153570198200</mark>" para enviar en las siguientes transacciones recurrentes de esa tarjeta.
3. Si se esta operando con **Totalnet**, al ejecutar los cobros recurrentes siguientes, deben enviar adicionalmente dos campos opcionales: **FieldType.RecurringPayment = "true"** y **FieldType.Plan = "**<mark style="background-color:yellow;">**016153570198200**</mark>**"** donde **Plan** contiene el valor devuelto por ExtendedResponse en el alta del servicio. Si estamos utilizando adquirencia de **Fiserv**, entonces en **Plan** se debe enviar el mismo ExternalID que se utilizo en la primer transacción de Alta del servicio.

De esta manera el procesador **Totalnet o Fiserv** saben que se trata de un servicio de Recurrencia y con el dato enviado en Plan asocia el servicio de recurrencia especificado en el Alta.

### **Procesador OCA**

En el caso de OCA, hay una variante con respecto a los otros procesadores ya que se utilizan terminales específicas de recurrencia.

Para este caso se utiliza solamente un campo opcional:

* **RecurringPayment:** este campo se utiliza para el "ALTA" y los cargos recurrentes. El "ALTA" inicial se procesa como un pago normal, donde debe enviarse el DeviceFingerprint y el CVV de la tarjeta que se va a utilizar.

Entonces el procedimiento es el siguiente:

1. Para el ALTA del servicio se envía un pago normal con todos los campos necesarios y adicionalmente el campo opcional **FieldType.RecurringPayment = "first"**. El valor "**first**" especifica que se trata del alta del servicio y se validara el CVV y ejecutar el servicio antifraude correspondiente.
2. Al ejecutar los cobros recurrentes siguientes, deben enviar adicionalmente el campo opcional **FieldType.RecurringPayment = "true"**, donde el comercio debe tener configurada una terminal de recurrencia provista por OCA para poder aceptar el pago sin el CVV ni el DeviceFingerprint.


# 4. Cancelar una compra

En caso de querer cancelar un pago realizado, se utiliza este método. Por el momento no se cuenta con la opción de cancelación parcial, por lo que la devolución del dinero es total.

**Para el caso de la cancelación, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Cancel>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CancelRequest**, que deberá contener:

* **ReferenceType**

  Es un enumerador que especifica el tipo de identificador de la transacción original al que hace referencia la cancelación. Puede ser por el identificador generado por Plexo o el enviado por el cliente.
* **ClientReferenceId**

  Contiene el identificador de la transacción de cancelación del cliente.
* **MetaReference**

  Contiene el identificador de la transacción original que se desea cancelar, el cual puede ser el devuelto por Plexo o el enviado por el cliente según el **ReferenceType** seleccionado.


# 5. Consultar estado

En caso de querer consultar el estado de una transacción, se utiliza este método.

**Para el caso de la consulta de una transacción, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Status>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto Reference, que deberá contener:

* **ReferenceType**

  Es un enumerador que especifica el tipo de identificador de la transacción original al que hace referencia la consulta.
* **MetaReference**

  Contiene el identificador de la transacción original que se desea consultar.


# 6. ExpressCheckout

ExpressCheckout es un nuevo servicio que se introduce en la versión 4.0 de Plexo, y que permite realizar en un solo paso el registro o selección de medio de pago, y la solicitud de compra. Este servicio es opcional para ser utilizado con los medios de pago tradicional (tarjetas y redes de cobranza), pero es la única forma de acceder a pagar con:

* Banred
* Débito bancario
* Solicitud de Crédito

**Para el caso del pago, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/ExpressCheckout>" %}

Firmado como todos los demás paquetes con la versión JSON del objeto [**ExpressCheckoutRequest**](https://github.com/plexouy/Plexo.Models/blob/master/ExpressCheckoutRequest.cs), que contiene lo que hoy se envía en los puntos 1 (Authorization) y 3 (PaymentRequest) en un servicio que los nuclea.

En particular, en este caso el **Authorization.ActionType** debe enviar el **Flag ExpressCheckout (64)**.

También, se agrega información extra a ser enviada en **Items** dentro del **PaymentRequest**, donde se agrega información que se despliega en pantalla

* **Quantity** : cantidad de artículos.
* **Name** : nombre del artículo.
* **Description** : descripción del artículo.

Como en este caso no se cuenta con un Token a ser enviado en el **PaymentRequest**, el campo **PaymentInstrumentInput.InstrumentToken** se puede obviar.

La pantalla que se despliega es la siguiente

<figure><img src="/files/CbK4TavFRVQdmhBVinol" alt=""><figcaption></figcaption></figure>

A la izquierda se despliegan todas las formas de pago habilitadas para el comercio, y a la derecha la descripción de lo que se va a pagar (con la información que se agrega en Items).

Tener en cuenta el parametro **CommerceReserveExpirationInSeconds** (\*Opcional) que para el caso de pagos asincrínicos, se puede modificar el tiempo de expiración por defecto (24 hrs) mediante el mismo. Si se quiere esperar solamente que un cliente realice un pago con débito bancario en 30 minutos, entonces se debe enviar el valor 1800 (segundos).

Para los pagos con Débito Bancario, en la configuración del Comercio/Issuer, se debe indicar los Bancos aceptados, y en el llamado a ExpressCheckout indicar el o los Bancos a mostrar en la selección de “Transferencia bancaria online”. En este caso se indico con el parámetro LimitIssuers al banco Itau (ID 52) y Santander (ID 54).  La lista de bancos disponibles en el momento es la siguiente:

<figure><img src="/files/a1DN8OvBvYrL3UI9XNxv" alt=""><figcaption></figcaption></figure>

En caso de utilizar ExpressCheckout para pagos online, como las tarjetas de crédito/débito, se debe configurar previamente para cada Comercio/Issuer (medio de pago) las cuotas que son aceptadas. De esta forma, a la hora de seleccionar una tarjeta de crédito, se desplegará una pantalla de selección de cuotas que fue cargado previamente. De todas formas, la seccion de **PaymentRequest** permite indicar por parámetro las cuotas para no dar opcion de que el cliente pueda elegirlas en la Web de Plexo (en este caso no se da la opcion a que pueda seleccionase de la lista).&#x20;

Para el caso que de desee desactivar la validacion 3DS en el pago con tarjetas VISA/MASTER, se debe enviar el parametro opcional **Disable3DS = true.**

<figure><img src="/files/f29ooANBQA4S1pCZTbcB" alt=""><figcaption></figcaption></figure>

Como resultado, se recibe un **Callback** (opcional) en el caso de que el medio de pago se registre y sea recordado para el cliente, y un **TransactionCallback** (obligatorio) con el resultado de la transacción.

Este objeto **TransactionCallback** es el mismo objeto que se utiliza para los pagos en redes de cobranza, donde los pagos son asincrónicos:

{% embed url="<https://github.com/plexouy/Plexo.Models/blob/master/TransactionCallback.cs>" %}


# 7. Alta, Baja y Modificaciones de comercios

Para aquellos clientes que son una plataforma que maneja múltiples comercios, la nueva versión de Plexo agrega la posibilidad de configurar el o los comercios que necesite.

**Para el caso de ALTA, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Add>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceRequest**, que deberá contener el nombre.

**Para el caso de MODIFICACIÓN, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Modify>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceModifyRequest**, que deberá contener el identificador del comercio y el nuevo nombre a configurar.

**Para el caso de BAJA, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Delete>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceIdRequest**, que deberá contener el identificador del comercio a eliminar.

**Para configurar el comercio por defecto, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/SetDefault>" %}

Es importante definir un comercio por defecto, en caso contrario el campo opcional **OptionalCommerceId** deberá ser enviado **SIEMPRE**.

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceIdRequest**, que deberá contener el identificador del comercio a configurar por defecto.

**Para obtener la lista de medios de pago soportados por el comercio, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Issuer>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceIdRequest**, que deberá contener el identificador del comercio.

Como respuesta se obtiene una lista de los medios de pago soportados representado en objetos **IssuerData** que contiene:

* **IssuerId y CommerceId**

  Son los identificadores de Medio de Pago y Comercio.
* **FieldType**

  Se muestran dentro de un diccionario de datos.

**Para configurar el medio de pago de un comercio, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Issuer/Add>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto IssuerData, que deberá contener:

* **IssuerId y CommerceId**

  Son los identificadores de Medio de Pago y Comercio.
* **FieldType**

  Dentro de un diccionario de datos, y dependiendo de los requerimientos de cada medio de pago, se especifican los datos necesarios, como ser el código de comercio. Los datos necesarios se obtienen de la consulta de medios de pago en <https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Issuer> a través del objeto **FieldInfo**.

En caso de utilizar **ExpressCheckout** para pagos con tarjetas, se debe configurar las cuotas aceptadas con el FieldType **CommerceIssuerInstallments** separado por comas: “1,3,6,9,12”. Para los Débitos Bancarios se debe especificar el ID de Bancos aceptados con el FieldType **AvailableBanks** separado por comas: “113,137”

Si se envían datos sobre un IssuerId y CommerceId ya existentes, se hace un UPDATE con los nuevos datos enviados.

**Para eliminar un comercio con medio de pago, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Issuer/Delete>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **CommerceIssuerIdRequest**, que contiene el identificador del medio de pago y del comercio a dar de baja.


# 8. Multiadquirencia y Facilitadores de pago

Plexo cuenta con la posibilidad de hacer configuraciones específicas para Clientes o Comercios que quieran utilizar un Facilitador de Pago (como por ej. Handy) o cambiar de procesador de pago con la nueva Multiadquirencia.

Para ello, se han incorporado nuevos FieldType que permiten realizar esta configuración en el servicio.

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Commerce/Issuer/Add>" %}

* **Facilitadores de Pago**

  Se deben incluir dos nuevos parámetros: **PaymentFacilitatorId** y **PaymentFacilitatorCommerceId**. Se le debe solicitar a su Facilitador de Pago los valores correspondientes a su configuración.

  A partir del momento en que esto queda configurado, las transacciones del medio de pago serán procesadas y liquidadas a la configuración y código de comercio del Facilitador de Pago. Para volver atrás, se vuelven a enviar estos parámetros, pero con datos vacíos.
* **Multiadquirencia**

  Con la nueva posibilidad de Multiadquirencia, puede cambiar en cualquier momento su procesador de pago.

  Para ello está el nuevo FieldType **PaymentProcessorId**, que recibe un ID (solicitar el valor a Plexo) según el procesador que desea configurar. Para volver a dejar la configuración por defecto, debe volver a enviar este parámetro con datos vacíos.


# 9. Consulta de medios de pagos disponibles

Para ver los medios de pago disponibles para el Cliente y los diferentes requerimientos que tienen, Plexo brinda un servicio web que permite obtener toda esta información.

**Para el caso de consultar medios de pago habilitados, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Issuer>" %}

Firmado solamente con la versión JSON del objeto **ClientSignedRequest**. En la respuesta, para cada medio de pago habilitado se especifican los campos requeridos en el valor de Fields. Esta información sirve para el alta de medios de pago por comercio, y saber que valores se deben especificar.

```json
{ "Object": {
"Fingerprint": "AEA4D5C586983A140F8B566EA81901E8BD8F8C9F",
"Object": {
"Response": [
{
"Fields": [
{
"FieldType": 2049,
"LabelName": "Numero de Comercio",
"Required": true
},
{
"FieldType": 2054,
"LabelName": "Sucursal",
"Required": true
},
{
"FieldType": 2053,
"LabelName": "Nro comerciante",
"Required": true
}
],
"Id": "11",
"ImageUrl": "https://testing.plexo.com.uy/images/instruments/11.png",
"Issuer": "Visa",
"IssuerId": 11,
"MayHaveAsyncPayments": false,
"MayHavePaymentsLimits": false,
"SupportsReserve": false,
"VariationId": 0
},
{
"Fields": [
{
"FieldType": 2049,
"LabelName": "Numero de Comercio",
"Required": true
},
{
"FieldType": 2051,
"LabelName": "Numero de Terminal",
"Required": true
}
],
"Id": "15",
"ImageUrl": "https://testing.plexo.com.uy/images/instruments/15.png",
"Issuer": "Oca",
"IssuerId": 15,
"MayHaveAsyncPayments": false,
"MayHavePaymentsLimits": false,
"SupportsReserve": false,
"VariationId": 0
},
{
"Fields": [
{
"FieldType": 2049,
"LabelName": "Numero de Comercio",
"Required": true
}
],
"Id": "19",
"ImageUrl": "https://testing.plexo.com.uy/images/instruments/19.png",
"Issuer": "Midinero2",
"IssuerId": 19,
"MayHaveAsyncPayments": false,
"MayHavePaymentsLimits": false,
"SupportsReserve": false,
"VariationId": 0
}
],
"ResultCode": 0
},
"UTCUnixTimeExpiration": 1524231569
},
"Signature": "KpgEaMXGZRTq...IrPE="
}

```


# 10. Devolución

Es una nueva funcionalidad que permite una devolución parcial del dinero de la compra original. Por el momento solamente las compras realizadas con tarjetas VISA, MasterCard, Diners y Lider permiten esta operación.

**Para el caso de la devolución, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Refund>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **RefundRequest**, que deberá contener:

* **ReferenceType**

  Es un enumerador que especifica el tipo de identificador de la transacción original al que hace referencia la cancelación. Puede ser por el identificador generado por Plexo o el enviado por el cliente.
* **ClientReferenceId**

  Contiene el identificador de la transacción de devolución del cliente.
* **MetaReference**

  Contiene el identificador de la transacción original que se desea devolver, el cual puede ser el originado por Plexo o el enviado por el cliente según el ReferenceType seleccionado.
* **Amount**

  Es el monto a devolver, y tiene que ser menor o igual al monto de la transacción original.


# 11. Devoluciones múltiples

Para los medios de pago que lo soportan (VISA, OCA, MasterCard)

Es una nueva funcionalidad que permite hacer más de una devolución parcial del dinero de la compra original.&#x20;

**Para el caso de la devolución, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Refundv2>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **RefundRequest**, que deberá contener:

* **ReferenceType**

  Es un enumerador que especifica el tipo de identificador de la transacción original al que hace referencia la cancelación. Puede ser por el identificador generado por Plexo o el enviado por el cliente.
* **ClientReferenceId**

  Contiene el identificador de la transacción de devolución del cliente.
* **MetaReference**

  Contiene el identificador de la transacción original que se desea devolver, el cual puede ser el originado por Plexo o el enviado por el cliente según el ReferenceType seleccionado.
* **Amount**

  Es el monto a devolver, y tiene que ser menor o igual al monto de la transacción original.


# 12. Reserva

Es una nueva funcionalidad que permite un movimiento de reserva de dinero para luego hacer una captura posterior. Por el momento solamente las compras realizadas con tarjetas MasterCard y VISA permiten esta operación.

**Para el caso de la reserva, primero se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/StartReserve>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **ReserveRequest**, que es muy similar a los datos que se envían en una compra con un PaymentRequest, agregando:

* **ExpirationUTC**

  Es la fecha en la que vence la reserva en formato UnixTime (long).

**Para confirmar la reserva, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/EndReserve>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto **Reserve**.

* **Commit**

  Se envia un boolean true / false. Parámetro **deprecado, se ejecuta siempre**.
* **ReferenceType**

  Es un enumerador que especifica el tipo de identificador de la transacción original al que hace referencia la reserva. Puede ser por el identificador generado por Plexo o el enviado por el cliente.
* **MetaReference**

  Contiene el identificador de la reserva original que se desea confirmar, el cual puede ser el devuelto por Plexo o el enviado por el cliente según el ReferenceType seleccionado.
* **FinalAmount**                                                                                                                                                            Es un campo opcional en caso de que el monto final a confirmar sea diferente al monto original. Este monto no puede superar un +/- 20% del monto original.


# 13. Split Payments

Es una nueva uncionalidad para realizar dos autorizaciones de pago a comercios distntos en una misma transacción. Esta pensado para operar únicamente con tarjetas de crédito, pudiendo utilizar un medio de pago distinto en cada transaccion.

* **Para el caso del pago, se hará un POST a:**&#x20;

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/SplitPurchase>" %}

Firmado como todos los demás paquetes con la versión JSON del objeto [SplitPaymentRequest](https://github.com/plexouy/Plexo.Models/blob/master/SplitPaymentRequest.cs), que deberá los dos objetos de tipo [PaymentRequest ](https://github.com/plexouy/Plexo.Models/blob/master/PaymentRequest.cs)(MainPeymentRequest y SecondaryPaymentRequest) que contienen:

* [ ] **ClientReferenceId**

  Referencia de la transacción para trazabilidad de vuestro lado
* [ ] **CurrencyId**

  Código de moneda de la compra (1-Peso, 2-Dolar)
* [ ] **FinancialInclusion**

  Campo para enviar información sobre la Ley de Inclusión Financiera, que contiene:

  ○     **BilledAmount**: monto total de la compra con impuestos

  ○     **InvoiceNumbe**: número de factura

  ○     **TaxedAmount**: monto de la compra neta sin impuestos

  ○     **Type**: tipo de Ley que aplica: 0-No aplica, 1-Ley 17934, 6-Ley 19210.
* [ ] **Installments**

  Cantidad de cuotas
* [ ] **Items**

  Es una lista con los ítems de la compra, que contiene los siguientes campos:

  ○     **Amount** : monto del item

  ○     **ClientItemReferenceId** : ID del item

  No se puede especificar la moneda para cada ítem, se asume que es para todos la misma que se especificó en el campo CurrencyId.
* [ ] **PaymentInstrumentInput**

  Contiene fundamentalmente el InstrumentToken y una lista de valores opcionales (como el CCV, si es requerido) que deben mandarse según los requerimientos del proveedor de medio de pago. Para la etapa de testing esto no es importante.
* [ ] **OptionalCommerceId**&#x20;

  Es mandatorio para Split Payments e indica en cada [PaymentRequest ](https://github.com/plexouy/Plexo.Models/blob/master/PaymentRequest.cs)a que comercio se la aplica la autorización de pago.
* [ ] **LoyaltyProgramAmount** (\*Opcional)

  Campo opcional para el pago con productos de afinidad, como por ejemplo Metros de OCA. En este campo se envía la cantidad de metros a utilizar como forma de pago.
* [ ] **OptionalInstrumentFields** (\*Opcional)

  Algunos medios de pago, pueden requerir información adicional en las transacciones, como es el caso específico de VISA.

{% embed url="<https://github.com/plexouy/Plexo.Models/blob/master/FieldType.cs>" %}

**El campo CybersourceDeviceFingerprint es mandatorio para todas las transacciones con VISA (por Totalnet) y cuya implementación se detalla más adelante.**

Se obtendrá como respuesta la versión en JSON de un objeto Transaction con la información de la transacción realizada

**IMPORTANTE**: Hay que tener importante cuidado en el manejo de los campos de tipo “decimal” en Objetos como Item.Amount o FinancialInclusion.BilledAmount donde por motivos de deserialización JSON del lado del servidor, los valores enteros deben venir siempre con un formato “#.0” que indique un número decimal. Es decir, si pretendemos enviar un valor de 300, debe generarse como 300.0 antes de generar la firma y ser enviado (el punto como separador de decimales).

**DeviceFingerprint para VISA y MasterCard (adquirencia de Totalnet u OCA)**

Para estos casos se solicita la implementación de la captura del DeviceFingerprint en cada transacción obligatoriamente, información que se utiliza en los sistemas de control de fraude.

Antes de hacer una invocación a Plexo con el token del medio de pago, desde la Web o APP de e-commerce deben primero obtener el DeviceFingerprint del dispositivo del usuario final (un script en la Web, o API desde una APP).

La URL es <https://h.online-metrix.net/fp/tags.js?org\\_id=**IdEnvironment**\\&session\\_id=**IdComercio>\*\* **IdInvocacion** donde:

* **IdEnvironment**: donde se debe utilizar **45ssiuz3** para test y **9ozphlqx** para producción.
* **IdComercio**: en el caso de VISA es el ID del comercio para el cual se va a hacer la transacción. Si es MasterCard procesado por OCA se utiliza **oca\_plexo**.
* **IdInvocacion**: es un ID que tiene que ser único por invocación. Se recomienda utilizar el mismo ID de la transacción de pago.

Agregar Script de invocación a la Web de e-commerce:

```html
<head>
 <script type="text/javascript" 
 src="https://h.online-metrix.net/fp/tags.js?org_id=45ssiuz3&session_id=visanetuy_px_1234TRX2157"></script>
</head>

<body>
 <noscript>
 <iframe style="width: 100px; height: 100px; border: 0; position: absolute; top: -5000px;" 
 src="https://h.online-metrix.net/fp/tags?org_id=45ssiuz3&session_id=visanetuy_px_1234TRX2157"></iframe>
 </noscript>
</body>

```

En este ejemplo, se ejecuta este Script en el e-commerce del cliente antes de invocar a Plexo, para el comercio “visanetuy\_px\_1234” (oca\_plexo en caso de Master vía OCA) y con un ID “TRX2157”. Luego en el momento de invocar a Plexo, se envía en el campo opcional CybersourceDeviceFingerprint el valor TRX2157.

En el caso de requerir implementar esto para una APP, ponerse en contacto con el grupo de soporte de Plexo para poder ampliar la información.

## Resultado

A diferencia de una autorizacion de pago normal, en que se recibe un objeto [Transaction](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs), en el caso de Split Payments se recibe un [SplittedTransaction ](https://github.com/plexouy/Plexo.Models/blob/master/SplittedTransaction.cs)que contiene:

* **PurchaseTransaction** - es un objeto [Transaction ](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs)con la informacion de pago principal.
* **SplitTransaction** - es un objeto [Transaction ](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs)con la informacion de la transaccion de pago secundario.
* **Status** - que es un objeto de tipo [TransactionResult](https://github.com/plexouy/Plexo.Models/blob/master/TransactionResult.cs), donde se indica el resultado de la autorizacion de ambas transacciones.

Solamente en las transacciones que fueron procesadas correctamente se recibe un Status = 0 (OK). Si alguna de las auotrizaciones de pago fallo, se va a recibir un resultado diferente. De esta forma se puede saber fácilmente si se autorizaron ambas transacciones o **alguna falló y quedaron canceladas**.

Luego se puede evaluar el contenido de cada objeto Transaction para ver cual fallo y el motivo del mismo. Si por ejemplo la PurchaseTransaction fue aprobada, pero la SplitTransaction fallo, entonces Statuis será distinto de 0, PurchaseTransaction debería estar CANCELADA y SplitTransaction DENEGADA con el mensaje del motivo.


# 14. Split Payments via ExpressCheckout

Se agrega la funcionalidad de realizar un Split Payment desde ExpressCheckout, donde de debe tener en cuenta la ssiguientes restricciones:

* Solo se permite pago con Tarjeta de Crédito o Débito (solo con la misma tarjeta).
* La seleccion de cuotas es solamente para el pago principal, el Split es **siempre al contado**.
* No se muestra la descripcion de detalles de los Items enviados.

**Para el caso del pago, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/ExpressCheckoutSplit>" %}

Firmado como todos los demás paquetes con la versión JSON del objeto [ExpressCheckoutSplitRequest](https://github.com/plexouy/Plexo.Models/blob/master/ExpressCheckoutSplitRequest.cs), que contiene lo que hoy se envía en los puntos 1 ([Authorization](https://github.com/plexouy/Plexo.Models/blob/master/Authorization.cs)) y 14 ([SplitRequest](https://github.com/plexouy/Plexo.Models/blob/master/SplitRequest.cs)) en un servicio que los nuclea.

En particular, en este caso el **Authorization.ActionType** debe enviar el **Flag ExpressCheckout (64)**.

En cuanto a los Items que se envian, estan los de la transaccion principal (lista de Items) y los que pertenecen a la Split (un solo Item y no una lista). Como si indica previamente a diferenencia del ExpressCheckout comun, aqui no se despliega detalle de la lista de Items a pagar.

Como en este caso no se cuenta con un Token a ser enviado en el **PaymentRequest** ni en el **SplitRequest**, los campo **PaymentInstrumentInput** y **SplitPaymentInstrumentInput** se pueden obviar.

Ejemplo de invocación a SplitPayment en modo ExpressCheckout:

```json
{
   "Object":{
      "Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734",
      "Object":{
         "Client":"Fvidal",
         "Request":{
            "AuthorizationData":{
               "Action":64,
               "ClientInformation":{
                  "Name":"Francisco Vidal",
                  "Address":"Av Italia 2020",
                  "Email":"fvidal@plexo.com.uy",
                  "Identification":"123456758",
                  "IdentificationType":"0"
               },
               "DoNotUseCallback":false,
               "LimitIssuers":[
                  "4",
                  "4_2",
                  "11",
                  "14",
                  "15",
                  "16",
                  "17",
                  "12"
               ],
               "MetaReference":"eput12@plexo.com.uy",
               "OptionalCommerceId":84,
               "RedirectUri":"http://www.sitiocliente.com/plexo/XXX/YYY",
               "Type":2
            },
            "PaymentData":{
               "ClientReferenceId":"12345648",
               "CurrencyId":1,
               "FinancialInclusion":{
                  "BilledAmount":20.0,
                  "InvoiceNumber":10050031,
                  "TaxedAmount":16.39,
                  "Type":6
               },
               "Installments":1,
               "Item":{
                  "Amount":12.2,
                  "ClientItemReferenceId":"40010050031",
                  "Description":"Merchant Fee",
                  "Quantity":1
               },
               "Items":[
                  {
                     "Amount":10.0,
                     "ClientItemReferenceId":"40010050031",
                     "Description":"Pantalon",
                     "Quantity":1
                  },
                  {
                     "Amount":10.0,
                     "ClientItemReferenceId":"4510058031",
                     "Description":"Camisa",
                     "Quantity":1
                  }
               ],
               "OptionalCommerceId":84,
               "OptionalMetadata":"Prubea optional Metadata",
               "SplitClientReferenceId":"12345648",
               "SplitCommerceId":10196,
               "SplitCurrencyId":1,
               "SplitFinancialInclusion":{
                  "BilledAmount":12.2,
                  "InvoiceNumber":1234567,
                  "TaxedAmount":10.0,
                  "Type":6
               }
            }
         }
      },
      "UTCUnixTimeExpiration":1724439196
   },
   "Signature":"JS80Kebz2qmOFYb5Wa7Gn46gOv0U0cOydqWMBOLQZPokdF6irymRjR7RNLhPn64a0Jb2EahkYt1deQZLikD0fgNkHzBkmR7O1hJ54tU1xS4W4D1OJN+DquJOcxUA8x+HQGZyLaZ5jflGV54SXUzHO3jvisL5KEap5hMRA6O/oyj9+4QafzuHEvrzVcfj8edHd2woGm1otqpMYSwqnS0vcjOqeZ03I/Haar6fyCLUZfR+GtsyXSy3eiHubFzjDQ9tJV337/Z1CsTisTN2y09gE0f5rP5eXjWlyJJe2qd7L17HT+hasapuGL/gPB6ufCfuhU1mqSE5a1qHO4FR/sv/6Rd8x1i6/pLEW2962LLWRZDsji5Nr4bMjEH5F5BIUawyN42uW4XM/NpVX6ORSf7NIcaOxORW7HQ4qYOpHCb866vN/ofIMUmKPOGYcco0Sxt4FGJljgLbx4YSeuGmYTWQ8XzaxDwoouylYfomNh1jHyTCtFAAggKfRmgdNEx0az+hpPvfZJxzuzMwkSfrbcSPZeHdKAnIhGMTdTLfh6JmwgUuc3oBRdHzbpZ01+Yb8wfSGrAELQgwP91wYE7nih8aXifJcPL3WW3vnvcPcqU48JEnnLFkUrQ3pi5VFSHaFlNGG7S2R4V2afQuoSrTpRjfXSJ9FcqIJM3pBRY2f5zdOt0="
}
```

Como respuesta se recibe una URL, que al abrirla se despliega lo siguiente:

<figure><img src="/files/8CEyyzZSHAzc5WYaEqUx" alt=""><figcaption></figcaption></figure>

Se despliegan directamente el formulario para ingresar tarjetas, ya que son los únicos medios de pago aceptados por este servicio. Se debe configurar previamente para cada Comercio/Issuer las cuotas que son aceptadas para cada tarjeta aceptada. De esta forma, a la hora de seleccionar una tarjeta de crédito, según el Sello y el Comercio utilizado, se despliega una pantalla de selección de cuotas.

<figure><img src="/files/f29ooANBQA4S1pCZTbcB" alt=""><figcaption></figcaption></figure>

Esta seleccion de pago en cuotas es solamente para la transaccion principal (con los articulos de la venta) ya que la transaccion Split se hace solamente en una cuota.

## Resultado

A diferencia de una autorizacion de pago normal, en que se recibe un objeto [Transaction](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs), en el caso de Split Payments via ExpressCheckout se recibe un un objeto de tipo [SplittedTransaction](https://github.com/plexouy/Plexo.Models/blob/master/SplittedTransaction.cs) dentro de un [SplittedTransactionCallback](https://github.com/plexouy/Plexo.Models/blob/master/SplittedTransactionCallback.cs) (se especifica la URL en CallbackURL del [SplitRequest](https://github.com/plexouy/Plexo.Models/blob/master/SplitRequest.cs)) que contiene:

* **PurchaseTransaction** - es un objeto [Transaction ](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs)con la informacion de pago principal.
* **SplitTransaction** - es un objeto [Transaction ](https://github.com/plexouy/Plexo.Models/blob/master/Transaction.cs)con la informacion de la transaccion de pago secundario.
* **Status** - que es un ojceto de tipo [TransactionResult](https://github.com/plexouy/Plexo.Models/blob/master/TransactionResult.cs), donde se indica el resultado de la autorizacion de ambas transacciones.

Solamente en las transacciones que fueron procesadas correctamente se recibe un Status = 0 (OK). Si alguna de las auotrizaciones de pago fallo, se va a recibir un resultado diferente. De esta forma se puede saber fácilmente si se autorizaron ambas transacciones o **alguna falló y quedaron canceladas**.

Luego se puede evaluar el contenido de cada objeto Transaction para ver cual fallo y el motivo del mismo. Si por ejemplo la PurchaseTransaction fue aprobada, pero la SplitTransaction fallo, entonces Statuis será distinto de 0, PurchaseTransaction debería estar CANCELADA y SplitTransaction DENEGADA con el mensaje del motivo.


# 15. Autenticación 3DSecure

Nueva funcionalidad para autenticar al pagador antes de solicitar autorización de pago a Plexo.

Las tarjetas VISA y MASTERCARD implementan un sistema de autenticación del tarjetahabiente, que dependiendo del banco emisor realiza un challenge para validar que quien esta pagando sea el dueño de la tarjeta, al tener que ingresar un código OTP que le es enviado a su celular o correo electronico personal.

Toda transaccion con estos medios de pago, que realizan previamente la validación 3DSecura no son contracargables. Es decir, que si un tarjetahabiente inicia realiza un repudio de una transaccion que previamente realizo esta validacion y fue autenticada, el banco emiso se hace cargo de la transaccion fraudulenta y no el comercio.

Es un serviocio opcional y depende del comercio ejecutaro o no antes de cada transacción. Esto no quita que algunos procesadores o facilitadores de pago, puedan llegar a **aceptar transacciones autenticadas solamente** y rechacen las que no lo sean. Esto va a depender del rubro del comercio y monto de las transacciones u otro tipo de condiciones dispuestas por dichos actores.

**Para invocar al servicio de validacion 3DS, se hará un POST a:**

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/3DSValidation>" %}

Firmado como todos los demás paquetes, con la versión JSON del objeto [**ThreeDSValidation**](https://github.com/plexouy/Plexo.Models/blob/master/ThreeDSValidation.cs)

Los campos **requeridos** se detallan a continuación:

* ClientReferenceId: es el ID de referencia del e-commerce, y **debe ser enviado en el campo opcional ThreeDSReferenceId del Purchase**, para poder obtener informacion del resultado de la autenticación 3DSecure antes de autorizar el pago.
* CurrencyId: moneda de la venta
* Amount: monto de venta.
* InstrumentToken: token que se va a utilizar para realizar el pago.
* RedirectUrl: URL a donde la web de Plexo va a redirigir luego de terminar la autenticación.
* CommerceId: código de comercio de la venta.
* Indicator: en el caso de una compra enviar "**purchase**", si es na alta de cargos recurrentes "**recurring**"

Opcionalmente se puede enviar **CallbackUrl:** URL en el caso que el e-commerce quiera recibir un POST de notificación con el resultado de la autenticación.

Ejemplo de invocación que solicita OTP:

```json
{
   "Object":{
      "Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734",
      "Object":{
         "Client":"Fvidal",
         "Request":{
            "Amount":30.0,
            "ClientReferenceId":"1724853514106",
            "CommerceId":10865,
            "CurrencyId":1,
            "Indicator":"purchase",
            "InstrumentToken":"62cb19ef87f3404a84cbf6b645cad8be",
            "RedirectUrl":"https://google.com.uy/"
         }
      },
      "UTCUnixTimeExpiration":1724863514
   },
   "Signature":"J6M4JAOyIIv3gu6SVxxm2PBVydY055pknOoDPf/jiJsPmKbcMnvEURSU4sT8SnU+hETv1YC2lPUhsKc1suZh3GyH8KDYBh7sH1rRjFD17AvZr8amac+OmUkdQOSm+AxJ3QoNNkRW/oWsclYgxHERp5in4auVn9+8KJhbNq5GdUvlM2g+Ddv3MkuVn6CSNjNzAW7Bd2qQpPjQzkSVGhcZh13YkjTsJzUFVPOBMzWNrc2HCqNZtbntkoAgStpzU7eri0EHD62KSyhDu5X8mP+4T3vDA0EtFxl0lSRYFZmiXyauF55VbI/qIpga/8dg7UtpDlHOfSl9ap6Z+LkjZd0gBFMPCWnPnnnTNVbXC4M/2DH/Eq+1YKKA65RZ6LjlBRmFNuir/Yhx29Tfin8bzwcqmBLSaaAIc52+zseQMWr+sot0QfwzZd75L0LLRc+6NoqdkDI3ntAEn7dpksi14m3LA/6vAMAO2iluaPvIJy+gHgIoDbNE3TUkxMtb4X+w9f2+TbS0Vl3Nzq/A6PBRvi3tj342nQ18yK4fH0EvOQiqpmkO1QbI8bWFw9EFswPVRhwFSMwBK3mLC16Xr9l2fx/AJp2jBZhcIOg4kJa4v7LhR3Kd/NWYSVJTQJTQ4AGxWRDbSKbEvpXxyqgZDdvk9sbplxXKIiwzZsgoWTlDu0FfgEs="
}
```

Como resultado, Plexo devuelve una URL que el e-commerce debe abrir idealmente en un iFrame o ventana modal, donde el tarjetahabiente ingresara el codigo OTP que le es enviado:

```json
{
   "Object":{
      "Fingerprint":"3EA35666901BEA8047EC9DC1F0D72961CC820974",
      "Object":{
         "Response":{
            "IsRequired":true,
            "RedirectUrl":"https://threeds.testing.plexo.com.uy/v2/fca6684b2f404d1581ba7ff8012a7536/visa",
            "SessionId":"fca6684b-2f40-4d15-81ba-7ff8012a7536"
         },
         "ResultCode":0
      },
      "UTCUnixTimeExpiration":1755782540
   },
   "Signature":"aPgN7ewdppnNjs0HP2F29EpDoKGNg/0xTfyYh0Iw9QpHj6BUgBLdx5HBbHvppv3cMO+ZvmTQZlCgbQ6oatxVpE25Joi9f9I9V/lngmnh6o6Or/xuQgsO/uIfNah2bFkQ3GiKIJC5F+M8HzChwdAaZLbNwWzEIvf15Zrr67jS19YXs9csy7ZgY2n506X+7j7l/hcaiGGJL8Rhq+nvVzfHru+WbzITwqsiQWpPCg/ceXW6isSaQEGUzDDH8fX035+kl/dmqT1xZFGiemLKMKHFeA8qJBJEMDQ0EIEQZqIgdm1BSrpBKYTEHxxaZknOfclEjyZaB95v/YSbzILT3GTrL7IMI8wTMQFrdsARymzFOwa7sjpKkakO4QAjEbK/azg8NN/liaLeT9u0BI2S0j+LCqlWKalyw44wQtfV5uOMraRNMX/loxnKSwkEGMHCE5u5mVyLMHnN3pr5pvJBcF9fR6kqro9vXzJM8BFZ27m0DepidYsh3P0tQGtbxMc5N5A1HVcImpLY0Iibj/saiQS2LFYafCOYeqYFB3ck6dauOpsl9ECtCqy87XW1yU7KKTmZUFw8rnq7kGds5f/xzQVpBbtmXfr880V3SoVSCG+NINcafBeehMNwTtAuFmkvRS7hAUxQRXgfDC75Ohc78d02CaKkMd+ms4Qx5G1+4RyCM3k="
}
```

En el caso de que en la respuesta llegue **IsRequired = true** ,se debe abrir la URL indicada en la respuesta para que el tarjetahabiente se autentique.

<figure><img src="/files/8XbYhzU2d35w1BqBN07o" alt=""><figcaption></figcaption></figure>

Alli se ingresa el codigo de pruebas **1234** y se hace click en "**SUBMIT**", haciendo se un redurect a la URL especificada en el REQUEST enviado previamente. Los parámetros que se reciben en esta URL son los siguientes:

* **status**= authenticated / attempted / failed
* clientId= el ID del cliente de Plexo que hace la invocación
* merchantId= el ID del comercio de Plexo  que hace la invocación
* referenceId= el valor del ClientReferenceID recibido
* sessionId= el ID de la sesión de 3DS generada.

El parámetro que indica que el tarjetahabiente se autentico correctamente es **status**, donde si se recibe **failed** no se debería dejar continuar con la autorización de la compra y aque el usuario no se autenticó.&#x20;

Luego en el Purchase posterior, se envian dentro del [PaymentRequest ](https://github.com/plexouy/Plexo.Models/blob/master/PaymentRequest.cs)los campos asociados al ThreeDSValidation:

* InstrumentToken = '62cb19ef87f3404a84cbf6b645cad8be'
* ThreeDSReferenceId = '1724853514106'
* BilledAmount = 30.00
* CurrencyId = 1
* OptionalCommerceId = 10865

Los datos deben coincidir, para que Plexo obtenga la informacion dle resultado de la autenticación y lo envíe al procesador de pago correspondiente.

Tarjeta de pruebas VISA para probar ingreso de OTP : 4456530000001096 con vto  12/27

En caso de utilizar a OCA como procesador, se debe configurar en los medios de pago el MerchtId **ocauy\_s\_plexouy001** en **TESTING**. utilizando la tarjeta 4123428600008616 - 12/26:

<figure><img src="/files/nQ3Ynv93gipJ6qoyPeSf" alt=""><figcaption></figcaption></figure>


# 16. Antifraudes complementarios

## Kount

Es un servicio de antifraude, que al igual que en el caso de operar con adquirencia Totalnet u OCA con tarjetas VISA y MasterCard, se solicita la implementación de la captura del DeviceFingerprint en cada transacción obligatoriamente, información que se utiliza en los sistemas de control de fraude.

Antes de hacer una invocación  de pago a Plexo, desde la Web o APP de e-commerce deben primero obtener el DeviceFingerprint del dispositivo del usuario final, ejecutando un script especifico, como es que se especifica a continuación.

La URL en testing es es https\://**IdEnvironment**.kaptcha.com/collect/sdk?m=**IdComercio**\&s=**IdInvocacion** donde:

* **IdEnvironment**: donde se debe utilizar **tst** para test y **ssl** para producción.
* **IdComercio**: es el MerchantID que les proporciona Kount para identificar al comercio.
* **IdInvocacion**: es un ID que tiene que ser único por invocación. Se recomienda utilizar el mismo ID de la transacción de pago.

Agregar Script de invocación a la Web de e-commerce:

```html
<html>
<head>
<script type='text/javascript' src='https://tst.kaptcha.com/collect/sdk?m=100720&s=57d1fd15d61e409e9ccf05aea3d1c68a'> </script>
</head>

```

En este ejemplo, se ejecuta el script en el ambiente de testing del e-commerce antes de invocar a Plexo, para el comercio “**100720**” y con un ID “**57d1fd15d61e409e9ccf05aea3d1c68a**”. Luego en el momento de invocar a Plexo, se envía en el campo opcional CybersourceDeviceFingerprint el valor **57d1fd15d61e409e9ccf05aea3d1c68a**.

## KOIN

Es otro servicio opcional de antifraude, que funciona como el de KOUNT o Cybersource, donde:

* **org\_id**: donde se debe utilizar **Id** que le proporciona KOIN al comercio..
* **sessionID**: es un ID que tiene que ser único por invocación. Se recomienda utilizar el mismo ID de la transacción de pago.

Agregar Script de invocación a la Web de e-commerce:

```html
<body>
	<script type='text/javascript' src='https://securegtm.despegar.com/risk/fingerprint/statics/track-min.js' id='deviceId_fp' org_id='GQCwHg4A66' session_id='123459b'></script>
</body>
```

En este ejemplo, se ejecuta el script antes de invocar a Plexo, para el org\_id“**GQCwHg4A66**” y con un ID “**123459b**”. Luego en el momento de invocar a Plexo, se envía en el campo opcional CybersourceDeviceFingerprint el valor **123459b**.


# Seguridad y captura de datos sensibles

Toda comunicación con Plexo es encriptada de punto a punto por sistema de claves público-privadas.

Todos los paquetes que se envíen o reciban desde Plexo estarán firmados con la llave privada del remitente, por lo que el receptor deberá usar su llave pública para validar el origen.\
\
Todos los datos sensibles, ya sea de tarjeta de crédito o cuenta bancaria, se conservarán de forma encriptada en los servidores con certificación PCI de Plexo. Para esto se provee a los comercios de una página web a ser desplegada al momento de seleccionar o ingresar un medio de pago por parte del usuario, como se menciona previamente en la sección “Mostrar WEB”.

En el proceso se generará un token haciendo referencia al medio de pago y que puede ser guardado por el comercio para pagos posteriores. Si se tratase de un usuario anónimo, dichos datos tendrán vigencia tan sólo por un período de tiempo limitado (valor asociado a la sesión de usuario creada).

<figure><img src="/files/T5zYIR8Kc7cEK2inGw8C" alt=""><figcaption></figcaption></figure>


# Ejemplos web

### Ingreso de datos de tarjeta de crédito

<figure><img src="/files/3OvFRsyg9WIAvZ4R6T1k" alt=""><figcaption></figcaption></figure>

### Selección y/o inserción de un nuevo medio de pago

<figure><img src="/files/QdAm5F5csysZMGqdcdo9" alt=""><figcaption></figcaption></figure>


# Formas de consumir el servicio

{% content-ref url="/pages/WX2GwJHZU09J1EVcV1lO" %}
[Clientes SDK](/guia-de-integracion/formas-de-consumir-el-servicio/clientes-sdk)
{% endcontent-ref %}

{% content-ref url="/pages/moiE3S8ONmV1hVicN8kH" %}
[Webservices](/guia-de-integracion/formas-de-consumir-el-servicio/webservices)
{% endcontent-ref %}


# Clientes SDK

Actualmente se cuentan con dos clientes SDK para PHP y .Net para quienes no quieran integrar los servicios REST.&#x20;

{% embed url="<https://github.com/plexouy/PHPClient>" %}

{% embed url="<https://github.com/plexouy/plexo-dotnet>" %}


# Webservices

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc>" %}

De elegir esta forma de consumir los servicios se interactúa con los WebServices directamente, teniendo que firmar y verificar los paquetes manualmente.


# Firmado de paquetes

### Ejemplo de estructura de paquete firmado

Para obtener la clave pública con la que Plexo firma los paquetes que se reciben, se consume la siguiente URL:

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Key/>" %}

Para firmar el mensaje canonizado, se debe utilizar algoritmo de hashing SHA512 y de padding PKCS1.

Ejemplo de una llamada al método Authorize.

```json
{
"Object": (1)
{(6)----> Comienza área de firmado----
"Fingerprint":"8D3225D6A04C8A5EB8D69139A3389E0619C6D292", (3)
"Object": (2)
{
"Client":"PlexoTest",
"Request":
{
"Action":35,
"ClientInformation":
{
"Name":"Francisco Vidal",
"Address":"Av Italia 2020",
"Email":"fvidal@plexo.com.uy",
"Cellphone":"099999999",
"Identification":"12345567",
"IdentificationType":"1"
},
"DoNotUseCallback":false,
"LimitIssuers":["4","4_1","11","15"],
"MetaReference":"fvidal@plexo.com.uy",
"OptionalMetadata":"Socio #17826",
"RedirectUri":"http://plexo.com.uy/callback/redirect",
"Type":0
}
},
"UTCUnixTimeExpiration":1532094228935 (4) ----> Fin área de firmado---
},
"Signature":"iUxW9w...WA=" (5)
}

```

El **Objeto (2)** Contiene información de **ClientSignedRequest\<Authorization>**, envuelto por la estructura de **Objeto (1)** firmado (SignedObject).

El **Fingerprint (3)** indica con qué llave fue firmado el paquete (se obtiene del PFX generado por Plexo y que se debe instalar en el servidor del Cliente) y **UTCUnixTimeExpiration (4)** es la expiración de la firma (hasta cuando se debería confiar en el paquete firmado).

El **signature (5)** es el hash de **(6)** (la llave que encierra la información de Fingerprint, Object(2) y UTCUnixTimeExpiration). Debe considerarse que para la creación de Signature el objeto **(6)** fue previamente canonizado:

VER: Canonización de los JSON de Plexo para verificar las firmas.

### Verificación de origen de paquetes

<figure><img src="/files/5qwvjPc0QSZ1ZWGaoOdd" alt=""><figcaption></figcaption></figure>

#### Canonización de los JSON de Plexo para verificar las firmas

1. Se serializa el objeto Object **(2)** del JSON, hijo del objeto principal.
2. Se ordenan alfabéticamente las propiedades del JSON, incluidos todos los hijos recursivamente (Cuando nos referimos alfabéticamente es usando el sentido de las computadoras, es decir 'a' minúscula es mayor que 'Z' mayúscula).
3. Cualquier propiedad que sea nula no debe ser incluida en el firmado, aunque esta se encuentre en el objeto.
4. Cualquier propiedad que no sea nullable debe ser incluida en el firmado, aunque esta no se encuentre en el objeto, en tal caso con el valor defecto. (ej: enteros).
5. Para los campos de tipo enumerado se debe enviar el número asociado al mismo sin comillas.
6. En el caso de fechas se asume ISO 8601 local, con la correcta zona horaria.
7. Los números se deben pasar sin comillas.
8. Cualquier espacio o indentación debe ser removido del JSON.
9. Se agregan los valores del Fingerprint y UTCUnixTimeExpiration.
10. Se transforma el resultado 'string' a un array de bytes usando UTF-8 para su verificación o firmado.
11. En el caso de firmar el resultado de la firma se incluye en el campo Signature, usando base64.

En resumen, se debe firmar el contenido de **(6)** que incluye el Fingerprint **(3)**, Object **(2)** y UTCUnixTimeExpiration **(4)**. El resultado, se transforma en un array de bytes utilizando UTF-8, y se pasa a un string utilizando Base64. El valor resultante viaja en el campo Signature **(5)**.


# Anexo Técnico - Ejemplo de invocaciones

Se puede acceder al siguiente [link](https://webservices.testing.plexo.com.uy/swagger/index.html) con un **swagger** de los servicios.

### 1. Autorización

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Auth>" %}

#### Envío:

```json
{"Object":{"Fingerprint":"43D6A770DB74F7972051D7FF6EE5339FDA03B70E","Object":{"Client":"ClientName","Request":{"Action":3,"ClientInformation":{"Name":"Francisco Vidal","Address":"Av Italia 2020","Email":"fvidal@plexo.com.uy","Identification":"12345678","IdentificationType":"0"},"DoNotUseCallback":false,"LimitIssuers":["4","4_1","13"],"MetaReference":"19099997","RedirectUri":"http://localhost/miURL","Type":0}},"UTCUnixTimeExpiration":1505156901034},"Signature":"CnK3/Z2...DCTI="}
```

#### Responde:

```json
{"ExpirationUTC":1505192898,"Id":"c24cb52e05dd4e6295fbc318e9b52bb2","Uri":" https://web.testing.plexo.com.uy/c24cb52e05dd4e6295fbc318e9b52bb2"},"ResultCode":0
```

**"Type":0** indica **AuthorizationType.ClientReference**, o sea que se quiere hacer referencia a un Cliente, cuyo identificador se especifica en **"MetaReference":"19099997"**. La acción deseada se especifica en **"Action":3** que se especifica en **ActionType** (SelectInstrument(1) + RegisterInstrument(2) = 3)

### 2. Mostrar Web

```html
https://web.testing.plexo.com.uy/a3bf483e545e4a628de23bef3a2b37d8
```

Una vez que el cliente termina de seleccionar el medio de pago, se invoca la URL (**InstrumentCallback**) al servidor del cliente (debe ser REST), a no ser que se haya especificado “DoNotUseCallback”=true en la Autorización. En esa llamada se devuelve el instrumento de pago que se puede guardar para futuras compras, conteniendo datos como los últimos números de la tarjeta, sello, vencimiento, etc. Como respuesta se debe enviar un **ClientSignedResponse** como siempre firmado, conteniendo ResultCode y ErrorMessage donde pueden enviar información a mostrar luego.

```json
{"Object":{
"Object":{
"SessionId":"c24cb52e05dd4e6295fbc318e9b52bb2",
"Client":"Nombre-Cliente",
"Action":1,
"PaymentInstrument":{
"InstrumentToken":"72307929f47e4e5e92a128cb87c9c22b",
"Name":"492963XXXXXX1010",
"Issuer":{
"Id":11,
"IssuerId":11,
"VariationId":1,
"Issuer":"Visa",
"VariationId":0,
"ImageUrl":"https://static.plexo.com.uy/issuers/11.svg",
"MayHaveAsyncPayments":false,
"SupportsReserve":true,
"MayHavePaymentsLimits":false,
"Fields":[{"LabelName":"Numero de Comercio","FieldType":2049,"Required":true}]
},
"SupportedCurrencies":
[{"CurrencyId":1,"Name":"Peso","Plural":"Pesos","Symbol":"$"},
{"CurrencyId":2,"Name":"Dólar","Plural":"Dólares","Symbol":"U$S"}],
"Status":0,
"InstrumentExpirationUTC":1590883200,
"AnonInstrumentUsageTimeLimit":86400,
"CreditLimits":[],
"AdditionalRequirements":
[{"SecondsLeft":120,"RequirementAfterTimeLimit":33154}],
"InstrumentInformation":{"CardType":"UruguayCredit","CardIssuer":"Banco Santander"}},
"OptionalMetadata":"Prueba optional","OptionalBIN":"49296351"},
"Fingerprint":"AEA4D5C586983A140F8B566EA81901E8BD8F8C9F",
"UTCUnixTimeExpiration":1504125737
},
"Signature":"ljmWbxNn1qx2DjEO0t1ALP09….="
}

```

Entre la cantidad de información recibida en el Callback, se destaca:

* **InstrumentToken**: Es el Identificador del medio de pago, que se debe utilizar luego para realizar las operaciones de pago.
* **Name**: Es el nombre del instrumento que se debe desplegar luego para la selección. Por lo general es el PAN de la tarjeta de crédito o el número de cuenta bancaria enmascarado.
* **AnonInstrumentUsageTimeLimit**: Indica la cantidad de segundos de vida del instrumento de pago registrado en caso de ser un usuario anónimo.
* **AdditionalRequirements**: En este campo se devuelve una lista con tiempos de vencimiento en segundos, de distintos campos de información adicional que se ingresan en el registro del medio de pago. El uso más común es el caso en donde el medio de pago solicita el ingreso del CVV, como en el ejemplo de respuesta utilizado:

  "AdditionalRequirements":\
  \[{"**SecondsLeft":120,"RequirementAfterTimeLimit":33154**}]

En este caso, se indica que el FieldType #33154 (<https://github.com/plexouy/Plexo.Models/blob/master/FieldType.cs> / CVC = 0x8182) que es el  CVV que se solicitó en el registro (la lista muestra todos los FieldTypes solicitados) tiene 120 segundos de vida antes de ser eliminado de la sesión en el servidor (por normativa PCI-DSS). En caso de enviar la operación de **Purchase** dentro de ese tiempo, no va a ser necesario capturar este dato nuevamente del tarjetahabiente, en caso contrario se deberá solicitar nuevamente y enviarlo en el campo correspondiente. Es importante saber que si el pago falla por algun motivo y se vuelve a intentar pagar, **hay que solicitar el CVV al usuario**, ya que en el intento previo el dato es eliminado en Plexo.

* **OptionalMetadata**: Se ultiza muchas veces como control por parte del ecommerce, enviando un dato en el Authorization que luego se recibe en el Callback. En el caso de haber solicitado recibir informacion extra y opcional del BIN (principalmente por los nuevos de largo 8), se recibirá el dato dentro de **OptionalBIN.**
* **InstrumentInformation**: Para algunas tarjetas, se especifica el tipo que es. Los diferentes valores disponibles se encuentra en <https://github.com/plexouy/Plexo.Models/blob/master/CardTypes.cs>

```csharp
    public enum CardTypes
    {
        [EnumMember]
        UruguayDebit=1,
        [EnumMember]
        UruguayCredit=2,
        [EnumMember]
        UruguayPrepaid=5,
        [EnumMember]
        Debit=3,
        [EnumMember]
        Credit=4,
        [EnumMember]
        Prepaid=6,
        [EnumMember]
        Unknown=0
    }

```

### 3. Purchase

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Purchase>" %}

Es el último paso con la invocación final para solicitar el pago (el medio de pago lo define InstrumentToken, y lo pueden guardar para futuros pagos), donde el formato por ejemplo del JSON es el siguiente:

#### Envío:

```json
{
"Object":{
"Fingerprint":"43D6A770DB74F7972051D7FF6EE5339FDA03B70E",
"Object":{
"Client":"NombreCliente",
"Request":{
"ClientReferenceId":"19099997",
"CurrencyId":1,
"FinancialInclusion":{
"BilledAmount":300.00,
"InvoiceNumber":123456,
"TaxedAmount":300.00,
"Type":1
},
"Installments":2,
"Items":[{"Amount":300.00,"ClientItemReferenceId":"abg156"}],
"PaymentInstrumentInput":{
"InstrumentToken":"72307929f47e4e5e92a128cb87c9c22b",
"NonStorableItems":{"CVC":"123"},
"UseExtendedClientCreditIfAvailable":false
}
}
},
"UTCUnixTimeExpiration":1505155515707
},
"Signature":"1tbpz/YVdToLp….ws="
}
```

En el **Request** va **ClientReferenceId**, donde viaja el Identificador de Cliente que solicite en la Autorización, la moneda, el objeto **FinancialInclusion** con todos los datos solicitados por la ley, especificando el tipo a aplicar que se especifica en **InclusionType** (None(0), Law17934(1), Law19210(6)). Luego se especifica en **Installments** la cantidad de cuotas, va un Array con los **Items** de la compra y por último el instrumento de pago en el objeto **PaymentInstrumentInput**, con el **InstrumentToken** que recibimos en el callback del servidor en el paso anterior. En este caso también el medio de pago solicita el ingreso del CVC2 o CVV2 según corresponda, por ello se envía el valor “CVC” dentro del campo **NonStorableItems** del objeto **PaymentInstrumentInput**.

#### Respuesta:

{% code fullWidth="false" %}

```json
{
"Object":{
"Fingerprint":"AEA4D5C586983A140F8B566EA81901E8BD8F8C9F",
"Object":{
"Response":{
"Commerce":{
"CommerceId":9,
"Name":"CommerceName"
},
"Currency":{
"CurrencyId":1,
"Name":"Peso",
"Plural":"Pesos",
"Symbol":"$"
},
"CurrentState":1,
"FieldInformation":{
"Address":"Av Italia 2020",
"Email":"fvidal@plexo.com.uy",
"Expiration":"06/20",
"Identification":"12345678",
"IdentificationType":"0",
"Name":"Francisco Vidal",
"Provider":"MasterCard"
},
"FinancialInclusion":{
"IsApplied":true,
"LawNumber":1,
"ReturnAmount":0.00
},
"Installments":2,
"InstrumentName":"539909XXXXXX1010",
"InstrumentToken":"72307929f47e4e5e92a128cb87c9c22b",
"InvoiceNumber":"123456",
"IsAnonymous":false,
"Issuer":{
"Bank":null,
"Fields":[{"FieldType":2049,"LabelName":"Numero de Comercio","Required":true}],
"Id":"4",
"ImageUrl":"https://testing.plexo.com.uy:4043/images/instruments/4.png",
"Issuer":"MasterCard",
"IssuerId":4,
"MayHaveAsyncPayments":false,
"MayHavePaymentsLimits":false,
"SupportsReserve":false,
"Variation":null,
"VariationId":0
},
"TransactionId":"b696d0e857ce41b181c71f607bbbbba6",
"Transactions":{
"Purchase":{
"Authorization":"104",
"ClientMetadata":null,
"ClientReferenceId":"19099997",
"ExecutionDateUTC":1505155513,
"ExpirationUTC":null,
"Status":0,
"Ticket":null,
"TransactionCode":0,
"TransactionResultText":null
}
}
},
"ResultCode":0
},
"UTCUnixTimeExpiration":1505156113
},
"Signature":"RkPXm2nPY….Of4="}
}

```

{% endcode %}

En la respuesta de **Purchase** se recibe una cantidad de información, donde se destaca:

* **Commerce**: Contiene los datos del comercio al que se hizo la compra.
* **CurrentState**: Es el estado actual de la transacción. Se obtiene del enumerado TransactionType: Reserve (0) / Purchase (1) / Cancel (2)
* **FieldInformation**: Información variada del Cliente e instrumento de pago utilizado.
* **FinancialInclusion**: Informa si se aplicó la Ley de Inclusión Financiera, cuál, y el monto de descuento.
* **Issuer**: Contiene toda la información relevante el emisor del medio de pago.
* **TransactionId**: Contiene el identificador de la transacción en Plexo. Es conveniente guardar este valor para futura consolidación de datos.
* **Transactions**: Contiene un Array con los distintos tipos de transacciones que estén involucradas. Esto es porque podríamos tener tres posibles estados: Reserva, Compra y Cancelación para una misma transacción, y en este campo se puede obtener la información relevante para cada uno de ellos. Por ejemplo:

```json
"Purchase":{
"Authorization":"104",
"ClientMetadata":null,
"ClientReferenceId":"19099997",
"ExecutionDateUTC":1505155513,
"ExpirationUTC":null,
"Status":0,
"Ticket":null,
"TransactionCode":0,
"TransactionResultText":null
}
```

En este caso hay solamente una transacción de compra, con Status = 0 que hace referencia al enumerado **TransactionResult**.Ok(0) y el código de autorización 104 y un TransactionCode = 0 que es el código de resultado del medio de pago.

En caso de que se solicite la cancelación de esta compra, el valor de CurrentState debería ser 2 (Cancel) y en el campo de Transactions podríamos tener este contenido:

```json
"Transactions":{
"Purchase":{
"ClientReferenceId":"19099997",
"ClientMetadata":null,
"Status":0,
"TransactionCode":0,
"TransactionResultText":null,sson
"ExecutionDateUTC":1504648725,
"Authorization":"104",
"Ticket":null,
"ExpirationUTC":null
},
"Cancel":{
"ClientReferenceId":"19099997",
"ClientMetadata":null,
"Status":0,
"TransactionCode":0,
"TransactionResultText":"Empty Response",
"ExecutionDateUTC":1504648798,
"Authorization":null,
"Ticket":null,
"ExpirationUTC":null
}
} 

```

### 4. Cancel

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/Operation/Cancel>" %}

Si se desea cancelar una compra, se debe invocar a este método pasando como principal referencia el identificador de la transacción que se quiere cancelar:

#### Envío:

```json
{
"Object":{
"Fingerprint":"43D6A770DB74F7972051D7FF6EE5339FDA03B70E",
"Object":{
"Client":"NombreCliente",
"Request":{
"ClientReferenceId":"19099998",
"MetaReference":"b696d0e857ce41b181c71f607bbbbba6",
"Type":0
}
},
"UTCUnixTimeExpiration":1505159246145
},
"Signature":"rJViby...Srw="
}
```

En el campo **Type** va el valor del enumerado **ReferenceType** PlexoTransactionId(0), ClientPurchaseReferenceId(1), ClientCancelReferenceId(2) y ClientReserveReferenceId(3), y en el MetaReference el identificador asociado. En este caso se indica que se desea cancelar el ID **b696d0e857ce41b181c71f607bbbbba6** asociado a un ID de la transacción de Plexo, el que retorno el método Purchase.

Podría darse el caso, en que en vez de enviar el ID de la transacción de Plexo, envíe el ID de mi transacción, en ese caso se envía un **Type** = 1 y el **ClientReferenceId** = 19099997 qué es el que se envio en el Purchase como ID del cliente.

#### Respuesta:

```json
{
"Object":{
"Fingerprint":"AEA4D5C586983A140F8B566EA81901E8BD8F8C9F",
"Object":{
"Response":{
"Commerce":{
"CommerceId":9,
"Name":"CommerceName"
},
"Currency":{
"CurrencyId":1,
"Name":"Peso",
"Plural":"Pesos",
"Symbol":"$"
},
"CurrentState":2,
"FieldInformation":{
"Address":"Av Italia 2020",
"Email":"fvidal@plexo.com.uy",
"Expiration":"06/20",
"Identification":"12345678",
"IdentificationType":"0",
"Name":"Francisco Vidal",
"Provider":"MasterCard"
},
"FinancialInclusion":{
"IsApplied":true,
"LawNumber":1,
"ReturnAmount":0.0
},
"Installments":2,
"InstrumentName":"539909XXXXXX1010",
"InstrumentToken":"72307929f47e4e5e92a128cb87c9c22b",
"InvoiceNumber":"123456",
"IsAnonymous":false,
"Issuer":{
"Bank":null,
"Fields":[{"FieldType":2049,"LabelName":"Numero de Comercio","Required":true}],
"Id":"4",
"ImageUrl":"https://testing.plexo.com.uy:4043/images/instruments/4.png",
"Issuer":"MasterCard",
"IssuerId":4,
"MayHaveAsyncPayments":false,
"MayHavePaymentsLimits":false,
"SupportsReserve":false,
"Variation":null,
"VariationId":0
},
"TransactionId":"b696d0e857ce41b181c71f607bbbbba6",
"Transactions":{
"Cancel":{
"Authorization":null,
"ClientMetadata":null,
"ClientReferenceId":"19099998",
"ExecutionDateUTC":1505159243,
"ExpirationUTC":null,
"Status":0,
"Ticket":null,
"TransactionCode":0,
"TransactionResultText":"Empty Response"
},
"Purchase":{
"Authorization":"104",
"ClientMetadata":null,
"ClientReferenceId":"19099997",
"ExecutionDateUTC":1505166313,
"ExpirationUTC":null,
"Status":0,
"Ticket":null,
"TransactionCode":0,
"TransactionResultText":null
}
}
},
"ResultCode":0
},
"UTCUnixTimeExpiration":1505159843
},
"Signature":"eHXn/6L...mOkU="
}

```

### 5. ExpressCheckout

{% embed url="<https://testing.plexo.com.uy:4043/SecurePaymentGateway.svc/ExpressCheckout>" %}

#### Envío:

```json
{
   "Object":{
      "Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734",
      "Object":{
         "Client":"ClientName",
         "Request":{
            "AuthorizationData":{
               "Action":64,
               "ClientInformation":{
                  "Name":"Francisco Vidal",
                  "Address":"Av Italia 2020",
                  "Email":"fvidal@plexo.com.uy",
                  "Identification":"123456758",
                  "IdentificationType":"0"
               },
               "DoNotUseCallback":false,
               "LimitIssuers":[
                  "4",
                  "11",
                  "15",
                  "52",
                  "54"                  
               ],
               "MetaReference":"fvidal@plexo.com.uy",
               "OptionalCommerceId":84,
               "RedirectUri":"http://www.sitiocliente.com/plexo/XXX/YYY",
               "Type":0
            },
            "PaymentData":{
               "ClientReferenceId":"1617812571899",
               "CurrencyId":1,
               "FinancialInclusion":{
                  "BilledAmount":100.0,
                  "InvoiceNumber":-1390098693,
                  "TaxedAmount":81.97,
                  "Type":1
               },
               "Installments":1"Items":[
                  {
                     "Amount":61.0,
                     "ClientItemReferenceId":"Item-1",
                     "Description":"2mts x 2mts",
                     "Name":"Sommier King",
                     "Quantity":1
                  },
                  {
                     "Amount":61.0,
                     "ClientItemReferenceId":"Item-1",
                     "Description":"Premium Collection",
                     "Name":"Sabanas King",
                     "Quantity":1
                  }
               ],
               "OptionalCommerceId":84,
               "PaymentInstrumentInput":{
                  "NonStorableItems":{
                     "Cvc":"123"
                  },
                  "OptionalInstrumentFields":{
                     "CommerceReserveExpirationInSeconds":"600",
                     "ShippingAddress":"Av Peru 2355",
                     "ShippingZipCode":"15800",
                     "ShippingCity":"Canelones",
                     "ShippingCountry":"UY",
                     "ShippingFirstName":"Juana",
                     "ShippingLastName":"Perez",
                     "ShippingPhoneNumber":"099554554"
                  },
                  "UseExtendedClientCreditIfAvailable":false
               }
            }
         }
      },
      "UTCUnixTimeExpiration":1626350400
   },
   "Signature":"…="
}
```

#### Respuesta:

```json
{
   "Fingerprint":"3EA35666901BEA8047EC9DC1F0D72961CC820974",
   "Object":{
      "Response":{
         "ExpirationUTC":1727080411,
         "Id":"272d253e24d74b7da04b9910f1ef95d5",
         "Uri":"https://web.testing.plexo.com.uy/272d253e24d74b7da04b9910f1ef95d5"
      },
      "ResultCode":0
   },
   "UTCUnixTimeExpiration":1723481011
}
```

Al igual que en el Authorize, nos devuelve una URL para mostrar la Web de Plexo.

Luego de ejecutarse la transacción, se envía el PaymentCallback a la URL especificada por el cliente con el resultado de la misma:

```json
{
   "Object":{
      "Object":{
         "Client":"ClientName",
         "TransactionId":"c4736021143c4d8084f86b5cd46b7aa5",
         "Commerce":{
            "CommerceId":84,
            "Name":"Mi Comercio"
         },
         "InstrumentToken":"078e8686b9e448ddba3ce1bf1abdae55",
         "InstrumentName":"520394XXXXXX3450",
         "Issuer":{
            "Id":"4",
            "IssuerId":4,
            "VariationId":0,
            "Issuer":"MasterCard",
            "ImageUrl":"https://testing.plexo.com.uy/images/instruments/4.png",
            "MayHaveAsyncPayments":false,
            "SupportsReserveJSON":true,
            "MayHavePaymentsLimits":false,
            "Fields":[
               {
                  "LabelName":"Numero de Comercio",
                  "FieldType":2049,
                  "Required":true
               }
            ]
         },
         "Amount":100.00,
         "Installments":1,
         "Currency":{
            "CurrencyId":1,
            "Name":"Peso",
            "Plural":"Pesos",
            "Symbol":"$"
         },
         "IsAnonymous":true,
         "CurrentState":1,
         "InvoiceNumber":"0-1389204724",
         "FinancialInclusion":{
            "IsApplied":false,
            "ReturnAmount":0.0,
            "LawNumber":0
         },
         "Transactions":{
            "Purchase":{
               "ClientReferenceId":"1617813465868",
               "Status":2,
               "TransactionCode":0,
               "TransactionResultText":"Pending",
               "ExecutionDateUTC":1617813471
            }
         },
         "FieldInformation":{
            "Provider":"Sistarbanc",
            "ProviderCommerceNumber":"HANDY",
            "TerminalNumber":"VTOL",
            "AvailableBanks":"009,008",
            "CommerceRUT":"215465874411",
            "CardType":"Bank",
            "Expiration":"12/99",
            "InstrumentName":"Sistarbanc",
            "IntegerId":"17077"
         },
         "IsAsyncPayment":false,
         "UTCUnixTimeExpiration":1617815271
      },
      "Fingerprint":"88C92452350AE72C2202A63B5CA86E55A2A51289",
      "UTCUnixTimeExpiration":1617814512
   },
   "Signature":"g556W..piJk="
}
```

En este caso, la transacción está en estado pendiente hasta que el usuario realice el pago en redes de cobranza o su homebanking, etc. Luego de confirmado el pago, o si vence el tiempo máximo de espera, se recibirá otro PaymentCallback con el resultado final de la transacción.

### Validación de firmas

Para brindar apoyo en el problema de canonización y firmado de los paquetes, que son los problemas más comunes, se agrega en la respuesta de error el mensaje que estaba esperando Plexo para que sea valido.

Ejemplo de una invocación errónea de Authorize:

```json
{"Object":{"Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734","Object":{"Client":"Fvidal","Request":{"ClientInformation":{"Address":"Echevarriarza 3340","ZipCode":"15800","Email":"fvidal@plexo.com.uy","Identification":"42320818","IdentificationType":"1","FirstName":"Leonardo","LastName":"González Mazzei","City":"Montevideo"},"DoNotUseCallback":false,"ExtendedBINInformation":true,"MetaReference":"fvidal@plexo.com.uy","OptionalCommerceId":84,"RedirectUri":"https://google.com.uy/","Type":0}},"UTCUnixTimeExpiration":1703296821},"Signature":"QVwy+V5JD+i01eRzODxlVXSTxHelSn/1gUQ3KVI4fI9Nw7TQ1lcBY4HGORTO0lst2TcK9vSS4FyYlT1KYLEY5uL+8NMVEIgaJeeEGZnKJktqEW0UFvnwEKinIbExnrxh47jrA7M0Daf+gETNAQjdd1Cx0kF+8E3/yjRbnGfldDWMyConJ2vfC+edmncMqmbOVllOa0cMjTrEHaJDwRCYrmAHo+jQa8+Z8MkxajV93YT4CXbhxKoFubkDyNQ36QKwdJGgl8gSfUYPhkWm6UUCcH+lJdfZcOnbfwk75nnkUPTRwTw05c8yfjVTH0DVH2iDRHzoX/spSFyXwD42b3Dr1FHx9+5d3nqhHKzkFLQFxw4qhMOWQho65MkS4ZdEBX9xecsvxPQ67ZqDtTwQ9DFqq5SK6Z5IgHTgFlT0NEbaJYKVLC0GMzRLEcH+JklNxIfgct18HIamf9+Fl0n3UpAj5/+kT2TSAYxf1EloJU83g0Qe0j2K7C6QkGLFj9bZs8+U1QiPR6wWPHjWC3l9GKXlgWHoMvzTgkUP5dI+HshokgKlS5IfUWnJebT/tnSGb9OuLjF+Ixqxsrm3vOwGJnhvnAvuWMz5giH/94DISircd4xhunlIVQTXDeQ//5hTSaWhFcPwHnb5v2xJwqLRPcOu9WwRiIOEfAr+49I189/FHCo="}
```

Como respuesta se recibe:

```json
{
    "Object": {
        "Fingerprint": "3EA35666901BEA8047EC9DC1F0D72961CC820974",
        "Object": {
            "ErrorMessage": "Signature do not match: Message expected: {"Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734","Object":{"Client":"Fvidal","Request":{"Action":0,"ClientInformation":{"Address":"Echevarriarza 3340","City":"Montevideo","Email":"fvidal@plexo.com.uy","FirstName":"Leonardo","Identification":"42320818","IdentificationType":"1","LastName":"González Mazzei","ZipCode":"15800"},"DoNotUseCallback":false,"ExtendedBINInformation":true,"MetaReference":"fvidal@plexo.com.uy","OptionalCommerceId":84,"RedirectUri":"https://google.com.uy/","Type":0}},"UTCUnixTimeExpiration":1703296821}",
            "I18NErrorMessages": {
                "en": "Signature do not match: Message expected: {"Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734","Object":{"Client":"Fvidal","Request":{"Action":0,"ClientInformation":{"Address":"Echevarriarza 3340","City":"Montevideo","Email":"fvidal@plexo.com.uy","FirstName":"Leonardo","Identification":"42320818","IdentificationType":"1","LastName":"González Mazzei","ZipCode":"15800"},"DoNotUseCallback":false,"ExtendedBINInformation":true,"MetaReference":"fvidal@plexo.com.uy","OptionalCommerceId":84,"RedirectUri":"https://google.com.uy/","Type":0}},"UTCUnixTimeExpiration":1703296821}",
                "es": "La firma no concuerda: Mensaje esperado: {"Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734","Object":{"Client":"Fvidal","Request":{"Action":0,"ClientInformation":{"Address":"Echevarriarza 3340","City":"Montevideo","Email":"fvidal@plexo.com.uy","FirstName":"Leonardo","Identification":"42320818","IdentificationType":"1","LastName":"González Mazzei","ZipCode":"15800"},"DoNotUseCallback":false,"ExtendedBINInformation":true,"MetaReference":"fvidal@plexo.com.uy","OptionalCommerceId":84,"RedirectUri":"https://google.com.uy/","Type":0}},"UTCUnixTimeExpiration":1703296821}"
            },
            "ResultCode": 13
        },
        "UTCUnixTimeExpiration": 1703287739
    },
    "Signature": "HVOtwWPI8lxvGI/lhbYNFIEe85UQtvftgtzuWwux67MLJW1g4Mlz4NfoYfcr9G2HEtgCrwXNQn1CXwuZh6FgW8O6WwzevdstJU72FZ4rICMUJBLfODzPsY5UkNqLy6fcuqU7a3TMwUZnbQhP0G1ScrS1oFJaS4BinqMbnySCsFWCRa9Hvxgewbg/9kZwTsgF81rdOGeazgr5FYp/lFzX/Zqr/4QyjmpMMtrB2xtIqUu6ZsdKXteHH+G72Ka6L2LiWBjhZ6MUaqkKNJY+OZT0/egXksVDNuUOgd2Eu4FhQughSJXTYORZwNjaaHU2yO0iyiccY30poVg6jFrZl3K2gc6ibKWt2KqWmPZEnVGQ8hwoJ1MkPMyY/9xFzY1H7pzDeQdNpXBh6QAXd/tkT9JQQj8itJLQ3CrMMPIlMeFtX9mY5j/9RC+jUuVbhB/k9Fr39OCcsDdsZ4z9RuA0PO5cbZ+af6Xbw0FIUW0mxrQ4/089DbzEefFyijHVhysNDwvc/wlvpILL/jz9NUQf7nIv+6Db8jKe1Wm1j58MJWmyZiSaauggfq/GWvHlVV9O++lxvo/GmtMeK1JTSRxmAIwgkXjx+XHOd5/m6TvkBX1u/gOgQz5DafuG8BLCNFuZ/mJxrlmS5fH5M9Yy2dqGhsKoLBZeK8hY3dhddqo2KZ8QzSA="
}
```

En este caso el problema fue no agregar dentro del Request el campo **Action** que es requerido, y se especifica en la respuesta, dentro de **ErrorMessage**, agregando el valor de "Action":0 al mensaje esperado. Comparando lo enviado y la respuesta que da el sistema, se puede llegar a determinar donde esta el problema en la generación y firma del mensaje.

Entonces el mensaje correcto en este caso sería agregar el **Action** deseado (con valor 3 = Select + Register):

```json
{"Object":{"Fingerprint":"06356B6157EF3AB24D20EBCC5158C75E371D3734","Object":{"Client":"Fvidal","Request":{"Action":3,"ClientInformation":{"Address":"Echevarriarza 3340","ZipCode":"15800","Email":"fvidal@plexo.com.uy","Identification":"42320818","IdentificationType":"1","FirstName":"Leonardo","LastName":"González Mazzei","City":"Montevideo"},"DoNotUseCallback":false,"ExtendedBINInformation":true,"MetaReference":"fvidal@plexo.com.uy","OptionalCommerceId":84,"RedirectUri":"https://google.com.uy/","Type":0}},"UTCUnixTimeExpiration":1703296821},"Signature":"QVwy+V5JD+i01eRzODxlVXSTxHelSn/1gUQ3KVI4fI9Nw7TQ1lcBY4HGORTO0lst2TcK9vSS4FyYlT1KYLEY5uL+8NMVEIgaJeeEGZnKJktqEW0UFvnwEKinIbExnrxh47jrA7M0Daf+gETNAQjdd1Cx0kF+8E3/yjRbnGfldDWMyConJ2vfC+edmncMqmbOVllOa0cMjTrEHaJDwRCYrmAHo+jQa8+Z8MkxajV93YT4CXbhxKoFubkDyNQ36QKwdJGgl8gSfUYPhkWm6UUCcH+lJdfZcOnbfwk75nnkUPTRwTw05c8yfjVTH0DVH2iDRHzoX/spSFyXwD42b3Dr1FHx9+5d3nqhHKzkFLQFxw4qhMOWQho65MkS4ZdEBX9xecsvxPQ67ZqDtTwQ9DFqq5SK6Z5IgHTgFlT0NEbaJYKVLC0GMzRLEcH+JklNxIfgct18HIamf9+Fl0n3UpAj5/+kT2TSAYxf1EloJU83g0Qe0j2K7C6QkGLFj9bZs8+U1QiPR6wWPHjWC3l9GKXlgWHoMvzTgkUP5dI+HshokgKlS5IfUWnJebT/tnSGb9OuLjF+Ixqxsrm3vOwGJnhvnAvuWMz5giH/94DISircd4xhunlIVQTXDeQ//5hTSaWhFcPwHnb5v2xJwqLRPcOu9WwRiIOEfAr+49I189/FHCo="}
```


