Skip to main content

Construir el ticket desde la respuesta

info

El único parámetro externo a la respuesta que necesita el integrador es tipo_copia (CLIENTE | COMERCIO), usado para la doble impresión (ver Doble impresión). Cualquier otro dato del ticket debe obtenerse de la respuesta SOAP; lo que no esté en ella se marca como constante de presentación o no derivable.

El recibo de venta solo se genera cuando la respuesta representa una operación aceptada:

TIPORUTAVALOR REQUERIDO
Resultado del servicioGetNextMessageResponse/Result/Code0
Código de operaciónMessage/MessageCode1000
SI Result/Code == "0" Y Message/MessageCode == "1000":
imprimir_ticket(PrintableData)
SI NO:
# Fuera de alcance (ver tabla de códigos de GetNextMessage en "Aceptar Cobros")
no_imprimir
caution

Esta página cubre exclusivamente MessageCode = 1000. Un 1001 (cobro no efectivo) no imprime ticket; otros códigos (10, 11) son pasos intermedios del circuito de GetNextMessage.

Referencia operativa, por parámetro, de todas las condiciones y acciones que el integrador debe contemplar. Cada apartado es autocontenido y se apoya solo en rutas SOAP.

Datos operacionales

ETIQUETAFUENTECONDICIÓN
Tipo Operación:PrintableData/OperationTypeSiempre.
Tarjeta:PrintableData/CardNumberSolo si NO es Bizum.
IBAN Cliente:mascara_iban (ver Bizum)Solo si es Bizum.
Nº de teléfono:mascara_telefono (ver Bizum)Solo si es Bizum.
Ent. Aut.:PrintableData/HCPSiempre.
AID:PrintableData/AIDSolo si es_visa.
ARC:PrintableData/ACRCodeSiempre.
Nº Autorización:PrintableData/AuthorizationNumberSiempre.
Modo Autorización:PrintableData/AuthorizationModeSiempre.
Modo Verificación:PrintableData/DataVerificationTypeSiempre.
DDF:PrintableData/DDFNameSiempre.
Aplicación:etiqueta_aplicacionSiempre.
Pasarela de Pagos:SipayPlusConstante.
Extradata:PrintableData/ContactlessLiteralSiempre.

A1. DataVerificationType — verificación del titular

PrintableData/DataVerificationType indica cómo autorizó la entidad la verificación del titular. Determina si el ticket debe llevar recuadro de firma y/o una leyenda de verificación.

caution

Esta variable es la imagen de cómo y bajo qué condiciones la entidad ha autorizado la transacción. De no respetar estas reglas, el ticket pasa a ser inválido ante un repudio bancario.

VALORSIGNIFICADO¿RECUADRO DE FIRMA?LEYENDA EN EL TICKET
PPINNoOPERACIÓN CON PIN FIRMA NO NECESARIA
FFirmaOPERACIÓN SIN PIN, FIRMA NECESARIA
PFPIN y FirmaOPERACIÓN CON PIN Y FIRMA
DVerificado por el dispositivoNoVERIFICADO POR DISPOSITIVO
*Sin PIN ni firma (típico contactless de bajo importe)NoSegún ContactlessLiteral (ver A.2)

Tabla de decisión de acciones (asumiendo NO DCC; para DCC ver A.3, que prevalece y fuerza firma en la copia de comercio):

SEGÚN DataVerificationType:
"F", "PF":
pintar_recuadro_firma() // método de autenticación = firma
imprimir_leyenda(segun_tabla)
"P":
imprimir_leyenda("OPERACIÓN CON PIN FIRMA NO NECESARIA")
"D":
imprimir_leyenda("VERIFICADO POR DISPOSITIVO")
"*":
SI ContactlessLiteral == "0":
imprimir_leyenda("OPERACIÓN SIN PIN NI FIRMA NECESARIA")
SI NO:
imprimir_leyenda("OPERACIÓN CONTACTLESS. FIRMA NO NECESARIA")
info

