ISO-8583 en Java

Para inaugurar mi blog, hablaré de un proyecto de software libre que tengo: j8583, también conocido como Java-ISO8583. Es una implementación semi-abstracta del protocolo transaccional de comunicación ISO-8583, que puede ser algo complicado y/o tedioso de implementar. UPDATE: Aquí he puesto una breve descripción en español.

ISO8583 es un protocolo transaccional de comunicación, muy utilizado en bancos, también se usa con puntos de venta (las terminales de tarjeta de crédito por ejemplo), y últimamente también se está usando para transaccionar con carriers de telefonía celular. No voy a entrar a detalle en el protocolo como tal. Se puede obtener (pagando) del sitio de ISO.

Para poder utilizar esta librería, se requiere conocer el protocolo en sí. Tiene licencia LGPL, de modo que se puede usar en aplicaciones comerciales cerradas; si hacen una aplicación que se redistribuye (software que venden, etc) solamente deben entregar los fuentes de la librería, junto con cualquier modificación que le hagan.

El paquete incluye ejemplos de una implementación de un cliente que envía y recibe mensajes de ISO8583, así como un server que recibe conexiones y atiende a varios clientes usando ISO8583. Se puede usar de modo binario o ASCII (lo más común).

La página del proyecto es http://github.com/chochos/j8583 y por supuesto http://j8583.sourceforge.net/

La documentación y la página las puse en inglés para no excluir a gente de otros países que puedan usar el proyecto. No he tenido tiempo de traducir nada (los javadoc de hecho no sabría cómo generarlos en español, fuera de tomar los HTML generados y traducirlos). La configuración de la fábrica de mensajes (la parte central de la librería) es bastante sencilla, a través de un archivo XML donde se definen plantillas para los tipos de mensaje que se van a crear, así como definiciones de los mensajes que se van a leer, indicando los campos esperados, con su longitud y tipo. De los campos indicados en las definiciones de respuestas, solamente se leen los que se indiquen en el bitmap de una respuesta. De esta manera, leer los mensajes ya es algo automático, todo el código para parseo de respuestas está en la fábrica de mensajes, no es necesario implementar algo adicional.

Los mensajes creados por la fábrica de mensajes son editables, pueden modificarse, agregarse o quitarse campos. La idea es que la fábrica genere nuevos mensajes ya con todos los valores fijos para el tipo de mensaje, y que solamente se tengan que asignar los valores que cambian. Incluso los dos valores que generalmente cambian, los campos 7 (fecha) y 11 (trace), se pueden asignar por la fábrica, poniendo la fecha actual a cada mensaje recién creado y usando un TraceNumberGenerator (una interfaz cuya implementación pueden proveer ustedes) para asignarle un trace en el campo 11 a cada mensaje generado.

Espero les sea de utilidad. Cualquier duda me pueden contactar directamente en SourceForge, registrando cualquier defecto que encuentren y poniendo ahí sus dudas.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

ezamudio, como estas ?

ezamudio, como estas ? primero que nada, gracias por tu soporte.

lo que estoy codificando para imprimir es en el run de la clase Processor

for (int i=0; i<msg.length;i++)
                System.out.print(msg[i]);

que muestra esta salida:
96054-865440114605-1280-47-12820228071547080488000000016183820761618-125207683818701805408210110011211111567694950495432323232323232323232324514848560348484956535609821011008079835446480749494849545248

si lo paso a ASCII con la funcion:

  for (int i = 0; i < msg.length; i++) {
                    resultado += Integer.toString((msg[i] & 0xff) + 0x100, 16).substring(1);
            }
            System.out.println(resultado);

esta es la salida:
600036aa360400723c058000d180141650473607005030080000000000000010010826140706101283140706082612070012003600526564706f734345313231362020202020202020202020043330303800033030313835380009526564504f53362e30000731313031363430

para que nos anduviera invocamos a Server.mfact.parseMessage(msg, 5);
con parametro 5 en vez de 12.

y seteamos Server.mfact.setUseBinaryMessages(true);

te parace bien realizar estos cambios ?
así igual estamos teniendo problemas en leer el campo 2,
lo estamos seteando como LLVAR ... supongo que sera que esta mal la posición donde comienza a leer ...

si lo seteamos como Numerico de 15 ... el campo 2 nos sigue dando mal , pero el resto de los campos bien.

