...
Fecha | Revisión | Observaciones |
24/01/2005 | 1.0 | Generación del documento |
24/11/2005 | 1.1 | Inclusión campo 74,75 |
21/03/2006 | 1.2 | Encriptacion |
19/07/2006 | 1.3 | Agregado campos para transacciones de debito |
22/09/2006 | 1.4 | Libreria para vb |
02/10/2006 | 1.5 | Agregado y actualización de información de la librería JAVA. |
14/05/2007 | 1.6 | Reestructuración del documento. Incorporación de información del protocolo Synthesis (llavecitas) |
05/10/2010 | 1.7 | Agregado de parámetro de configuración librería dinámica TOTALNODESNUMBER y INITIALNODENUMBER |
19/04/2012 | 1.8 | Agregado de mayor flexibilidad para configurar los archivos de configuración. Agregado de logeo nativo de Java. |
01/09/2014 | 1.9 | Revisión de parámetros de configuración de la librería. |
10/02/2015 | 1.10 | Agregado de la modalidad VirtualVTOLClient para locales virtuales donde VTOL Server gestionará la asignación de nodos. |
01/12/2016 | 1.11 | Agregado de comunicación sobre protocolo SSL. Detalle de los nuevos parámetros de configuración disponibles para SSL. |
28/03/2018 | 1.12 | Modificación en las revisiones del documento. |
Índice
Índice |
---|
...
...
1. Introducción
...
...
1.1 Introducción
VTOL cuenta con una librería desarrollada en Java la cual provee las funciones necesarias para realizar autorizaciones de diversos tipos de transacciones, además de las transacciones de control propio y común a cualquier implementación de VTOL Server.
La librería es en realidad un módulo cliente que se comunica vía TCP/IP con el servidor de transacciones (VTOL).
A continuación se hará una descripción de los contenidos de la librería que ayudarán a comprender su funcionamiento. Antes se hará una introducción a la Mensajería de VTOL.
...
...
1.2 Protocolo de comunicación POS - VTOL
Synthesis establece un protocolo de comunicación para la interacción POS - VTOL, el cual se denomina "Protocolo Synthesis" o "llavecitas". Dicho protocolo se basa en un esquema recursivo compuesto por campos y separadores. A continuación se provee una especificación detallada de su estructura junto con los consecuentes diagramas para un mejor entendimiento.
Para implementar esta mensajería, VTOL provee una librería en el cual se encuentra la declaración de funciones y las definiciones de constantes y tipos necesarias. La librería es en realidad un módulo cliente que se comunica vía TCP/IP con el servidor de transacciones VTOL. El cliente podrá implementar esta mensajería sin utilizar la librería, pero deberá respetar el formato de la misma.
...
La estructura posee dos partes separadas que son el Header y el Mensaje propiamente dicho.
...
1.2.1 Header
Dentro del Header viaja información específica del mensaje que se encuentra a continuación del mismo, como ser su longitud y si requiere o no una respuesta. Para ello fueron destinados 6 bytes que se distribuyen de la siguiente manera: los primeros 4 bytes son destinados a la longitud (expresado en hexadecimal, con el último byte como el más significativo) y los últimos 2 indican la necesidad de recibir o no una respuesta (expresado en hexadecimal, con el último byte como el más significativo)
Un ejemplo de lo explicado anteriormente podría ser el siguiente:
...
Nota |
---|
Nota: Se ordena la longitud A101colocando el byte más significativo a la izquierda, con lo cual resulta: 101A. |
...
...
1.2.2 Mensaje
A continuación del Header se encuentra el Mensaje propiamente dicho, el cual contiene la información que el emisor desea transmitirle al sistema receptor.
La estructura de los mensajes son que se muestra en la siguiente ilustración:
...
El mensaje anterior posee 5 campos, los cuales se identifican con los números 1, 2, 26, 27 y 28. A continuación de cada uno de ellos (luego del separador ":") se encuentra el valor de cada campo. En el ejemplo presentado, para el campo 1 el valor es "5", para el campo 2 el valor es "1" y así sucesivamente.
...
...
1.2.3 Escape de caracteres
Para realizar el escape de un caracter especial se deberá usar "\" inmediatamente antes del carácter a escapar.
...
A continuación se presenta un campo cuyo valor incluye el carácter ; y se muestra como escapar el mismo:
{1:14\;56}
...
1.3 Tipos de mensajes
- Solicitud de Autorización, este mensaje lo genera el punto de venta cada vez que se requiere autorizar una operación. Se envían los datos requeridos de acuerdo al tipo de operación. Adicionalmente se envía información de control de mensajes.
- Respuesta de Autorización, este mensaje lo genera VTOL para el punto de venta, en respuesta a cada Solicitud de Autorización y contiene información tanto de resultado de la operación como de control.
- Confirmación (Tercer mensaje), este mensaje lo genera el punto de venta para informar como ha terminado de procesar la respuesta de una operación. No se genera respuesta para este mensaje.
- Solicitud de Control de Pendientes, este mensaje lo genera el punto de venta, para asegurar que ha confirmado el estado de todas las operaciones.
- Respuesta de Control de Pendientes, este mensaje lo genera VTOL para el punto de venta, en respuesta a cada Solicitud de Control de Pendientes e informa si existen operaciones pendientes de confirmación.
...
1.4 Estructura de los mensajes
Para referencia sobre la estructura de cada uno de los tipos de mensajes mencionados con antelación, consultar el documento "Mensajería POS – VTOL" ubicado en el repositorio del producto VTOL.
...
...
1.5 Mecanismo de "Tercer Mensaje"
...
...
1.5.1 Descripción
El tercer mensaje es un mecanismo para asegurar la consistencia y concordancia de las transacciones realizadas que son registradas en VTOL.
...
El tercer mensaje puede enviarse "embebido" en un requerimiento. Así en una misma transacción se enviará un requerimiento y la confirmación o reverso de una transacción pendiente.
Importante: Una operación de venta en el POS podrá tener una o más transacciones de pago electrónico validadas por intermedio de VTOL (trx VTOL).
Para el envío del 3er Msg debe establecerse una condición por la que se da por finalizada la venta en el POS. Esta condición podría ser el registro de la transacción o la impresión del comprobante, pero se deberá tener en cuenta que para confirmar una trx VTOL, se tiene que asegurar que la venta que contiene esa trx sea procesada por el POS, que se emitan los comprobantes correspondientes, etc.
Por otro lado, si la venta en el POS se registra como anulada o directamente no se registra (ya sea por pedido del operador, por un error del Controlador Fiscal, etc) debemos estar seguros de que en el 3er Msg de las trx correspondientes vaya la orden de ROLLBACK para esta trx.
...
...
1.5.2 Control de operaciones pendientes (mensaje "CheckPending")
Los mensajes de confirmación no son respondidos por VTOL Server. Además estos mensajes pueden ser embebidos en futuros mensajes de pedido de autorización esto da lugar a que algunas operaciones queden pendientes de confirmación entre dos transacciones distintas. La última transacción antes de el cierre o caída del punto de venta podría ocasionar dicha contingencia ya que no existiría un futuro mensaje de confirmación o pedido de autorización con la confirmación embebida.
Para asegurar que ninguna transacción quedó pendiente de confirmación en VTOL se deberán aplicar los siguientes pasos:
...
- El punto de venta enviara un mensaje de chequeo de pendientes "CheckPending" a VTOL.
- VTOL Server verificará la existencia de transacciones pendientes en su base, en caso de existir responderá el mensaje con el identificador (ID) de la transacción pendiente.
- El punto de venta deberá confirmar dicha transacción (Commit/Rollback) y enviar un nuevo mensaje de chequeo de pendientes. Nótese que esto se podría realizar en un solo paso, enviando un mensaje de chequeo de pendientes con la confirmación embebida.
- Se deberá repetir el proceso hasta tanto existan transacciones pendientes en VTOL. Cuando ya no existan VTOL responderá APROBADA.
...
...
1.5.3 Tercer Mensaje con múltiples operaciones
También existe la posibilidad de deshabilitar el chequeo de pendientes. Esto permite realizar un conjunto de transacciones que podrán ser confirmadas o reversadas posteriormente. Por ejemplo:
...
- TransactionTypeFieldId debe tener el valor UnSyncCompletion
- DateTimeFieldId
- NodeFieldId (debe ser el valor recibido en este mismo campo en el mensaje de respuesta de la transacción original que se intenta completar)
- TrxIdFieldId (debe ser el valor recibido en este mismo campo en el mensaje de respuesta de la transacción original que se intenta completar)
- TrxActionFieldId (este campo define si lo que se quiere hacer es confirmar la transacción (UnSyncCommit), o bien reversarla (Rollback))
...
...
2. Uso de la librería
...
...
2.1 Implementación
Se pueden adoptar diferentes políticas al momento de implementar la librería cliente.
Una de ellas es implementarla en cada punto de venta, por lo cual se le deberá incorporar la lógica suficiente a cada uno para que puedan manejar la librería y mediante la misma comunicarse con VTOL Server.
...
Un ejemplo de esta modalidad sería el uso de la librería en un sitio WEB donde no necesariamente existen nodos estáticos.
...
2.2 Modalidades
Como se explicó con anterioridad la librería cuenta con dos modalidades, por lo tanto, en Java existen dos implementaciones:
...
- StaticVTOLClient
- Esta implementación está orientada a ser utilizada por cada punto de venta donde el Originador y el Nodo sean fijos.
- DinamicVTOLClient
- Esta implementación está orientada a concentrar varios puntos de venta donde el Originador sea fijo y el nodo se obtenga de forma dinámica entre la librería y VTOL (Se hace por medio de un mensaje HandShake).
- VirtualVTOLClient
- Esta implementación está orientada a ser utilizada por varios puntos de venta o en un ambiente de e-commerce donde el Originador sea fijo y VTOL gestione la asignación de nodos (Locales virtuales).
...
...
...
2.2.1 Pasos para el uso
Para utilizar la librería java hay que seguir los siguientes pasos:
...
- crear una instancia de VTOLClient.
- cargarle los parámetros correspondientes.
- inicializar el cliente
- tomar un nodo
- construir una transacción.
- enviar el mensaje.
- devolver el nodo.
...
2.2.2 Parámetros posibles de inicialización
Las siguientes constantes deben ser inicializadas para hacer uso de la librería:
...
Nombre constante | Descripción | |||||||||||||||
HOSTIP
| Identifica el parámetro que se usa para determinar la IP de VTOL Server | |||||||||||||||
HOSTPORT
| Identifica el port TCP al cual se tiene que conectar con VTOL Server | |||||||||||||||
RESPONSETIMEOUT | [Opcional] Tiempo máximo en (milisegundos) de espera para un respuesta de VTOL server antes de salir por timeout. Superado este tiempo se lanza la excepción TimeoutClientException.
Valor por defecto 30000. | |||||||||||||||
TIMEOUTCONNECTIONHOST | [Opcional] Tiempo máximo de conexión a VTOL Server expresado en milisegundos. Superado este valor y no lograda la conexión, se arroja la excepción VtolClientException
Un valor de cero significa infinito.
Valor por defecto 20000. | |||||||||||||||
TIMEOUTOBTAINNODE
| Tiempo máximo en milisegundos a esperará antes de arrojar una excepción al tratar de obtener un nodo. | |||||||||||||||
TIMEOUTEXPIRATIONNODE
| Identifica el parámetro utilizado para indicar el tiempo en liberar un nodo. En caso de no liberarse dentro de ese tiempo, será liberado por la aplicación. | |||||||||||||||
USEVTOLCLIENTFINDER
| Establece la utilización o no del VTOLClientFinder. True False (valor por defecto) | |||||||||||||||
CLIENTFINDER | [Opcional] R (siempre determinada realizar un Rollback de la transacción pendiente) C (siempre determinada realizar un Commit de la transacción pendiente, valor por defecto) ar.com.synthesis.vtol.client.VtolClientFinder y configurarla antes de inicializar la librería, por ejemplo: vtolClientLib.setVtolClientFinder(new MyTrxFinder()); vtolClientLib.init(); | |||||||||||||||
USEENCRYPTEDDATA | Establece la utilización de encriptación en los mensajes.
| |||||||||||||||
ENCRYPTER | [Opcional]
| |||||||||||||||
ENCRYPTKEY | [Opcional] | |||||||||||||||
USEPENDINGAUTOMATIC
| [Opcional] True False (valor por defecto) | |||||||||||||||
TOTALNODESNUMBER
| [Opcional] | |||||||||||||||
DEFAULTTRANSACTIONSTATUS
| [Opcional] C (valor por defecto) R | |||||||||||||||
INITIALNODENUMBER
| [Opcional] | |||||||||||||||
VTOLCLIENTLIBCONFIGPATH
| [Opcional] | |||||||||||||||
PRECONFIGUREDFIELDSFILENAME
| [Opcional] | |||||||||||||||
PRECONFIGUREDFIELD
| [Opcional]
| |||||||||||||||
SSLENABLED | Indica cuando la comunicación con VTOL está sobre SSL:
| |||||||||||||||
SSLKEYSTORE | Ruta del archivo que contiene los certificados que se usaran para la validación. OBLIGATORIO cuando el parámetro SSLENABLED es True. | |||||||||||||||
SSLKEYSTOREPASSWORD | Contraseña del archivo que contiene los certificados que se usaran para la validación. OBLIGATORIO cuando el parámetro SSLENABLED es True. Valor por defecto: nosotros. | |||||||||||||||
SSLPROTOCOL | Versión de protocolo SSL/TLS. OBLIGATORIO cuando el parámetro SSLENABLED es True. Valores posibles:
|
...
2.2.3 Métodos de VTOLClient
Method Summary | |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
...
...
2.2.4 Métodos de VTOLNode
Method Summary | |
|
|
|
|
| |
| |
| |
|
|
| |
|
|
|
|
|
|
| |
| |
| |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
2.2.5 Interface VTOLClientFinder
Esta interface la debe implementar una clase para poder setearse como el VTOLClientFinder de la librería. Esta clase cumple con la función de determinar qué hacer si existe una transacción para cual VTOL Server no conoce su estado. Cuando VTOL Server contesta un requerimiento indicando que una transacción está pendiente, librería llama al método getTransaction() para determinar qué acción debe tomar con esta transacción. La clase seteada por default para esta función devuelve siempre "Commit". La clase que se setee como tal, deberá buscar en la base de datos de la aplicación cual es el estado de la misma y devolverlo para su correspondiente proceso.
Âncora | ||||
---|---|---|---|---|
|
Âncora | ||||
---|---|---|---|---|
|
...
2.2.6 Manejo de errores
public class VtolClientException extends java.lang.Exception
...
Constructor Summary |
VtolClientException(java.lang.String _messageString) |
VtolClientException(java.lang.String _codeString, java.lang.String _messageString) |
...
...
...
Method Summary | |
java.lang.String | getCode() |
...
2.2.7 Encriptación
La librería brinda la posibilidad de encriptar los mensajes con el algoritmo DES y Triple DES utilizando la clase DES.
...
(Ejemplo, ver 3.3 Acceso a VTOL/Server desde Java con encriptación de mensajes)
...
...
2.2.8 Campos Pre-configurados
La librería de Java proporciona la funcionalidad adicional de indicar campos previamente configurados que se enviarán directamente en los mensajes a VTOL. Existen formalmente dos maneras de realizar esta configuración, ya sea a través de los parámetros de inicialización o bien a través de un archivo xml (proporcionado con la aplicación). A continuación se detalla cada uno de estos casos.
Inicialización
La desventaja que tiene esta manera de configurar es que solamente se puede proporcionar un campo pre-configurado. Por este motivo se recomienda que si se requiere tener más de uno de estos campos, se utilice el enfoque de la configuración vía XML.
Los parámetros configurados previamente se pueden agregar al proceso de inicialización del cliente de VTOL que se decida utilizar (estático o dinámico). A continuación se muestra un ejemplo de inicialización de un cliente estático indicando el bloque de inicialización
Bloco de código |
---|
… |
...
//seteo de parmatros, como ser conexión, timeout, encriptacion, etc. |
...
staticVTOLClient.setParameter("HOSTIP","127.0.0.1"); |
...
staticVTOLClient.setParameter("HOSTPORT","3000"); |
...
staticVTOLClient.setParameter("TIMEOUTCONNECTIONHOST","3000"); |
...
staticVtolClient.setParameter("RESPONSETIMEOUT","30000"); |
...
staticVTOLClient.setParameter("TIMEOUTEXPIRATIONNODE","10000"); |
...
staticVTOLClient.setParameter("TIMEOUTOBTAINNODE","10000"); |
...
staticVTOLClient.setParameter("USEVTOLCLIENTFINDER",""); |
...
staticVTOLClient.setParameter("USEENCRYPTEDDATA","False"); |
...
staticVTOLClient.setParameter("ENCRYPTKEY",""); |
...
staticVTOLClient.setParameter("ENCRYPTER",""); |
...
//Inicialización del campo previamente configurado. |
...
staticVtolClient.setParameter("PRECONFIGUREDFIELD","115,2,1,1"); |
...
… |
El nombre del parámetro necesariamente es PRECONFIGUREDFIELD
El valor del parámetro está compuesto por 4 valores separados por comas, a continuación se detallan los mismos:
...
Como se puede ver esta manera de configurar parámetros da cierta flexibilidad en caso de tener bien identificado un campo que se quiera manejar como constante y que aplique para una de las combinaciones anteriormente descritas. Sin embargo si se desea tener mayor flexibilidad es conveniente utilizar la configuración por XML que se detalla a continuación.
Configuración vía XML
Para las configuraciones a través de archivos XML tenemos más flexibilidad. Además no requiere de modificación alguna en la implementación de la librería por parte del cliente, ya que toda la configuración se hace por fuera.
La parte fundamental de este enfoque es el archivo XML, a continuación se muestra la estructura del mismo:
Bloco de código |
---|
<?xml version="1.0" encoding="UTF-8"?> |
...
<fields-configuration> |
...
<preconfiguredField> <!-- This field is the originIndicator --> |
...
<originator> <originatorId>*</originatorId> <node> <nodeId>*</nodeId> </node> </originator> </preconfiguredField> </fields-configuration> |
El archivo está compuesto por un tag principal llamado fields-configuration este tag contendrá cada uno de los campos previamente configurados que serán identificados con el tag preconfiguredField. La estructura de cada campo se muestra a continuación:
...
Nota |
---|
Nota: Es muy importante verificar que en el mismo directorio donde se están depositando tanto estas librerías como la del cliente de VTOL, no exista un JAR con una versión anterior a las provistas aquí. |
...
...
...
2.2.9 Parámetros Pre-configurados
Los parámetros configurados se utilizan para proporcionar a VTOL una inicialización a través de un archivo de configuración que se encuentra en la misma ruta donde se encuentra la librería como tal.
...
Archivo Properties
El archivo de propiedades que se muestra a continuación incluye la un ejemplo de configuración tomando como referencia el ejemplo de inicialización de este documento.
Bloco de código |
---|
HOSTIP = 127.0.0.1 |
...
HOSTPORT = 3000 |
...
TIMEOUTCONNECTIONHOST = 3000 |
...
RESPONSETIMEOUT = 3000 |
...
TIMEOUTEXPIRATIONNODE = 10000 |
...
TIMEOUTOBTAINNODE = 10000 |
...
USEVTOLCLIENTFINDER = |
...
USEENCRYPTEDDATA = False |
...
ENCRYPTKEY = |
...
ENCRYPTER = |
...
#Parameters for DynamicVtolClient initialization |
...
TOTALNODESNUMBER = 5 |
...
DEFAULTTRANSACTIONSTATUS = C |
Nota si se utiliza inicialización por archivo y por código, siempre se tomará en cuenta la del código antes que la del archivo externo.
En caso de que dicha configuración esté situada en otro directorio, se puede hacer uso del parámetro de configuración VTOLCLIENTLIBCONFIGPATH para indicar el directorio raíz.
Por ejemplo:
vtolClient.setParameter(VtolClientConstants.VTOLCLIENTLIBCONFIGPATH,"D:/client-lib/config/");
Como se puede observar, solamente se indica el PATH absoluto donde reside tal archivo de configuración.
...
...
2.2.10 Logging
La librería Java genera trazas para poder evaluar posibles comportamientos o errores.
...
[PATH_ABSOLUTO_ARCHIVO_CONFIGURACION] corresponde al path y nombre de archivo completos de donde se encuentra el archivo de configuración del logeo.
...
...
3. Ejemplos de uso de la librería
...
3.1 Acceso a VTOL Server desde Java
...
...
3.1.1 Ejemplos de modo de uso
...
Static
Bloco de código |
---|
StaticVtolClient staticVtolClient = (StaticVtolClient)VtolClient.getStaticVtolClient("12345"); /** * a) Seteo de parámetros: Como primer paso se deberán setear los parámetros correspondientes por * medio del método setParameter, y setear el originador que se utilizará para tomar * correctamente la configuración de Vtol Server. */ staticVtolClient.setParameter(VtolClientConstants.HOSTIP,"127.0.0.1"); |
...
staticVtolClient.setParameter(VtolClientConstants.HOSTPORT,"3000"); |
...
staticVtolClient.setParameter(VtolClientConstants. |
...
RESPONSETIMEOUT," |
...
5000"); |
...
staticVtolClient.setParameter(VtolClientConstants. |
...
TIMEOUTCONNECTIONHOST," |
...
0"); |
...
staticVtolClient.setParameter(VtolClientConstants.USEVTOLCLIENTFINDER,"False"); |
...
staticVtolClient.setParameter(VtolClientConstants.CLIENTFINDER,VtolClient.COMMITSTATUS); |
...
staticVtolClient.setParameter(VtolClientConstants.USEENCRYPTEDDATA,"False"); |
...
staticVtolClient.setParameter(VtolClientConstants.ENCRYPTKEY,"synthesissynthesissynth"); |
...
staticVtolClient.setParameter(VtolClientConstants.ENCRYPTER,"DESede"); |
...
/** * b) Inicialización: Se deberá llamar al método init, el cual realizará la inicialización de la librería * tomando los parámetros configurados en Vtol Server. */ staticVtolClient.init(); /** * c) Nodo: se deben setear los campos correspondientes a la transacción según el nodo/caja * correspondiente. */ String nodeId = "2"; try{ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String dateTime = dateFormat.format(new java.util.Date()); VtolNode vtolNode = staticVtolClient.createNode(nodeId); vtolNode.setStatus(NodeStatus.INUSE); vtolNode.createTransaction(); vtolNode.addField(3, "VTOL"); vtolNode.addField(4, "DATA"); vtolNode.addField(11, "Sale");//tipo de transaccion vtolNode.addField(25, dateTime); vtolNode.addField(6, "5294948333925257");//PAN vtolNode.addField(9 , "5294948333925257=101210100000212"); //Track2FieldId vtolNode.addField(10, "MSR");//modo de ingreso vtolNode.addField(12, "15000");//importe vtolNode.addField(13, "$");//moneda vtolNode.addField(14, "1");//cuotas vtolNode.addField(15, "0");//plan //se envia a VTOL SERVER System.out.println("Envio de transaccion a VTOL SERVER"); vtolNode.sendTransaction(); //Obtención de la respuesta al requerimiento enviada por VTOL. Message responseMessage = vtolNode.getCurrentTransaction().getResponseMessage(); |
...
//forma de obtener un campo de la respuesta. |
...
String _responseCodeString = responseMessage.getField(26).getValue(); |
...
if ( _responseCodeString.equalsIgnoreCase("ISO8583")) |
...
{ String _isoResponseCodeString = responseMessage.getField(27).getValue(); |
...
if ("00".equals(_isoResponseCodeString)) {// |
...
aprobada System.out.println("Transaccion aprobada."); System.out.println("Codigo de autorizacion: " + responseMessage.getField( |
...
22).getValue()); |
...
//como fue aprobada entonces hay un id de transaccion que sirve para enviar el tercer mensaje (confirmacion) String transactionIdString = responseMessage.getField(24).getValue(); vtolNode.createTransaction(); |
...
vtolNode.addField(3, "VTOL"); |
...
vtolNode.addField(4, "Data"); |
...
vtolNode.addField(11, "UnSyncCompletion"); |
...
vtolNode.addField(25, dateTime); |
...
vtolNode.addField(24, |
...
transactionIdString); |
...
vtolNode.addField(19, "Commit"); |
...
System.out.println(" |
...
Confirmacion de trxId: " + |
...
transactionIdString); |
...
vtolNode.sendTransactionWithoutResponse(); |
...
}else{
System.out.println("Transaccion rechazada: " + responseMessage.getField(28).getValue());
}
}else{
System.out.println("Transaccion con error: " + responseMessage.getField(28).getValue());
}
vtolNode.setStatus(NodeStatus.AVAILABLE);
}catch (Exception e) {
e.printStackTrace();
} |
3.1.2 Ejemplos de modo de uso Dinámico
Bloco de código |
---|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
DinamicVtolClient dinamicVtolClient = (DinamicVtolClient)VtolClient.getUniqueInstanceOfVtolClient();
try{
/*
* a) Seteo de parámetros: Como primer paso se deberán setear los parámetros correspondientes por
* medio del método setParameter, y setear el originador que se utilizará para tomar
* correctamente la configuración de Vtol Server.
*/
dinamicVtolClient.setOriginator("1");//Tienda
dinamicVtolClient.setParameter(VtolClientConstants.HOSTIP,"127.0.0.1");
dinamicVtolClient.setParameter(VtolClientConstants.HOSTPORT,"3000");
dinamicVtolClient.setParameter(VtolClientConstants.RESPONSETIMEOUT,"3000");
dinamicVtolClient.setParameter(VtolClientConstants.TIMEOUTEXPIRATIONNODE,"10000");
dinamicVtolClient.setParameter(VtolClientConstants.TIMEOUTOBTAINNODE,"10000");
dinamicVtolClient.setParameter(VtolClientConstants.USEVTOLCLIENTFINDER,"False");
dinamicVtolClient.setParameter(VtolClientConstants.CLIENTFINDER,"");
dinamicVtolClient.setParameter(VtolClientConstants.USEPENDINGAUTOMATIC,"True");
dinamicVtolClient.setParameter(VtolClientConstants.USEENCRYPTEDDATA,"False");
dinamicVtolClient.setParameter(VtolClientConstants.ENCRYPTKEY,"");
dinamicVtolClient.setParameter(VtolClientConstants.ENCRYPTER,"");
//si la variable TOTALNODESNUMBER no es especificada se usara el HandShake para obtener la lista de nodos de VTOL
dinamicVtolClient.setParameter(VtolClientConstants.TOTALNODESNUMBER,"5");
dinamicVtolClient.setParameter(VtolClientConstants.DEFAULTTRANSACTIONSTATUS,"C");
//dinamicVtolClient.setParameter(VtolClientConstants.CLIENTFINDER,VtolClient.COMMITSTATUS);
//dinamicVtolClient.setParameter(VtolClientConstants.USEPENDINGAUTOMATIC,"True");
dinamicVtolClient.setParameter(VtolClientConstants.PRECONFIGUREDFIELDSFILENAME,"D:/svn/vtol-client/dev/client-core/src/main/resources/vtol-client-preconfigured-fields.xml");
/*
* b) Inicialización: Se deberá llamar al método init, el cual realizará la inicialización de la librería
* tomando los parámetros configurados en Vtol Server.
*/
dinamicVtolClient.init();
/*
* c) Nodo: se deben setear los campos correspondientes a la transacción según el nodo
* correspondiente.
*/
String dateTime = dateFormat.format(new java.util.Date());
//se obtiene la caja/terminal
VtolNode vtolNode = dinamicVtolClient.getNode();
vtolNode.createTransaction();
vtolNode.addField(3, "VTOL");
vtolNode.addField(4, "DATA");
vtolNode.addField(11, "Sale");//tipo de transaccion
vtolNode.addField(25, dateTime);
vtolNode.addField(10, "Manual");//modo de ingreso
vtolNode.addField(6, "5432219380000102");//PAN
vtolNode.addField(7, "2010");//fecha de vencimiento
vtolNode.addField(8, "123"); //cvc
vtolNode.addField(12, "1000");//monto
vtolNode.addField(13, "$");//moneda
vtolNode.addField(14, "1");//cuotas
vtolNode.addField(15, "0");//plan
//envio de transaccion
System.out.println("Envio de transaccion a VTOL SERVER");
vtolNode.sendTransaction();
System.out.println("");
Message responseMessage = vtolNode.getCurrentTransaction().getResponseMessage();
String responseCodeString = responseMessage.getField(26).getValue();
if (responseCodeString.equalsIgnoreCase("ISO8583")) {
String isoResponseCodeString = responseMessage.getField(27).getValue();
if ("00".equals(isoResponseCodeString)) {//aprobada
System.out.println("Transaccion aprobada.");
System.out.println("Codigo de autorizacion: " + responseMessage.getField(22).getValue());
//como fue aprobada entonces hay un id de transaccion que sirve para enviar el tercer mensaje (confirmacion)
String transactionIdString = responseMessage.getField(24).getValue();
vtolNode.createTransaction();
vtolNode.addField(3, "VTOL");
vtolNode.addField(4, "Data");
vtolNode.addField(11, "UnSyncCompletion");
vtolNode.addField(25, dateTime);
vtolNode.addField(24, transactionIdString);
vtolNode.addField(19, "Commit");
System.out.println("Confirmacion de trxId: " + transactionIdString);
vtolNode.sendTransactionWithoutResponse();
}else{
System.out.println("Transaccion rechazada: " + responseMessage.getField(28).getValue());
}
}else{
System.out.println("Transaccion con error: " + responseMessage.getField(28).getValue());
}
dinamicVtolClient.freeNode(vtolNode);
}catch (Exception e) {
e.printStackTrace();
} |
3.1.3 Ejemplos de modo de uso Virtual
Bloco de código |
---|
try{
VirtualVtolClient virtualVtolClient = new VirtualVtolClient();
//inicializacion de parametros generales
virtualVtolClient.setParameter(VtolClientConstants.HOSTIP,"IP_VTOL"); //IP de VTOL SERVER
virtualVtolClient.setParameter(VtolClientConstants.HOSTPORT,"3000"); //PUERTO de VTOL SERVER
virtualVtolClient.setParameter(VtolClientConstants.TIMEOUTCONNECTIONHOST,"3000");
virtualVtolClient.setParameter(VtolClientConstants.RESPONSETIMEOUT,"15000");
virtualVtolClient.setParameter(VtolClientConstants.USEVTOLCLIENTFINDER,"False");
virtualVtolClient.setParameter(VtolClientConstants.CLIENTFINDER,"");
virtualVtolClient.setParameter(VtolClientConstants.USEENCRYPTEDDATA,"False");
virtualVtolClient.setParameter(VtolClientConstants.ENCRYPTKEY,"");
virtualVtolClient.setParameter(VtolClientConstants.ENCRYPTER,"");
//seteo de numero de tienda
virtualVtolClient.setOriginator("CODIGO_TIENDA");
//Inicialización: Se deberá llamar al método init, el cual realizará la inicialización de la librería
//tomando los parámetros configurados en Vtol Server.
virtualVtolClient.init();
//se obtiene una caja/terminal de forma dinamica
VtolNode vtolNode = virtualVtolClient.getNode();
//se crea una transaccion
vtolNode.createTransaction();
//se agregan los datos de la transaccion
vtolNode.addField(11, "Sale");//tipo de transaccion
vtolNode.addField(3, "VTOL");
vtolNode.addField(4, "DATA");
vtolNode.addField(25, VtolNode.DATEFORMAT.format(new java.util.Date()));//fecha
vtolNode.addField(10, "Manual");//Modo de ingreso
vtolNode.addField(6, "5432219380000102");//PAN
vtolNode.addField(7, "2010");//fecha de expiracion
vtolNode.addField(8, "123");//CVC
vtolNode.addField(12, "10000");//monto
vtolNode.addField(13, "$");//moneda
vtolNode.addField(14, "1");//cuotas
vtolNode.addField(15, "0");//plan
//se envia a VTOL SERVER
System.out.println("Envio de transaccion a VTOL SERVER");
vtolNode.sendTransaction();
//se obtiene la repsuesta
Message responseMessage = vtolNode.getCurrentTransaction().getResponseMessage();
//se analiza el campo 26
String responseCodeString = responseMessage.getField(26).getValue();
if (responseCodeString.equalsIgnoreCase("ISO8583")) {
//se obtiene el campo 27, codigo de repsuesta
String _isoResponseCodeString = responseMessage.getField(27).getValue();
if ("00".equals(_isoResponseCodeString)) {//aprobada
System.out.println("Transaccion aprobada.");
System.out.println("Codigo de autorizacion: " + responseMessage.getField(22).getValue());
//como fue aprobada entonces hay un id de transaccion que sirve para enviar el tercer mensaje (confirmacion)
String _transactionIdString = responseMessage.getField(24).getValue();
vtolNode.createTransaction();
vtolNode.addField(3, "VTOL");
vtolNode.addField(4, "Data");
vtolNode.addField(11, "UnSyncCompletion");
vtolNode.addField(25, VtolNode.DATEFORMAT.format(new java.util.Date()));
vtolNode.addField(24, _transactionIdString);
vtolNode.addField(19, "Commit");
System.out.println("Confirmacion de trxId: " + _transactionIdString);
//se envia tercer mensaje sin esperar respuesta
vtolNode.sendTransactionWithoutResponse();
}else{
System.out.println("Transaccion rechazada: " + responseMessage.getField(28).getValue());
}
}else{
System.out.println("Transaccion con error: " + responseMessage.getField(28).getValue());
}
}catch (Exception e) {
e.printStackTrace();
}
|