Devolución (OperationType == "Devolucion"): en la copia de cliente se pinta siempre el recuadro FIRMA ESTABLECIMIENTO, con independencia de DataVerificationType.

caution

En tarjeta chip pueden darse ambos escenarios: pedir firma (igual que un contactless) o no pedir ni firma ni PIN sin ser contactless. Por eso la acción debe seguir siempre el valor recibido en DataVerificationType, no el medio de entrada.

A2. ContactlessLiteral — logo de contactless

PrintableData/ContactlessLiteral indica si la operación fue sin contacto. En operaciones contactless es obligatorio imprimir el logo de contactless.

Regla de decisión del logo:

SI ContactlessLiteral == "1" O ContactlessLiteral == "2":
imprimir_logo_contactless()
SI NO:
no_imprimir_logo()
ContactlessLiteral¿ES CONTACTLESS?ACCIÓN
1Imprimir logo de contactless.
2Imprimir logo de contactless.
0 (u otro valor)NoNo imprimir logo.
info

ContactlessLiteral tiene un segundo uso: cuando DataVerificationType == "*" (ver A.1), discrimina la leyenda de verificación —"0"OPERACIÓN SIN PIN NI FIRMA NECESARIA; cualquier otro valor → OPERACIÓN CONTACTLESS. FIRMA NO NECESARIA—. El valor también se imprime literalmente en la fila Extradata: de los datos operacionales.

A3. Operación DCC (multi-divisa)

Una operación es DCC cuando extra/DCC/EXCHANGE_RATE viene alimentado (es_dcc = true, ver Variables derivadas). En ese caso, los campos multi-divisa son obligatorios en el ticket. PrintableData/Amount y PrintableData/CurrencySimbol muestran el importe y la moneda seleccionados durante la transacción y siempre pueden usarse.

Checklist completo de acciones cuando es_dcc:

#CONDICIÓNACCIÓN
1SiemprePrecio/producto en divisa de cobro: extra/DCC/DCC_AMOUNT + extra/DCC/DCC_CURRENCY_CODE (en vez de Amount + ).
2SiempreTotal en divisa de transacción: dos líneas TRANSACTION CURRENCY y {Amount} {CurrencySimbol}.
3SiempreImprimir bloque DCC Information: Exchange Rate = extra/DCC/EXCHANGE_RATE; DCC Merchant = extra/CARD_INFO/ADQ_BANK_NAME; Comission: = extra/DCC/COMMISION.
4Mark upextra/DCC/PERCENT_MARGIN_EXCHANGE_BCE vacío → {extra/DCC/MARK_UP}%; si no → MARK -UP on ECB RATE PUBLISHED ON {fecha} {PERCENT_MARGIN_EXCHANGE_BCE/1000}%.
5Divisa ≠ EUR y rate válidoLínea Equivalencia: = equivalencia_divisa (1 {CurrencySimbol} = {rate} euros).
6tipo_copia == COMERCIOPintar FIRMA CLIENTE (la firma en copia de comercio es obligatoria en DCC y prevalece sobre las reglas de DataVerificationType de A.1).
7es_visaImprimir el disclaimer Visa Disclosure/Declaration… con PrintableData/CurrencySimbol.
SI es_dcc:
precio = extra/DCC/DCC_AMOUNT + " " + extra/DCC/DCC_CURRENCY_CODE
total = ["TRANSACTION CURRENCY", PrintableData/Amount + " " + PrintableData/CurrencySimbol]
imprimir_bloque_DCC() // Exchange Rate, Equivalencia?, DCC Merchant, Mark up, Comission
SI tipo_copia == "COMERCIO":
pintar_recuadro_firma("FIRMA CLIENTE") // prevalece sobre A.1
SI es_visa:
imprimir_disclaimer_visa()
caution