gracias por tu ayuda y saludos,
jp

Imagen de ezamudio

bytes...

Primero:
Esa salida no tiene el menor sentido porque estás imprimiendo el valor decimal de cada byte. No sé si el primer byte es 9 o 96. Para pasarlo a ASCII lo más fácil sería que hicieras new String(msg) y luego imprimas eso, no le veo el caso a todo ese ciclo y de hecho no entendí esa conversión.

Segundo:
Están usando encabezados ISO? no confundir con el encabezado de longitud del mensaje. Un mensaje sin encabezado ISO empieza con el tipo de mensaje (por ejemplo 0200) pero uno con encabezado ISO empieza con.... el encabezado ISO. Por ejemplo si el encabezado fuera "HOLA" el mensaje comenzaría HOLA0200.
Entonces, no puedes estar pasando valores arbitrarios al metodo parseMessage y esperar que salga algo. Tienes que darle la longitud del encabezado ISO que trae el mensaje. Esto es para que ignore esos bytes y comience a parsear el tipo de mensaje en la posición que le indicas (en este caso era 12, supongo que lo tomaron de los ejemplos) y lo cambiaste a 5. Si el encabezado ISO fuera "HOLA" tendrías que pasarle 4. Si no están usando encabezado ISO, pásale 0.

Tecero... no entiendo cómo pueden parsearse el resto de los campos si no se parseó el campo 2. Por la manera en que se codifican los mensajes ISO8583, si un campo no se puede parsear, ya no se pueden parsear el resto de los campos.
En la config del MessageFactory necesitas indicar todos los campos que esperas parsear con el tipo correcto, eso lo tomas de la especificación que te haya dado quien sea que te vaya a mandar los mensajes.

ISO no puro

si ... ahora veo el problema, el tema que no estoy usando ISO 8583 "puro", estamos usando una re-especificación de ISO (que es lo que usan en mi pais), un resumen podría decirse ... de ahí porque el tamaño de los headers son distintos.

hay alguna manera de difinir tipos de headers ? veo que hay algo con el config ... pero no termino de entenderlo.

otro problema que estamos teniendo es para los campos numéricos empaquetados de largo variable ...
por ahora lo hemos solucionado poniendo unos if por ahi ... ya que solamente son dos campos, supongo que has previsto este tema y por algo has dejado CustomField, no ? (capaz que es una mala interpretación mia).

muchas gracias,
el proyecto nos ha sido de grande ayuda, para entender la norma,
y seguramente lo incluyamos en nuestro py .

saludos

Imagen de ezamudio

Inclusión

Asegúrate de que no metan el código tal cual dentro de tu aplicación, sino que tiene que ser una librería aparte, para respetar la licencia LGPL con la que publiqué el proyecto.

Si es una aplicación que ustedes van a ejecutar (lo más común) no hay problema, pero si es un software que piensan redistribuir a clientes suyos, deben entregar el código fuente de j8583 junto con las modificaciones que ustedes hayan realizado a mi código.

En cuanto a los campos numéricos de largo variable, supongo que entonces están usando codifcación binaria y no ASCII... el problema ahí es que hay quienes consideran que el largo del campo LLVAR debe ser el número de bytes, mientras que algunos consideran que debe ser el número de dígitos. Simplemente modifica el código para LLVAR con codificación binaria para el caso que necesiten ustedes. Y avísame si están contando dígitos o bytes para saber, y después conforme haya otros proyectos que me digan una u otra opción, puedo cambiar el default para que quede como la mayoría lo usa.

El CustomField sirve para que puedas meter un objeto cualquiera a un campo del mensaje ISO8583. Solamente necesita saber codificarse a un String para su inclusión y también saber decodificarse a partir de la cadena que venga en un mensaje.

donde ?

Si tengo claro lo de la licencia, las modificaciones las estamos haciendo sobre tu código. Igualmente la aplicacion no se va a distribuir, va a hacer de uso interno.

Donde es que debería modificar para que LLVAR vaya con codificación binaria ?
pense que era en IsoValue.LLVAR(true, 0) pero no ...

saludos,
jp

Imagen de ezamudio

IsoValue.toString() es el

IsoValue.toString() es el método que codifica el valor interno del campo, pero solamente el valor, y write() es el que codifica distinto si es binario o ASCII y que en caso de LLVAR/LLLVAR agrega el encabezado de longitud del campo.

