Ejemplo de j8583 con Groovy

Hola hoy vengo con un pequeño ejemplo de como usar la API j8583, estoy usando la versión 1.7.0 y el ejemplo esta desarrollado con Groovy (Version: 2.0.5 JVM: 1.7.0_09 Vendor: Oracle Corporation OS: Mac OS X).

En este ejemplo vamos a ver como formar una trama y luego como parsearla, soló para la petición de abono (0200) ya que es lo mismo para los otros movimientos.

La teoría esta en la pagina del proyecto o es más tenemos al autor en la comunidad para preguntas mas especificas ezamudio.

A continuación todo el código del ejemplo y la salida producida.

Configuración: conf/confJ8583.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE j8583-config PUBLIC "-//J8583//DTD CONFIG 1.0//EN"
  3.         "http://j8583.sourceforge.net/j8583.dtd">
  4. <j8583-config>
  5. <template type="0200">
  6.         <field num="3" type="NUMERIC" length="6">650000</field>
  7.         <field num="32" type="LLVAR">456</field>
  8.         <field num="35" type="LLVAR">4591700012340000=</field>
  9.         <field num="43" type="ALPHA" length="40">SOLABTEST             TEST-3       DF MX</field>
  10.         <field num="49" type="ALPHA" length="3">484</field>
  11.         <field num="60" type="LLLVAR">B456PRO1+000</field>
  12.         <field num="61" type="LLLVAR">        1234P</field>
  13.         <field num="100" type="LLVAR">999</field>
  14.         <field num="102" type="LLVAR">ABCD</field>
  15. </template>
  16.  
  17. <parse type="0200">
  18.         <field num="3" type="NUMERIC" length="6" />
  19.         <field num="4" type="AMOUNT" />
  20.         <field num="7" type="DATE10" />
  21.         <field num="11" type="NUMERIC" length="6" />
  22.         <field num="12" type="TIME" />
  23.         <field num="13" type="DATE4" />
  24.         <field num="15" type="DATE4" />
  25.         <field num="17" type="DATE_EXP" />
  26.         <field num="32" type="LLVAR" />
  27.         <field num="35" type="LLVAR" />
  28.         <field num="37" type="NUMERIC" length="12" />
  29.         <field num="41" type="ALPHA" length="16" />
  30.         <field num="43" type="ALPHA" length="40" />
  31.         <field num="48" type="LLLVAR" />
  32.         <field num="49" type="ALPHA" length="3" />
  33.         <field num="60" type="LLLVAR" />
  34.         <field num="61" type="LLLVAR" />
  35.         <field num="100" type="LLVAR" />
  36.         <field num="102" type="LLVAR" />
  37. </parse>
  38. </j8583-config>

Código: TestClienteIso8583.groovy

  1. @Grapes(
  2.         @Grab(group='net.sf.j8583', module='j8583', version='1.7.0')
  3. )
  4.  
  5. import com.solab.iso8583.*
  6. import com.solab.iso8583.parse.ConfigParser
  7. import java.net.URL
  8.  
  9.  
  10. /** Ejemplo de como usar j8583 */
  11. class ClienteIso8583 {
  12.         static final def configUrl = "conf/confJ8583.xml"
  13.         static final def mf = new MessageFactory()
  14.  
  15.         ClienteIso8583(){
  16.                 ConfigParser.configureFromUrl(mf, new File(configUrl).toURI().toURL())
  17.         }
  18.  
  19.         def writeIso(){
  20.                 IsoMessage m = mf.newMessage(0x200)
  21.        
  22.                 println("Tipo: ${Integer.toHexString(m.type)}")
  23.                 m[4] = IsoType.AMOUNT(2000)
  24.                 m[7] = IsoType.DATE10(new Date())
  25.                 m[11] = IsoType.NUMERIC(123, 6)
  26.                 m[37] = IsoType.NUMERIC(654, 12)
  27.                 //De ser necesario usar setCharacterEncoding del MessageFactory
  28.                 m[41] = IsoType.ALPHA("Breve explicacion del protocolo ISO8583", 16)
  29.                 // ¿Por qué no pinta los 40 caracteres?
  30.                 m[43] = IsoType.ALPHA("La idea de este protocolo es poder transmitir información para procesamiento de pagos a través de sockets de TCP/IP. Un mensaje de ISO8583 puede tener hasta 63 o 127 campos y se procesa de manera lineal (es decir, se va leyendo el mensaje en el orden en que fue recibido).", 40)
  31.                 def key = new String(m.writeData())
  32.                 parserIso(key);
  33.         }
  34.  
  35.         def parserIso(key) {
  36.                 IsoMessage m = mf.parseMessage(key.getBytes(), 0)
  37.                 def c = 0
  38.                 println("Tx: [${key}]")
  39.                 println("type: ${Integer.toHexString(m.type)}")
  40.                 m.fields.each{
  41.                         if(it?.value){
  42.                                 println("${c}: ${it?.value}")
  43.                         }
  44.                         c++
  45.                 }
  46.         }
  47. }
  48.  
  49. def client = new ClienteIso8583();
  50. client.writeIso()
  1. $ groovy TestClienteIso8583.groovy
  2. [0200B220000128A080180000000014000000650000000000200000052720085700012303456174591700012340000=000000000654Breve explicacioLa idea de este protocolo es poder trans484012B456PRO1+000013        1234P0399904ABCD]
  3. type: 200
  4. 3: 650000
  5. 4: 2000.00
  6. 7: Mon May 27 20:08:57 CDT 2013
  7. 11: 000123
  8. 32: 456
  9. 35: 4591700012340000=
  10. 37: 000000000654
  11. 41: Breve explicacio
  12. 43: La idea de este protocolo es poder trans
  13. 49: 484
  14. 60: B456PRO1+000
  15. 61:         1234P
  16. 100: 999
  17. 102: ABCD

Explicación: Pendiente (Disculpen por falta de tiempo esta a medias este post)...

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.
Imagen de ezamudio

ALPHA y NUMERIC

Los tipos ALPHA y NUMERIC son de longitud fija, hay que especificarla junto con el valor; si el valor es más corto de la longitud especificada, se rellena (numéricos con ceros a la izquierda, alfanuméricos con espacios a la derecha) y si es más largo, se trunca.

Hay algunos campos de longitud fija pero predeterminada, como DATE10 (10 dígitos), TIME (6 dígitos), DATE4 (4 dígitos), AMOUNT (12 dígitos). Para campos de longitud variable existen LLVAR y LLLVAR, que pueden tener hasta 99 y 999 caracteres respectivamente. Estos tipos de campo incluyen en sus primeras 2 ó 3 posiciones un prefijo indicando la longitud del valor que contienen.

Imagen de rodrigo salado anaya

Re: ALPHA y NUMERIC

Perfecto eso que mencionas es muy útil y conveniente.

j8586 es muy fácil de usar, tal vez no expreso de la forma más clara lo fácil que es, pero es una excelente opción (libre) para implementar una solución para ISO8583.

Espero tener el tiempo pronto para pulir este pequeño ejemplo y tal vez sea una referencia para clientes potenciales que necesiten una poco de luz en el camino.

Saludos.