En DCC, no se aplican las leyendas de A.1 (P/D/*): la firma de la copia de comercio se rige por la regla 6 de esta tabla. Los datos del subcampo extra/DCC (como mínimo EXCHANGE_RATE y el operador DCC) son obligatorios en el ticket de una operación DCC.

ETIQUETAFUENTE / REGLACONDICIÓN
DCC InformationEncabezado fijoSiempre (dentro del bloque).
Exchange Rate:extra/DCC/EXCHANGE_RATESiempre.
Equivalencia:equivalencia_divisaSolo si hay equivalencia (divisa ≠ EUR y rate válido).
DCC Merchant:extra/CARD_INFO/ADQ_BANK_NAMESiempre.
Mark upVer sub-reglaSiempre.
Comission:extra/DCC/COMMISIONSiempre.

Sub-regla Mark up:

SI extra/DCC/PERCENT_MARGIN_EXCHANGE_BCE está vacío:
"{extra/DCC/MARK_UP}%" // p. ej. "***3,00%"
SI NO:
"MARK -UP on ECB RATE PUBLISHED ON {fecha} {PERCENT_MARGIN_EXCHANGE_BCE / 1000}%"
donde fecha = PrintableData/DateTime sin la hora
(quitar el patrón "- HH:MM:SS"; "02/02/2024 - 14:22:33" -> "02/02/2024 ")
info

Literales exactos: la etiqueta es Comission: y el texto ECB es MARK -UP on ECB RATE PUBLISHED ON (respeta los espacios tal cual).

Disclaimer Visa (solo si es_dcc Y es_visa)

"Disclosure/Declaration

I accept that I have been offered a choice of currencies.
For payments and that this choice is final. I accept conversion rate, the final amount and that the
selected currency is {PrintableData/CurrencySimbol}"

Firma y leyenda de verificación

Combina PrintableData/OperationType, PrintableData/DataVerificationType, PrintableData/ContactlessLiteral, es_dcc y tipo_copia. Pueden coincidir varias (p. ej. un recuadro de firma y, por separado, una leyenda):

#CONDICIÓNSALIDA
1OperationType == "Devolucion" Y tipo_copia == CLIENTERecuadro FIRMA ESTABLECIMIENTO
2es_dcc Y tipo_copia == COMERCIORecuadro FIRMA CLIENTE
3DataVerificationType == "P" Y NO es_dccLeyenda OPERACIÓN CON PIN FIRMA NO NECESARIA
4DataVerificationType == "D" Y NO es_dccLeyenda VERIFICADO POR DISPOSITIVO
5DataVerificationType == "*" Y ContactlessLiteral == "0" Y NO es_dccLeyenda OPERACIÓN SIN PIN NI FIRMA NECESARIA
6DataVerificationType == "*" Y ContactlessLiteral != "0" Y NO es_dccLeyenda OPERACIÓN CONTACTLESS. FIRMA NO NECESARIA

Variables derivadas

Calcula estas variables solo a partir de rutas SOAP. Se usan en las reglas de impresión.

es_dcc — operación con conversión de divisa

es_dcc = (extra/DCC/EXCHANGE_RATE existe y no está vacío)

es_visa — marca Visa

familia  = extra/CARD_INFO/FAMILY_NAME  (MAYÚSCULAS, trim)
appLabel = PrintableData/AppLabel (MAYÚSCULAS, trim)
es_visa = (familia == "VISA") O (appLabel == "VISA")

etiqueta_aplicacion — texto de la fila "Aplicación"

SI es_bizum (ver sección Bizum):
etiqueta_aplicacion = "BIZUM"
SI NO, según PrintableData/AID:
"A000000333010102" -> "UPI Credit"
"A000000333010101" -> "UPI Debit"
"A000000333010103" -> "UPI Quasicredit"
cualquier otro -> PrintableData/AppLabel

importe_mostrado y divisa_mostrada

SI es_dcc:
importe_mostrado = extra/DCC/DCC_AMOUNT
divisa_mostrada = extra/DCC/DCC_CURRENCY_CODE // p. ej. "EUR"
SI NO:
importe_mostrado = PrintableData/Amount
divisa_mostrada = "€"

Diagramas de estado para construcción de ticket

Venta

Devolución