Ayuda

Hola Enrique, primero que todo felicitarte por facilitarnos un poco la vida con esta pagina llena de buenos recursos para quienes son expertos en programacion Java y para quienes estamos hasta ahora conociendo un poco de este lenguaje, Buen trabajo. Solo quiero hacerte una pregunta de como puedo hacer correr la aplicacion de ISO8583 que tienes, he descargado el ejemplo pero no he logrado hacerlo correr para saber como funciona, estoy desarrollando una aplicacion movil para recargas y necesito saber como funciona...para tener una idea de como funciona tu aplicacion...Perdoname si mi pregunta es un poco infantil...

Gracias

Ayuda

Un saludo muy especial Enrique, como lo he dicho que buen trabajo que haces, pero bueno, el motivo es saber si alguien me puede echar una mano con esto de manejo de tramas en mensajes...La verdad es que soy un poco nuevo en este tema, estamos implementando un sistema de recarga por telefono movil pero no estamos utilizando ISO 8583, alguno de ustedes me puede indicar con un tutorial como manejar el mismo concepto de ISO 8583 pero con tramas propias?

O si depronto tienen un hilo en donde pueda encontrar algun ejemplo de esto en java ME

Gracias por su ayuda

Imagen de ezamudio

ISO

j8583 es una implementación en Java del protocolo ISO8583, publicado por la ISO. En su sitio puedes bajar el estándar completo. Para usar la librería tienes que saber algo de cómo se forman los mensajes; en el sitio oficial de j8583 viene una explicación del protocolo, no muy a fondo pero es algo. Si bajas la versión más reciente directo del repositorio, puedes ver el código fuente de los ejemplos, tanto servidor como cliente (me suena a que quieres implementar un cliente).

No sé a qué te refieras con tramas propias y luego dices que NO estás usando ISO8583 entonces ya no entendí para qué quieres info del protocolo, pero pues los mensajes de ISO8583 son configurables, tú le pones los campos que necesites y/o que están esperando del otro lado (la entidad con la que te vas a conectar te debe dar su especificación de los campos que están esperando para cada tipo de mensaje). Y tú haces una config en XML para leer las respuestas y poder parsearlas y convertirlas en mensajes que puedas manejar. Como dije, revisa el código fuente de los ejemplos y por ahí vienen unos scripts para que los puedas correr; echas a andar el ejemplo del servidor y luego el del cliente, simplemente intercambian varias tramas usando la misma config. Pero eso te puede dar una idea de cómo implementar tu cliente.

Ayuda

Hola, soy estudiante y para mi proyecto quiero hacer una aplicacion tipo cliente para recargas electronicas por telefono celular, tengo ya elaborada la parte del manejo del socket pero ahora mi profesor me pide los siguientes datos para la parte de la trama: Identificacion de la MAC del Cliente, Nro del IMEI del movil, Fecha de la Transaccion, Hora de Transaccion...Puedes guiarme de como debo hacer estas validaciones? Gracias por tu ayuda

Imagen de ezamudio

Campos

Que te digan qué campos tienes que poner y dónde. j8583 solamente te ayuda a armar el mensaje y manejar los tipos de datos como numéricos o alfanuméricos de longitud fija, LLVAR y LLLVAR, fechas largas y cortas, pero todo eso te sirve solamente cuando ya tienes una especificación de los mensajes que tienes que armar. A pesar de ser un estándar, hay muchas maneras distintas de implementarlo en el sentido de que hay muchos campos que cada quien usa de manera distinta. Los más comunes son:

4 - monto (en centavos, 12 posiciones fijo)
7 - fecha y hora del mensaje (10 posiciones en formato MMddHHMMSS)
11 - trace (6 dígitos)
Los campos 13, 14, 15 por lo general son fecha y hora de la transacción, la diferencia es que es la hora en la terminal y el campo 7 es la fecha y hora en que se envia el mensaje desde un concentrador hacia el sistema del proveedor, esto porque comunmente se usa un switch entre las terminales POS y el proveedor.
Campo 48 por lo general son datos de producto pero cada quien los pide en el formato que se le antoja. Campo 37 es el número de referencia (12 dígitos).
Campo 38 es el número de confirmación (6 dígitos en las respuestas), campo 39 es el código de respuesta (2 dígitos en las respuestas).
Campo 49 es el código de moneda (hay una tabla ISO de códigos de moneda por país).
Campo 126 o 128 es el MAC (Message Authentication Code) y hay distintas formas de calcularlos porque hay varios algoritmos.

