POS Autoservicio
Protocolo de Comunicación
La comunicación a través de una puerta serial RS232
tiene velocidades
que van
desde los 1200 Bps hasta 115200 Bps (8N1
). La velocidad inicial del POS es de
19200 Bps 8N1
.
La comunicación a través del puerto USB, esta con velocidad de 115200 Bps
(8N1
).
Si cambia el tipo de comunicación de serial a USB, quedará seteada
automáticamente a la velocidad anteriormente descrita.
Flujo de comunicación
Termino | Descripción |
---|---|
ACK |
Lo envía el POS o la caja como aviso de recepción OK. Hex: 0x06
|
NAK |
Lo envía el POS o la caja cuando el LRC calculado no
corresponde al enviado.Hex: 0x15
|
Timeout1 |
Es el tiempo de espera del ACK o NAK para reintentar
el envío del requerimiento por la caja y la respuesta desde el POS.
|
LRC |
Es un byte que se concatena luego del <FIN COMANDO> y que se
calcula realizando un XOR byte a byte del mensaje, el cual consta
de:
<DATA> + <FIN COMANDO> .
|
Timeout2 |
Es el tiempo de espera de la respuesta por la caja luego de recibir
el ACK del requerimiento.
|
STX |
Indica el INICIO del mensaje Hex: 0x02
|
ETX |
Indica el FIN del mensaje Hex: 0x03
|
Ejemplo de calculo LRC
Calcular el LRC del siguiente comando: 0200|123|
, que en notación
hexadecimal seria:
0x30 0x32 0x30 0x30 0x7C 0x31 0x32 0x33 0x7C
Se ejecuta la siguiente operación:
((((((((30 XOR 32) XOR 30) XOR 30) XOR 7C) XOR 31) XOR 32) XOR 33) XOR 7C)
Esto da como resultado 32
.
Primeros pasos
Listar puertos disponibles
import cl.transbank.pos.POSAutoservicio;
//...
POSAutoservicio pos = new POSAutoservicio();
List<String> ports = pos.listPorts();
using Transbank.POSAutoservicio;
//...
List<string> ports = POSIntegrado.Instance.ListPorts();
pos.listPorts().then( (ports) => {
console.log(ports);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
Puedes utilizar la función específica de cada uno de los SDK, para identificar los puertos y seleccionar el que se haya conectado al POS.
Abrir un puerto serial
import cl.transbank.pos.POSAutoservicio;
//...
POSAutoservicio pos = new POSAutoservicio();
String port = "COM4";
int baudRate = 19200;
pos.openPort(port, baudRate);
using Transbank.POSAutoservicio;
//...
string portName = "COM3";
POSAutoservicio.Instance.OpenPort(portName);
let portName = "/dev/tty.usbserial-1410"; // Ejemplo en MAC
let portName = "COM4"; // Ejemplo en caso de Windows
pos.connect(portName).then( (response) => {
console.log('Conectado correctamente');
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
Para abrir un puerto serial y comunicarte con el POS Autoservicio, necesitarás el nombre del puerto. También necesitarás el baudrate al cual está configurado el puerto serial del POS Autoservicio (por defecto es 19200).
Si el puerto no puede ser abierto, se lanzará una excepción
TransbankException
en .NET y Java.
Cerrar un puerto serial
import cl.transbank.pos.POSAutoservicio;
//...
POSAutoservicio pos = new POSAutoservicio();
pos.closePort();
using Transbank.POSAutoservicio;
//...
POSAutoservicio.Instance.ClosePort();
pos.disconnect().then( (response) => {
console.log('Puerto desconectado correctamente');
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
Al finalizar el uso del POS, o si se desea desconectar de la Caja se debe liberar el puerto serial abierto anteriormente.
Mensajes
Mensaje de Venta
Este comando es enviado por la caja para solicitar la ejecución de una venta. Los siguientes parámetros deben ser enviados desde la caja:
Monto
: Monto en pesos informados al POS. Este parámetro es remitido a Transbank para realizar la autorización.Número Ticket/Boleta
: Número de la operación de venta.Campo impresión
: Indica si el POS debe devolver un voucher formateado.Enviar Mensaje
: Indica al POS si debe enviar a la caja de mensajes de estatus de la transacción mientras se realiza la venta.
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.autoservicio.*;
//...
POSAutoservicio pos = new POSAutoservicio();
SaleResponse response = pos.sale(amount, ticket, true);
using Transbank.POSAutoservicio;
using Transbank.Responses.CommonResponses;
using Transbank.Responses.AutoservicioResponse;
//...
Task<SaleResponse> response = POSAutoservicio.Instance.Sale(amount, ticket, true);
pos.sale(1500, '12423').then( (response) => {
console.log('Sale finalizado. Respuesta', response);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
{
"Function": 210,
"ResponseCode": 0,
"ResponseMessage": "Aprobado",
"Commerce Code": 550062700310,
"Terminal Id": "ABC1234C",
"Ticket": "ABC123",
"Authorization Code": "XZ123456",
"Amount": 15000,
"Last 4 Digits": 6677,
"Operation Number": 60,
"Card Type": "CR",
"Accounting Date": "28/10/2019 22:35:12",
"Account Number": "30000000000",
"Card Brand": "AX",
"Real Date": "28/10/2019 22:35:12",
"Printing Field:": List<string>,
"Shares Type": 3,
"Shares Number": 3,
"Shares Amount": 5000,
"Shares Type Gloss": " "
}
-
La caja envía el requerimiento y espera como respuesta
<ACK>
/<NAK>
, en caso de que llegue un<NAK>
, debe reintentar el envío del requerimiento 2 veces. Si recibe un<ACK>
debe esperar la respuesta de la transacción. - El POS solicita los datos al usuario, y envía el requerimiento al Autorizador, en caso de ser aprobada, se guarda en Batch y se envía respuesta a la caja. En caso de ser rechazada se envía respuesta a la caja indicando el error.
- La caja al recibir la respuesta envía un
<ACK>
si el mensaje está correcto, o un<NAK>
para el caso en que elLRC
no corresponde. - El POS al recibir el
<ACK>
vuelve al inicio a esperar un nuevo comando, para el caso que recibe un<NAK>
vuelve a enviar la respuesta 2 veces más.
Solicitud de Venta
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
valor ASCII: 0200 valor hexadecimal: 0x30 0x32 0x30 0x30
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto |
9 | Valor Numérico que debe ser convertido a hexadecimal. |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de ticket / boleta |
20 | Valor ASCII, Número de boleta o ticket, que debe ser convertido a hexadecimal |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
1 | Indica si entrega voucher formateado 1 = Sí, 0 = No |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Enviar mensajes |
1 |
Indica al POS si debe enviar mensajes intermedios o de estado de la
transacción 1: Envía Mensajes 0: No envía mensajes |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta de Venta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0210 valor hexadecimal: 0x30 0x32 0x31 0x30
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de comercio |
12 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Terminal ID |
8 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de ticket / boleta |
20 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de Autorización |
6 | Valor Alfanumérico (opcional) |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto |
9 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Últimos 4 dígitos tarjeta |
4 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de operación |
6 | Correl |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo de Tarjeta |
2 |
CR: Crédito DB: Débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha Contable |
6 | Valor ASCII. Se utiliza si es tarjeta de Débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de Cuenta |
19 | Valor ASCII. Se utiliza si es tarjeta de Débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Abreviación Tarjeta |
2 |
Ejemplo: VI = VISA MC = Mastercard |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha transacción |
8 | Formato: DDMMAAAA |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Hora transacción |
6 | Formato: HHMMSS |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
Variable (opcional) | Campo depende si la caja requiere voucher formateado |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo cuota |
2 (opcional) |
Campo correspondiente al tipo de cuota.
Depende si el comercio cuenta con el
producto cuotas contratado. Valores: 01 = cuota normal 03 = cuota contado 04 = n cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Número cuota |
2 (opcional) |
Campo correspondiente al número de cuota.
Depende si comercio cuenta con el
producto cuotas contratado. Valores; 02 = 2 cuotas 03 = 3 uotas xx = xx cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto cuota |
12 máximo (opcional) | Campo correspondiente al monto de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Glosa tipo cuota |
30 (máximo) | Campo correspondiente a la glosa del tipo de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03
|
LRC |
1 | Resultado del calculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0200|10000||1|0<ETX><LRC>
Respuesta:
<STX>0210|00|597033311777|V1700005||395561|000010000|1679|
000054|CR|||VI|2610 2018|145117| COMPROBANTE DE VENTA CON PIN PAGO EN CUOTAS
TARJETA DE CREDITO Pruebas UX100 Desa Huerfanos 770 Piso 8
Santiago 597033311777-U18.1A1 FECHA HORA TERMINAL26/10/18
14:51:17 V1700005 NUMERO DE TARJETA B-VI************1679
TOTAL: $ 10.000NUMERO DE CUOTAS: 02TIPO DE CUOTAS: CUOTAS
SIN INTERESVALOR CUOTA 1: $ 5.000VALOR CUOTA 2: $ 5.000NUMERO DE
BOLETA: NUMERO DE OPERACION: 000054CODIGO DE AUTORIZACION:
395561 GRACIAS POR SU COMPRA ACEPTO PAGAR SEGÚN
CONTRATO CON EMISOR |01|03|5000|CUOTAS SIN INTERES
<ETX><LRC>
Mensaje de venta multicódigo
Este comando es enviado por la caja para solicitar la ejecución de una venta para los distintos códigos de comercio asociados en el POS. Solo los códigos de comercios virtuales o hijos pueden realizar ventas, el código de comercio del POS es distinto y no puede realizar ventas. Los siguientes parámetros deben ser enviados desde la caja:
Monto
: Monto en pesos informados al POS. Este parámetro es remitido a Transbank para realizar la autorización.Número Ticket/Boleta
: Número de la operación de venta.Campo Impresión
: Indica si el POS debe devolver un voucher formateado.Enviar Mensaje
: Indica al POS si debe enviar a la caja mensajes de estatus de la transacción mientras se realiza la venta.Comercio prestador
: Código de comercio que ejecutará la venta.
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.autoservicio.*;
POSAutoservicio pos = new POSAutoservicio();
MultiCodeSaleResponse response = pos.multiCodeSale(amount, ticket, commerceCode, true, true);
using Transbank.POSAutoservicio;
using Transbank.Responses.CommonResponse;
using Transbank.Responses.AutoservicioResponse;
Task<MultiCodeSaleResponse> response = POSAutoservicio.Instance.MultiCodeSale(amount, ticket, commerceCode, true, true);
// No Disponible
Solicitud de Venta Multicódigo
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
valor ASCII: 0270 valor hexadecimal: 0x30 0x32 0x37 0x30
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto |
9 | Valor numérico que debe ser convertido a hexadecimal. |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de ticket / boleta |
20 | Valor ASCII, Número de boleta o ticket, que debe ser convertido a hexadecimal |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
1 | Indica si entrega voucher formateado 1 = Sí, 0 = No |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Enviar mensajes |
1 |
Indica al POS si debe enviar mensajes intermedios o de estado de la transacción 1: Envía Mensajes 0: No envía mensajes |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Comercio prestador |
12 | Valor que indica el código de comercio del prestador |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03 .
|
LRC |
1 | Resultado del calculo del LRC del mensaje. |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0271 valor hexadecimal: 0x30 0x32 0x37 0x31
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de comercio |
12 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Terminal ID |
8 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de ticket / boleta |
20 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de Autorización |
6 | Valor Alfanumérico (opcional) |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto |
9 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Últimos 4 dígitos tarjeta |
4 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de operación |
6 | Correl |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo de Tarjeta |
2 |
CR: Crédito DB: Débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha Contable |
6 | Valor ASCII. Se utiliza si es tarjeta de débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de cuenta |
19 | Valor ASCII. Se utiliza si es tarjeta de débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Abreviación tarjeta |
2 | Ejemplo: VI=VISA, MC=Mastercard |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha transacción |
8 | Formato: DDMMAAAA |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Hora transacción |
6 | Formato: HHMMSS |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Comercio Prestador |
12 | Valor que indica el código de comercio del prestador |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
Variable (opcional) | Campo depende si la caja requiere voucher formateado |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo cuota |
2 (opcional) |
Campo correspondiente al tipo de cuota.
Depende si el comercio cuenta con el
producto cuotas contratado. Valores: 01 = cuota normal 03 = cuota contado 04 = n cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Número cuota |
2 (opcional) |
Campo correspondiente al número de cuota.
Depende si comercio cuenta con el
producto cuotas contratado. Valores; 02 = 2 cuotas 03 = 3 uotas xx = xx cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto cuota |
12 máximo (opcional) | Campo correspondiente al monto de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Glosa tipo cuota |
30 (máximo) | Campo correspondiente a la glosa del tipo de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03
|
LRC |
1 | Resultado del calculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0270|25000|123456|1|0|597001600402<ETX><LRC>
Respuesta:
<STX>0271|00|597001600402|653UX003|123456|831679|
000026001|2383|000039|CR||| AX|25112020|145014|597001600403|
****************************************
AVISO DE PREMIO ****************************************
PRUEBA TITULO LARGO 597001600403 25/11/2020
PEL3DTHMONTO FELICITACIONES
USTED SE HA GANADO XYX H2H PEL 3 -
PREMIO COMIENZA Y TERMINA CON - PEL 3 H2H XYX
EQUIVALENTES A : 1500 CODIGO DEL PREMIO 831679-
00014340 ESTE VALOR SERA ABONADO EN
SU ESTADO DE CUENTA SIGUIENTE O SUBSIGUIENTE
COMPROBANTE DE VENTA PAGO EN CUOTAS TARJETA DE CREDITO
PRUEBA TITULO LARGO Multicomercio Paraiso Springfield
597001600402-U20.1V1 597001600403 FECHA HORA
TERMINAL25/11/20 14:50:14 653UX003 NUMERO DE TARJETA
C-AX***********2383 AMEX A000000025010402TOTAL: $
26.001NUMERO DE CUOTAS : 06TIPO DE CUOTAS : CUOTAS SIN INTERESMONTO
CUOTA : $ 4.336TASA INTERES : 0,00%NUMERO DE BOLETA:
123456NUMERO DE OPERACION: 000039CODIGO DE AUTORIZACION: 831679
GRACIAS POR SU COMPRA ACEPTO PAGAR SEGÚN CONTRATO CON EMISOR
TRANSACCION PREMIADA CODIGO DEL PREMIO :00014340
|04|06|4336|CUOTAS SIN INTERES
<ETX><LRC>
Mensaje de Última Venta
Comando enviado por la caja solicitando al POS los datos de la última venta guardada en memoria, teniendo como dato relevante en la respuesta el número de ticket o boleta.
Este comando debe ser utilizado por la caja para el caso en que no recibe respuesta al comando de venta, y validará el campo ticket o boleta contra el número de ticket asignado al cobro de la transacción, en caso que los números comparados sean distintos, la caja debe reintentar el cobro ejecutando nuevamente de la transacción de venta, para el caso en que coinciden, significa que el cobro ya fue realizado.
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.autoservicio.*;
POSAutoservicio pos = new POSAutoservicio();
LastSaleResponse lastSaleResponse = pos.lastSale();
using Transbank.POSAutoservicio;
using Transbank.Responses.AutoservicioResponse;
Task<LastSaleResponse> response = POSAutoservicio.Instance.LastSale();
POS.getLastSale().then( (response) => {
console.log('getLastSale ejecutado. Respuesta: ', response);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
{
"Function": 260,
"ResponseCode": 0,
"ResponseMessage": "Aprobado",
"Commerce Code": 550062700310,
"Terminal Id": "ABC1234C",
"Ticket": "AB123",
"Authorization Code": "XZ123456",
"Amount": 15000,
"Last 4 Digits": 6677,
"Operation Number": 60,
"Card Type": "CR",
"Accounting Date": "28/10/2019 22:35:12",
"Account Number": "300000000",
"Card Brand": "AX",
"Real Date": "28/10/2019 22:35:12",
"Printing Field": List<string>,
"Shares Type": 3,
"Shares Number": 3,
"Shares Amount": 5000,
"Shares Type Gloss": " "
}
-
La caja envía el requerimiento y espera como respuesta
<ACK>
. Si recibe un<ACK>
la caja debe esperar la respuesta del POS, en caso de recibir un<NAK>
debe reintentar enviando el comando 2 veces. -
Una vez recibida la respuesta, la caja calcula el
<LRC>
(especificado más adelante en el protocolo de comunicación) del mensaje y lo compara con el recibido, si coinciden la caja envía un<ACK>
al POS dando por finalizado el comando, en caso contrario envía un<NAK>
, y vuelve a esperar la respuesta del POS.
Solicitud de Última venta
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
valor ASCII: 0250 valor hexadecimal: 0x30 0x32 0x35 0x30
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
1 | Indica si entrega voucher formateado 1 = Sí, 0 = No |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03 .
|
LRC |
1 | Resultado del calculo del LRC del mensaje. |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0260 valor hexadecimal: 0x30 0x32 0x36 0x30
|
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de comercio |
12 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Terminal ID |
8 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de ticket / boleta |
20 | Valor Alfanumérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Código de Autorización |
6 | Valor Alfanumérico (opcional) |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto |
9 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Últimos 4 dígitos tarjeta |
4 | Valor Numérico |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de operación |
6 | Correl |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo de Tarjeta |
2 |
CR: Crédito DB: Débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha Contable |
6 | Valor ASCII. Se utiliza si es tarjeta de débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Número de cuenta |
19 | Valor ASCII. Se utiliza si es tarjeta de débito |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Abreviación tarjeta |
2 | Ejemplo: VI=VISA, MC=Mastercard |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Fecha transacción |
8 | Formato: DDMMAAAA |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Hora transacción |
6 | Formato: HHMMSS |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Campo impresión |
Variable (opcional) | Campo depende si la caja requiere voucher formateado |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Tipo cuota |
2 (opcional) |
Campo correspondiente al tipo de cuota.
Depende si el comercio cuenta con el
producto cuotas contratado. Valores: 01 = cuota normal 03 = cuota contado 04 = n cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Número cuota |
2 (opcional) |
Campo correspondiente al número de cuota.
Depende si comercio cuenta con el
producto cuotas contratado. Valores; 02 = 2 cuotas 03 = 3 uotas xx = xx cuotas |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Monto cuota |
12 máximo (opcional) | Campo correspondiente al monto de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
Separador de campo |
1 (opcional) |
valor ASCII: | valor hexadecimal: 0x7c
|
Glosa tipo cuota |
30 (máximo) | Campo correspondiente a la glosa del tipo de cuota. Depende si comercio cuenta con el producto cuotas contratado. |
<ETX> |
1 |
Indica el fin de texto o comando valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del calculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0250|1<ETX><LRC>
Respuesta:
<STX>0260|00|597033311777|V1700005||389169|000005360|1679|000055|
CR|||VI|2610 2018|145255| COMPROBANTE DE VENTA CON PIN TARJETA DE CREDITO
Pruebas UX100 Desa Huerfanos 770 Piso 8 Santiago
597033311777-U18.1A1 *** DUPLICADO *** FECHA HORA
TERMINAL26/10/18 14:52:55 V1700005 NUMERO DE TARJETA
B-VI************1679 TOTAL: $ 5.360NUMERO DE BOLETA:
NUMERO DE OPERACION: 000055CODIGO DE AUTORIZACION: 389169
GRACIAS POR SU COMPRA ACEPTO PAGAR SEGÚN CONTRATO CON EMISOR
|00|00||<ETX><LRC>
Mensaje de Cierre
Esta es una transacción administrativa que se debe ejecutar diariamente o como mínimo una vez a la semana. Esta transacción es gatillada por la caja, y no recibe parámetros, el POS ejecuta la transacción de cierre contra la caja, enviando como parámetro el tipo de impresión (0=Parámetros de impresión, 1=voucher formateado). Como respuesta a la caja se enviará un aprobado o rechazado, y los datos de impresión del voucher para el caso en que fuera aprobado.
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.autoservicio.*;
POSAutoservicio pos = new POSAutoservicio();
CloseResponse response = pos.close();
using Transbank.POSAutoservicio;
using Transbank.Responses.AutoservicioResponse;
Task<CloseResponse> response = POSAutoservicio.Instance.Close();
pos.closeDay().then( (response) => {
console.log('closeDay ejecutado. Respuesta: ', response);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
{
"FunctionCode": 510,
"ResponseCode": 0,
"ResponseMessage": "Aprobado",
"Success": true,
"CommerceCode": 550062700310,
"TerminalId": "ABC1234C",
"Printing Field": List<string>
}
-
La caja envía el requerimiento y espera como respuesta
<ACK>
/<NAK>
, en caso de que llegue un<NAK>
, debe reintentar el envío del requerimiento 2 veces. Si recibe un<ACK>
debe esperar la respuesta de la transacción. - El POS envía requerimiento al Autorizador, en caso de ser aprobada, se ejecuta un reinicio del contador de transacciones en el autorizador y se envía respuesta a la caja. En caso de ser rechazada se envía respuesta a la caja indicando el estado del rechazo.
- La caja al recibir la respuesta envía un
<ACK>
al POS si el mensaje está correcto, o un<NAK>
para el caso en que elLRC
no corresponde. - El POS al recibir el
<ACK>
vuelve al inicio a esperar un nuevo comando, para el caso que recibe un<NAK>
vuelve a enviar la respuesta 2 veces más.
Solicitud de cierre
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0500 Valor hexadecimal: 0x30 0x35 0x30 0x30
|
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Campo impresión |
1 | Indica si entrega voucher formateado |
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0510 Valor hexadecimal: 0x30 0x35 0x31 0x30
|
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Código de comercio |
12 | Valor Numérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Terminal ID |
8 | Valor Alfanumérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Campo Impresión |
Variable (opcional) | Campo depende si la caja requiere voucher formateado |
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0500|0<ETX><LRC>
Respuesta:
<STX>0510|00|597029414300|70000537<ETX><LRC>
Mensaje de Carga de Llaves
Esta transacción permite al Aplicativo de caja del comercio requerir y cargar nuevas llaves Working Key, desde Transbank. Su uso debe ser limitado como prueba de comunicación IP para validar conectividad hacia el exterior.
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.common.*;
POSAutoservicio pos = new POSAutoservicio();
LoadKeysResponse response = pos.loadKeys();
using Transbank.POSAutoservicio;
using Transbank.Responses.CommonResponses;
Task<LoadKeysResponse> response = POSAutoservicio.Instance.LoadKeys();
pos.loadKeys().then( (response) => {
console.log('loadKeys ejecutado. Respuesta: ', response);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
{
"FunctionCode": 810,
"ResponseCode": 0,
"ResponseMessage": "Aprobado",
"Success": true,
"Commerce Code": 550062700310,
"Terminal Id": "ABC1234C"
}
-
La caja envía el requerimiento y espera como respuesta
<ACK>
/<NAK>
, en caso de que llegue un<NAK>
, debe reintentar el envío del requerimiento 2 veces. Si recibe un<ACK>
debe esperar la respuesta de la transacción. - El POS envía requerimiento al Autorizador. En caso de ser aprobada se guarda nueva llave y se envía respuesta a la caja. En caso de ser rechazada se envía respuesta a la caja indicando el estado de rechazo.
-
La caja al recibir la respuesta envía un
<ACK>
al POS si el mensaje está correcto, o un<NAK>
para el caso en que el<LRC>
no corresponda. -
El POS al recibir el
<ACK>
desde la caja vuelve al inicio a esperar un nuevo comando, para el caso que recibe un<NAK>
vuelve a enviar la respuesta 2 veces más.
Solicitud de Carga de Llaves
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0800 Valor hexadecimal: 0x30 0x38 0x30 0x30
|
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0810 Valor hexadecimal: 0x30 0x38 0x31 0x30
|
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Código de comercio |
12 | Valor Numérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Terminal ID |
8 | Valor Alfanumérico |
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0800<ETX><LRC>
Respuesta:
<STX>0810|00|597029414300|70000537<ETX><LRC>
Mensaje de Poll
Este mensaje es enviado por la caja para saber si el POS está conectado.
import cl.transbank.pos.POSAutoservicio;
POSAutoservicio pos = new POSAutoservicio();
boolean pollResult = pos.poll();
using Transbank.POSAutoservicio;
Task<bool> connected = POSAutoservicio.Instance.Poll();
pos.poll().then( (res) => {
console.log('Resultado ejecución: ', res);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
True
-
La caja envía el requerimiento y espera como respuesta
<ACK>
. Si recibe un<ACK>
indica que el POS está funcionando y listo para recibir un comando. -
En caso de no recibir el
<ACK>
, indica existe algún tipo de problema con la comunicación entre la caja y el POS, y debe reintentar enviando el comando de POLLING al menos 3 veces.
Solicitud de poll
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0100 Valor hexadecimal: 0x30 0x31 0x30 0x30
|
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<ACK> |
1 |
Comando recibido OK Valor hexadecimal: 0x06
|
Ejemplo
Requerimiento:
<STX>0100<ETX><LRC>
Respuesta:
<ACK>
Mensaje de Inicialización
Esta es una transacción administrativa que se utiliza para cargar los parámetros y aplicativo en el terminal de autoservicio de Transbank. Es usada por los técnicos al realizar la instalación de los equipos en el comercio. Previo a la ejecución de esta transacción, es necesario realizar una transacción de cierre. Debido a que la transacción de Inicialización tiene un tiempo superior a una venta normal y el tiempo en que el POS queda fuera de comunicación con la caja es variable, se dividió en 2 comandos:
- Transacción de Inicialización: Indica la acción.
- Respuesta de Inicialización: Utilizado para conocer el resultado de la acción.
Posterior a la ejecución del comando de Inicialización, el módulo de auto atención del comercio, enviará un comando
“Polling” para saber si el POS está activo o no. Una vez que se encuentre activo (enviando como
respuesta un <ACK>
) el módulo de auto atención enviará el comando: respuesta de Inicialización
donde se responderá si la acción fue exitosa o no. En caso de que la inicialización no fuera exitosa el
POS podrá seguir realizando ventas sin los parámetros actualizados.
-
La caja envía el requerimiento y espera como respuesta
<ACK>
/<NAK>
, en caso de que llegue un<NAK>
, debe reintentar el envío del requerimiento 2 veces. Si recibe un<ACK>
debe esperar la respuesta de la transacción. - El POS envía requerimiento al Autorizador. En caso de ser aprobada se guarda nueva llave y se envía respuesta a la caja. En caso de ser rechazada se envía respuesta a la caja indicando el estado de rechazo.
-
La caja al recibir la respuesta envía un
<ACK>
al POS si el mensaje está correcto, o un<NAK>
para el caso en que el<LRC>
no corresponda. -
El POS al recibir el
<ACK>
desde la caja vuelve al inicio a esperar un nuevo comando, para el caso que recibe un<NAK>
vuelve a enviar la respuesta 2 veces más.
Transacción de inicialización
import cl.transbank.pos.POSAutoservicio;
POSAutoservicio pos = new POSAutoservicio();
boolean pollResult = pos.initialization();
Transacción de inicialización
using Transbank.POSAutoservicio;
Task<bool> initialized = POSAutoservicio.Instance.Initialization();
Transacción de inicialización
pos.initialization().then( (res) => {
console.log('Resultado ejecución: ', res);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
Solicitud de inicialización
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0070 Valor hexadecimal: 0x30 0x30 0x37 0x30
|
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<ACK> |
1 |
Comando recibido OK Valor hexadecimal: 0x06
|
Ejemplo
Requerimiento:
<STX>0070<ETX><LRC>
Respuesta:
<ACK>
Transacción de respuesta inicialización
import cl.transbank.pos.POSAutoservicio;
import cl.transbank.pos.responses.autoservicio.*;
POSAutoservicio pos = new POSAutoservicio();
InitializationResponse response = pos.initializationResponse();
Transacción de respuesta inicialización
using Transbank.POSAutoservicio;
using Transbank.Responses.AutoservicioResponse;
Task<InitializationResponse> response =
POSAutoservicio.Instance.InitializationResponse();
Transacción de respuesta inicialización
POS.initializationResponse().then( (res) => {
console.log('Resultado ejecución: ', res);
}).catch( (err) => {
console.log('Ocurrió un error inesperado', err);
});
{
"FunctionCode": 1080,
"ResponseCode": 0,
"ResponseMessage": "Aprobado",
"Success": true,
"Real Date": "28/10/2019 22:35:12"
}
Solicitud de respuesta de inicialización
DATO | LARGO | Comentario |
---|---|---|
<STX> |
1 |
Indica el inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 0080 Valor hexadecimal: 0x30 0x30 0x38 0x30
|
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Respuesta
DATO | LARGO | COMENTARIO |
---|---|---|
<STX> |
1 |
Indica inicio de texto o comando Valor hexadecimal: 0x02
|
Comando |
4 |
Valor ASCII: 1080 Valor hexadecimal: 0x31 0x30 0x38 0x30
|
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Código Respuesta |
2 | Valor Numérico |
Separador de campo |
1 |
Valor ASCII: | Valor hexadecimal: 0x7c
|
Fecha transacción |
8 | Formato: DDMMAAAA |
Separador de campo |
1 |
valor ASCII: | valor hexadecimal: 0x7c
|
Hora transacción |
6 | Formato: HHMMSS |
<ETX> |
1 |
Indica el fin de texto o comando Valor hexadecimal: 0x03
|
<LRC> |
1 | Resultado del cálculo del LRC del mensaje |
Ejemplo
Requerimiento:
<STX>0080<ETX><LRC>
Respuesta:
<STX>1080|90|27022016|120628<ETX><LRC>
Vouchers
Los voucher serán generados por el POS para los casos en que la caja lo indique en el comando de venta, así como también para los duplicados, anulaciones y cierres. Cada línea contendrá 40 caracteres, los que se concatenan en un solo buffer que será enviado en campo de impresión en la respuesta a transacciones de venta y cierre. La caja al recibir este buffer debe considerar que cada 40 caracteres conforman una línea de impresión. Con relación al largo del Voucher, este dependerá del tipo de transacción a imprimir.
Ejemplos
Transacción Venta en Promoción | Reporte de Cierre del Terminal |
---|---|
Caracteres máximos permitidos Ancho: 40 Largo: 29 |
Caracteres máximos permitidos Ancho: 40 Largo: 18 |
Tabla de Respuestas
Respuesta | Código |
---|---|
Aprobado | 00 |
Rechazado | 01 |
Autorizador no Responde | 02 |
Conexión Fallo | 03 |
Transacción ya fue anulada | 04 |
No existe transacción para anular | 05 |
Tarjeta no soportada | 06 |
Transacción cancelada | 07 |
No puede Anular Transacción Débito | 08 |
Error Lectura Tarjeta | 09 |
Monto menor al mínimo permitido | 10 |
No existe venta | 11 |
Transacción No Soportada | 12 |
Debe ejecutar cierre | 13 |
Error Encriptando PAN (BCYCLE) | 14 |
Error Operando con Débito (BCYCLE) | 15 |
Solicitando Conformar Monto | 80 |
Solicitando Ingreso de Clave | 81 |
Enviando transacción al Autorizador | 82 |
Selección menú crédito/redcompra | 83 |
Opere tarjeta | 84 |
Selección de cuotas | 85 |
Ingreso de cuotas | 86 |
Confirmación de cuotas | 87 |
Aceptar consulta cuotas | 88 |
Opción mes de gracia | 89 |
Inicialización Exitosa | 90 |
Inicialización Fallida | 91 |
Lector no Conectado | 92 |
Consultando cuota al Autorizador | 93 |
Toda transacción cuyo código de respuesta sea distinto de '0' será considerada como un rechazo. Por secreto bancario, el detalle de la causa del rechazo no será entregado al comercio.