Me parece muy curioso que te hayan dejado un proyecto de esto en la escuela, nunca había escuchado que alguien se metiera con ISO8583 de manera académica y para algo tan específico como recargas electrónicas por celular.

Ayuda

Es que en lo especifico pues yo escogi el tema porque me parece interesante, ademas es un reto muy personal...Pero se que con tu ayuda y la ayuda del foro lo puedo sacar adelante, entonces el flujograma del producto es mas o menos asi:

1. Registro de usuario: Password y Contrasena
2. Si el password y la contrasena son Ok.. continua y se conecta al servidor ,mendiante socket enviando la informacion del movil al servidor con los siguientes datos: 1D,Usuario,Clave de usuario,1,Serial o IMEI o MAC del movil, 7,
3. El servidor verifica la informacion del cliente,
...
existe algun codigo ejemplo diferente al que pusiste en el hilo de ISO 8583? Podrias decirme como pongo a funcionar el tutorial de ISO que dejaste para poder entender bien como funciona, que debo hacer para verlo funcionando en mi equipo?

Gracias mil

Imagen de ezamudio

Subversion

Baja la versión más reciente directamente del repositorio para que puedas ver el código fuente y tengas los scripts para correr los ejemplos (son para Linux/Mac/UNIX, pero no debe ser difícil adaptarlos para Windows). Necesitas Java 5 como mínimo y si quieres compilar directo de los fuentes del repositorio necesitas ant.

Aquí encuentras la dirección para bajar el código directo del repositorio (requieres un cliente de Subversion).

NetBeans 6.7

Uso NetBeans 6.7, quiere decir que puedo usarlo y correrlo desde NetBeans?

Gracias

Imagen de ezamudio

por qué no...

no veo por qué no. No uso NetBeans así que no sé decirte qué hacer para que importes el proyecto (que está en Eclipse; si ves el folder de eclipse-project tiene el .project y .classpath de Eclipse dentro), pero si NetBeans puede desplegar los archivos Java contenidos en ese folder y correr el script de ant, con eso debería ser suficiente. No sé qué tengas que hacer para correr una clase que tenga un método main en NetBeans.

Error parseando el mensaje en InputStream

SEVERE: ISO8583 MessageFactory has no parsing guide for message type ffffe008 [08
€0‰„YB 9293046960799110101010]

Qué puede estar causando este error?

Estoy haciendo lo siguiente, segun el ejemplo que tenes

public void Reading() {

final Log log = LogFactory.getLog(Main.class);

byte[] lenbuf = new byte[4];
try {
while (sock != null && sock.isConnected()) {
sock.getInputStream().read(lenbuf);

int size = ((lenbuf[0] & 0xff) << 24) | ((lenbuf[1] & 0xff) << 16) | ((lenbuf[2] & 0xff) << 8) | (lenbuf[3] & 0xff);
byte[] buf = new byte[size];

log.info(String.format("Longitud del mensaje %d ", buf.length));
if (sock.getInputStream().read(buf) == size) {
try {
resp = messageFact.parseMessage(buf,0); //AQUI ES DONDE PRESENTA EL ERROR Y POR ENDE NO CONTINUA

log.info(String.format("Read response %s conf %s: %s",
resp.getField(11), resp.getField(37), resp.getField(38)
, resp.getField(39), new String(buf)));
pending.remove(resp.getField(11).toString());

TODO LO DEMAS ESTA FUNCIONANDO (EL LEE LA LONGITUD DEL MENSAJE, ETC... pero cuando intenta hacer el parse da el error de mas arriba)

segun puedo ver este mensaje esta en el metodo parseMessage de la clase messageFactory...

Al imprimir el tipo me dice: -8184

Que puede estar sucediendo aquí?

Imagen de ezamudio

le pasas mal los datos

La longitud del mensaje te la reporta bien? Estás trantando de leer mensajes en ASCII o binario?

Leamos detenidamente lo que dice el mensaje:

MessageFactory has no parsing guide for message type ffffe008 [08€0‰„YB 9293046960799110101010]

Le estás pasando a la fábrica de mensajes un mensaje que comienza con 0xFFFFE008 lo cual me hace pensar que estás usando mensajes en ASCII (lo más común). Los primeros 4 bytes indican el tipo de mensaje (a menos que tengas un encabezado ISO). Normalmente esos 4 caracteres serían algo como "0200" o "0210" etc, que en hexadecimal se verían 0x30323030. Sin embargo parece que leiste datos de otro tipo.

Revisa bien la especificación de los datos que estás leyendo. Parece que esos primeros tres bytes FF, FF, E0 son parte de otra cosa y luego empezaría un mensaje 0800?

Respuesta

Si, me retorna bien la longiud del mensaje, la cual es de 4 bytes. El mensaje que me envian es un 0210 ya que estoy enviando un 0200 en binario, aunque no se como identificar si la respuesta que me envian es en binario o ASCII, supongo que es binario, porque así es como lo envío yo... No utilizo encabezado ISO... Cuando leo las primeras 8 posiciones (por buf[0]....buf[8]) obtengo lo siguiente:

0, 0, 0, 51, 1, 0, 10 ,-128...........

La primera parte es la longitud y lo demás supongo que es parte del mensaje... pero esta extraño..

Esto lo hago luego del if(sock.getInputStream().read(buff) == size), es decir que el mensaje esta en el buffer, ya que entra aquí y me tira la longitud.

Tendrá alguna repercusión el no utilizar el Encabezado ISO y ponerlo en 0 en el ParseMessage?
como lo hago: resp = messageFact.parseMessage(buf,0);

Imagen de ezamudio

La manera de saber si es

La manera de saber si es binario o ASCII lo que tienes que usar es preguntando a los que manejan el sistema al cual te estas conectando. Igual para saber si debes enviar un encabezado ISO o no, y para saber si te estan enviando de vuelta un encabezado ISO. Son cosas que tienen que darte en la especificación de su implementación de ISO8583.

51 bytes se me hace muy poco para un 0210, pero tal vez solamente usan los datos mínimos necesarios, no sé porque todo esto varia mucho de una implementación a otra.

La repercusión de usar 0 en el parseMessage pues es que obviamente si te mandan un encabezado ISO y lo quieres ignorar no se puede parsear el mensaje. Tienes que pasar la longitud exacta del encabezado ISO que estás esperando y nuevamente: eso te lo tienen que decir los del sistema al cual te estas conectando.

Mas

Enrique, antes que nada, gracias por la ayuda...

Ahora, se ha resuelto el problemilla anterior que tenía al recibir la respuesta, pero ahora es esto:

INFO: bitmap: 303801000e800000 // El bitmap recibido
INFO: contenido de bs: {3, 4, 11, 12, 13, 24, 37, 38, 39, 41} // El bitset en messageFactory

Error

INFO: ISO8583 MessageFactory cannot parse field 3 unspecified in parsing guide
Oct 21, 2009 5:14:32 PM cardnet.j8583.MessageFactory parseMessage
INFO: ISO8583 MessageFactory cannot parse field 4 unspecified in parsing guide
El mismo error para todos los demás campos del bitset

Supongo que ese error es por el archivo de configuracion XML. El programa no inicia si dejo un campo sin valor en este archivo; y como es de saber no todos los campos llevaran datos fijos, asi que no se como resolver esta parte tampoco.

Para conocimiento:

Este es un ejemplo de lo que tengo en el template del 0210

000000
111
000
000

Aun así me sale el error de mas arriba y el programa no puede terminar de interpretar el mensaje.

Podes identificar qué puede estar pasando aquí?

Imagen de ezamudio

Config

Definitivamente es problema del config, pero no veo nada de XML, ya viste tu post?

Creo que estás un poco confundido. Necesitas un template para crear mensajes nuevos con campos predefinidos, y necesitas una guia de parseo para leer mensajes. Las guías son con entradas como esta:

<parse type="0210">
  <field num="3" type="ALPHA" length="6" />
  <field num="4" type="AMOUNT" length="12" />
  <field num="11" type="NUMERIC" length="6" />
</parse>

En cambio un template es para decir cómo quieres que salgan los mensajes recién creados por el MessageFactory:

<template type="0200">
  <field num="3" type="ALPHA" length="2">970000</field>
</template>

La guía de parseo debe indicar todos los posibles campos que traiga el mensaje, pero no es obligatorio que un mensaje traiga todos esos campos. Simplemente si un mensaje llega sin uno de los campos en la guía, pues se ignora. Pero el caso contrario sí es grave: si el mensaje indica que trae el campo 40 y la guía no tiene definido el campo 40, no hay manera de saber si ese campo es de longitud fija o variable, y cuánto debe medir, por lo tanto no se puede parsear el resto del mensaje.

Mas

La verdad es que no vi mi post, no me percaté de que no salió el XML

Los campos que me envían son

INFO: bitmap: 303801000e800000 // El bitmap recibido
INFO: contenido de bs: {3, 4, 11, 12, 13, 24, 37, 38, 39, 41} // El bitset en messageFactory

Lo que tengo en el XML es:

<parse type="0210">
        <field num="2" type="LLVAR" />
        <field num="3" type="NUMERIC" length="6" />
        <field num="4" type="AMOUNT" />
        <field num="11" type="NUMERIC" length="6" />
        <field num="12" type="TIME" />
        <field num="13" type="DATE4" />
        <field num="24" type="NUMERIC" length="3" />
        <field num="37" type="ALPHA" length="12" />
        <field num="38" type="ALPHA" length="6" />
        <field num="39" type="ALPHA" length="2" />
        <field num="41" type="ALPHA" length="8" />              
</parse>

Y con esto da el error:
INFO: ISO8583 MessageFactory cannot parse field 3 unspecified in parsing guide (para todos los campos)

No tengo la menor idea de que pueda estar sucediendo...

Imagen de ezamudio

tipo de mensaje

Entonces es obvio que el error te sale porque le pasas un mensaje para cuyo tipo no hay una guía de parseo. Verifica el tipo de mensaje, debes tener un <parse type> para ese tipo de mensaje, que por lo visto no es un 0210.

Perfecto

Listo! todo está perfecto! Implementado y funcionando a la perfección...

Calcular MAC

Hola, llevo un par de meses desarrollando mi propia librería para injectar mensajes para un entorno de pruebas en una entidad financiera. Podrias por favor indicarme los nombres de algoritmos para calcular la MAC. En la documentación de Base24 se indican campos para incluirlos en el calculo de la MAC, pero no sé exactamente si esto se relaciona con el campo128 y la KWA. Te agradecería que me aclaras este asunto y espero también aportar a esta comunidad con lo poco que he aprendido de transacciones POS.

Imagen de ezamudio

Base24

Base24 es una variante de ISO8583 que no es tan estándar y tiene muchas particularidades. Consulta la documentación de ese protocolo para ver lo de MAC porque hay varios algoritmos, uno es por ejemplo HMAC pero pues los campos que tengas que incluir y en qué orden, si llevan separados o no, etc eso no lo sé.

http://en.wikipedia.org/wiki/HMAC

Inquietud

Buenas Tardes enrique te escribo porque tengo una inquietud en cuanto al proyecto j8583 , y es el de como definir los campos que son de tipo Binary especificamente los de la posicion 64 y 128 en el XML de configuracion de la aplicacion si los disponibles son NUMERIC, LLVAR..ect? . Estos datos en el estandar que se define en wikipedia aparecen como datos binarios de tamaño 16. Pero en otro documento que tengo aparece como representacion Hexadecimal de datos binarios de tamaño 16. Gracias por tu colaboracion

Imagen de ezamudio

CustomField

Puedes usar un CustomField para codificar/decodificar los datos de esos campos en hexadecimal. Precisamente porque ese tipo de cosas varían de una implementación a otra es que no se incluye ese detalle de funcionalidad en la librería.

niso8583 soporte

con quien me puedo comunicar para el soporte de la version del iso8583 para .net ???? favor de enviar un mensaje privado...

Saludos cordiales!!!

Imagen de ezamudio

niso8583

Yo soy el autor de niso8583 también. No he trabajado sobre esa versión porque simplemente no utilizo ese proyecto, ya que no he tenido que hacer nada en .NET en un buen rato. La hice solamente como ejercicio para desoxidarme un poco en C# y para tener las dos versiones por si algún día necesito la de .NET, y aunque funcionan las pruebas básicas igual en ambas, no tiene el mismo avance que la de Java.

J8583

HOLA .....A TODOS DE ANTEMANO GRACIAS

SOY NUEVO EN ESO DEL FRAMEWOK J8583 Y QUIERA SABER DONDE SE ENCUENTRA DOCUMENTACION PARA SU IMPLEMENTACION GRACIAS
..........

ES MUY URGENTE GRACIAS

Imagen de ezamudio

Proyecto

La documentación está en la página del proyecto.

Campos BCD

Estimado Enrique, antes que nada felicitaciones por este fabuloso framework.
Estamos analizando su utilización y vemos que existen campos como por ejemplo el 64 (MAC) que es de tipo BCD en nuestro caso de 8 bytes. El problema es que vemos que dentro de esta implementación no existen este tipo de campos, por otro lado si utilizamos CustomFields, el valor que recibe el encoder es String, por lo tanto tampoco lo vemos como una solución.
Para ser mas claros se pueden tratar todos los campos en formato ASCII y todos en binario pero no algunos campos de una trama como BCD y otros como ASCII.
Existe alguna forma de tratar a este tipo de campos..?
Saludos cordiales!

Imagen de ezamudio

MAC

Sería cosa de agregar a la interfaz CustomField un método para manejar el arreglo de bytes en vez de una cadena...

Formato ISO 8583 y ejemplos reales

Hola Enrique,
> lo primero agradecerte el curro que has hecho al crear el j8583, esta muy bien y funciona bien, hasta donde he probado.
>
> Pero tengo algunas dudas que espero que me puedas resolver.
>
> Es sobre el tema de los campos en un mensaje iso, ¿qué campos son obligatorios para enviar un iso8583 mensaje?¿depende del tipo de mensaje?
> tendrías por casualidad algún ejemplo real, de una transacción en la que se envíe una petición de cobro al banco y el banco conteste?
> ¿Es diferente la respuesta de una american express y de una visa, por ejemplo? cómo puedo saber yo los campos que necesita cada uno?
> He encontrado esta página con ejemplos: http://iso8583.info/dialects/ pero no son reales y no se si realmente son correctos.
>
> Muchas gracias por tu atención de antemano, y espero que me puedas ayudar!!
> Gracias,
> Irene

Imagen de ezamudio

Campos

A pesar de ser un estándar, cada entidad maneja ISO8583 con distintos campos, le ponen distintos tipos e incluso llegan a ponerle distintos tipos a los mismos campos.

Lo más común son estos campos:
3: NUM 6
4: AMOUNT
7: DATE10
11: NUM 6
37: NUM 12
38: NUM 6
39: NUM 2

todo lo demás varía. Hay quienes toman el campo 41 como de 8 caracteres, otros lo manejan a 16 caracteres. Si quieres conectarte con American Express o con VISA tienes que pedirles su formato a ellos. VISA de hecho es raro que te conectes directo, por lo general se maneja a través de terceros (por ejemplo PROSA en México).

Re: Campos

ok, muchas gracias por la respuesta.
Entonces la única forma de conseguir los formatos es pedirselos expresamente a las entidades? no estan disponibles en otro sitio?
Y al pedirlos hace falta firmar algún tipo de contrato? o cómo va lo de perdir los formatos?
Muchas gracias de nuevo!!

Imagen de ezamudio

no sé

Si necesitas el formato para conectarte a American Express, ellos te lo tendrán que dar. Porque no solamente necesitas el formato, vas a necesitar que te digan a dónde conectarte, establecerán un enlace dedicado o VPN o algún medio seguro de comunicación, y seguramente es porque hay algún tipo de proyecto en curso y por lo tanto habrá algún contrato firmado. Son temas comerciales ya mucho más allá del alcance de j8583.

Me puedes Ayudar?

Hola soy nuevo en este tema del iso 8583... me puedes decir cual es su funcionalidad? baje el ejemplo pero todavia no le entiendo muy bien.... todos los mensajes que quiera enviar tiene que ir la estructura en el xml?

Imagen de ezamudio

Lo necesitas?

Master, necesitas usar ISO8583 o solamente quieres saber de qué se trata? El uso de j8583 requiere que ya conozcas el protocolo, es solamente una implementación en Java para facilitar el manejo de mensajes ISO8583 porque es bastante engorroso. La página oficial tiene una explicación breve del protocolo.

Me puedes ayudar?

hola ezamudio agradesco la molestia que te tomas para ayudar gracias..... la situacion es la siguiente tengo que hacer una aplicacion que pueda enviar mensajes que tengan la estructura iso 8583... encontre el ejemplo de j8583 lo eee estado analizando pero todavia no le entiendo bien si me pudes ayudar seria genial me puedes pasar tu correo?

Necesito mandar un mensaje asi.
template type="0800"
field num="11" type="LLVAR">000009 field
field num="43" type="LLVAR">Texto field
field num="70" type="LLVAR">567 field
template

y la contestacion debe ser mas o menos asi...

"0810"
field id="11" value="000009"
field id="37" value="307504"
field id="38" value="937884"
field id="39" value="00"
field id="43" value="Texto"
field id="62" value="011,3,4,5"
field id="63" value="017:0.00:498.95:50.00"
field id="70" value="567"

Esta partes la coloque en el xml para mandar el mensaje lo cual sale asi....
el mensaje sale asi del lado del servidor..

INFO: Parsing incoming: '0800 000009 Texto 567'

pero no entiendo porque salen esos espacios en blanco por mas que los busco no los encuentro....

Me puedes explicar el metodo writeInternal();
por mas que lo veo no le entiendo...
soy nuevo en este tema....
y gracias por tu apoyo...

Imagen de ezamudio

Soporte

La página oficial en SF.net tiene foros para soporte. Pon tus dudas ahí; aquí no puedo ver ni el XML que pegaste y el mensaje de ejemplo que pones no parece ISO8583 estándar, pues no tiene bitmap. Ya no voy a contestar dudas de la librería aquí, tiene que ser en la página oficial, http://sf.net/projects/j8583

Ayuda

Buen dia.

Deseo realizar pruebas con iso8583 y le que colocas un server, la verdad no se como implementarlo, agradecería mucho tu ayuda.

Gracias.

Imagen de ezamudio

no entendi

No entendí tu pregunta, si es que es una pregunta. En la página oficial del proyecto hay bastante información, pero para usar j8583 tienes que conocer el protocolo ISO8583, eso búscalo en wikipedia o algun otro lado.

Hola

Estoy tratando de crear una apicacion iso8583 y colocas que tienes un server, no se si me equivoco y si no es asi por favor te pido ayuda para implementarlo y hacer unas pruebas. gracias

Imagen de ezamudio

syntax error

Colocar es poner algo en un lugar determinado.

No sé a qué te refieres con que coloqué que tengo un server. En los ejemplos viene una clase que funciona como servidor, escuchando conexiones en un puerto, y una clase que funge como cliente, conectándose al servidor. Es solamente para mostrar una de las maneras en que se puede usar j8583. Cliente y servidor deben tener la misma configuración, al menos en cuando a los tipos y longitudes de cada campo.

Si te refieres a que si tengo un servidor de j8583 corriendo en algun lugar en internet, la respuesta es no. No tendría caso porque cada implementación de ISO8583 es distinta, usa distintos campos, y aunque hay unos que casi no varían de tipo y/o longitud, muchos sí cambian de una implementación a otra (hay quienes manejan el campo 41 como alfa de 8, otros como alfa de 16, otros como numérico, etc).

Imagen de footballer

Post XML

Hola Enrique:
Me preguntaba si tu proyecto puede recibir un POST en XML.
Gracias.

Imagen de ezamudio

no

no no puede. j8583 es para manejar ISO8583. XML no es ISO8583.

Imagen de footballer

Post XML

Si lo sé. Creo que no me expliqué. La idea es recibir mediante un post xml mensajería para después con tu aplicación convertirla a ISO y de ahí enviarla a un switch bancario.
Gracias.

Imagen de Lucho Com

Consulta

Que tal ezamudio tengo una consulta respecto a la aplicacion del uso de este protocolo, no tengo conocimientos en el tema de programacion de java mas bien me inclino por las telecomunicaciones pero a las finales todo va ligado, tengo un cliente al cual se le presenta un problema de comunicacion el mismo cuenta con un dispositivo de GPS que utiliza una SIMcard de celular para mandar su posisionamiento pero al verificar que los ips de comunicacion con el servidor sean los correctos, me aparece un Ip en especial el 216.34.181.96 el cual es la direccion de http://projects.sourceforge.net/ y dentro de los mensajes http veo un "GET /j8583.dtd" que posibilidades haya de que esta aplicacion se ancle a un programa o a un servidor, ya que la comunicacion hacia este ip es constante y no encuentro el porque de esta solicitud desde al linea.

Cualquier ayuda o conocimiento me seria útil.