Consideraciones previas a su sesión de certificaciónAl contar ya con la matriz de pruebas que NetPay le ha entregado, filtrada para su integración, este documento reúne de forma sintetizada las consideraciones que conviene tener resueltas y presentes antes de la sesión de certificación en la que la completará: cómo se organiza el documento y qué le corresponde llenar en cada hoja, las reglas que su sistema debe cumplir, los pasos de los bloques que deben provocarse en la terminal, el significado de cada estatus y los puntos que con mayor frecuencia obligan a repetir una prueba.
Si dispone de poco tiempo, le sugerimos comenzar por el último apartado.
Forma parte de la Guía de Certificación de Integración NetPay.
1. Cómo está organizada su matriz de pruebas
Su matriz de pruebas es un documento de hojas de cálculo. Cada hoja cubre una parte del proceso, y en todas ellas las celdas que le corresponde llenar están marcadas con borde punteado.
| Hoja | Qué contiene | Qué llena usted |
|---|---|---|
| Información | El expediente del proyecto: contactos, datos de la integración y datos de la terminal certificada. | La columna Respuesta del COMERCIO, en los tres bloques. |
| Cuestionario | Las preguntas técnicas, con la Condición —el resultado que NetPay espera leer— y la Restricción que indica su nivel. | La columna Respuestas DETALLADAS. |
| TICKET-PERSONALIZADO | Solo aparece si desactivó el voucher oficial de NetPay. | Los campos y las evidencias del ticket propio. |
| Pruebas | Los escenarios que debe ejecutar, con el tipo de tarjeta, los resultados esperados y la restricción de ejecución. | Los Comentarios (COMERCIO / NETPAY) y el JSON original entregado a su sistema. |
| Evidencias | Una fila por escenario, para adjuntar las capturas. | El JSON de venta, la imagen del voucher y las capturas de su punto de venta. |
Las columnas de Estatus y de Comentarios de NetPay las completa el equipo de integraciones durante la revisión: no deben modificarse.
El trabajo se realiza sobre el documento que NetPay le compartióLe sugerimos no reconstruirlo, copiarlo a otro archivo ni reordenar sus filas. La numeración de los escenarios y el vínculo entre las hojas Pruebas y Evidencias dependen de esa estructura, y la revisión se realiza sobre ese mismo documento.
Su matriz de pruebas ya trae el alcance aplicadoLas preguntas y los escenarios que contiene son los que corresponden a su tipo de integración, sus APIs adicionales y su marca de terminal. Si su alcance cambia durante el proyecto, avise al equipo de integraciones: la matriz de pruebas debe regenerarse.
2. Material que debe preparar
Le recomendamos reunir los siguientes elementos antes de comenzar. Su ausencia es la causa más frecuente de retraso en una certificación.
La terminal de pruebas
La solicita su asesor comercial o distribuidor de NetPay, no el equipo de integraciones, y debe entregarse en modo de pruebas.
La configuración exacta no es única: depende del modelo, de la marca, de la versión del procesador de pagos y del tipo de integración, y la combinación varía de un caso a otro. Por eso el equipo de integraciones indica en cada solicitud qué versiones corresponden. En términos generales, al recibir la terminal conviene tener identificado y confirmado lo siguiente:
- El modelo y la marca del equipo.
- La versión de Smart PinPad instalada.
- La versión de la aplicación de soporte y del launcher.
- Los servicios de Google instalados, cuando el tipo de integración lo requiera.
- Si la terminal debe entregarse en modo debug, como ocurre en las integraciones por SDK.
La terminal no debe tener instalada la App de PagosEs el error de configuración que con más frecuencia impide iniciar una certificación. Si la terminal llega con la App de Pagos instalada, o con versiones distintas de las indicadas para su caso, le sugerimos reportarlo con su asesor comercial o distribuidor sobre el mismo ticket en el que se solicitó, para que el área de almacén de NetPay pueda revisarlo. Una vez recibida la terminal, es recomendable contactar al equipo de integraciones para verificar que la configuración sea la correcta antes de comenzar.
Credenciales de prueba
Las credenciales de acceso a la aplicación Smart PinPad Dev y las de generación del token no se publican en la documentación. Por política de seguridad, el equipo de integraciones las envía por correo únicamente a los prospectos que han seguido el proceso comercial correspondiente. Si aún no las ha recibido, puede solicitarlas por ese mismo medio.
Material complementario
| Elemento | Detalle |
|---|---|
| StoreId de pruebas | El o los StoreId asignados. Cada uno tiene un propósito: base, factura, fraude, CheckIO, Smart Accounts. |
| Tarjetas físicas | Débito con NIP, crédito con NIP, una tarjeta sin NIP para firma autógrafa, contactless VISA y contactless MASTERCARD. |
| Tarjetas de cashback | Únicamente si aplica, con alguno de los BINes autorizados. |
| Datos del proyecto | Lenguaje o framework de frontend y de backend, IDE, nombre y versión de su sistema, packageName, versión mínima y máxima de Android, o versión de .NET Framework y arquitectura de Windows. En integraciones por COM, la versión de .NET Framework debe ser 3.5 o superior. |
| Número de serie de la terminal | Se encuentra en la parte inferior trasera del equipo. Es el dato que el equipo de integraciones solicita en primer lugar ante cualquier consulta de soporte. |
Ambiente: las pruebas se ejecutan en el ambiente de PRUEBAS. Su sistema debe poder alternar entre los ambientes de pruebas y producción mediante configuración (URL base, path y body del token), sin necesidad de recompilar.
Sobre el NIP durante las pruebasSiguiendo la documentación, ningún cobro del ambiente de pruebas es real y no se genera cargo alguno a las tarjetas utilizadas. El NIP es la única excepción: se valida directamente con el banco emisor, por lo que debe ingresarse correctamente. Tres o más intentos incorrectos pueden ocasionar el bloqueo de la tarjeta.
3. La documentación de referencia, por canal
La mayor parte de lo que la certificación evalúa ya se encuentra documentada. Dado que la documentación está organizada por canal, esta guía mantiene la misma separación: le sugerimos consultar únicamente la pestaña correspondiente a su implementación. Una integración por SDK no configura una URL de regreso, y una integración por API no compila una aplicación para la terminal.
Si alguna de sus respuestas no coincide con lo indicado en la página correspondiente, es probable que ese punto se reabra durante la revisión.
Este es el orden de lectura que sigue el equipo de integraciones al entregar la documentación:
| # | Tema | Página |
|---|---|---|
| 1 | Panorama de la integración por API | Introducción |
| 2 | Configurar la terminal y la URL de regreso | Configuración inicial de la terminal — incluye los certificados SSL: ISRG ROOT X1 no funciona en Android 7 o inferior |
| 3 | Generar el token de acceso | Autorización y generación de token |
| 4 | Enviar una venta y sus campos | Venta |
| 5 | Cancelar una venta | Cancelación — el límite es a las 20:00, hora de Ciudad de México, del mismo día |
| 6 | Reimprimir por orderId | Reimpresión por orderId |
| 7 | Reimprimir por folio | Reimpresión por folio |
| 8 | Recibir la respuesta en su webhook | Recibiendo la respuesta — su webhook debe responder HTTP 200 con {"code":"00","message":"Recibido"}, o la terminal dejará de recibir transacciones |
| 9 | Recuperar una venta que no llegó a su sistema | Recuperación de información no entregada |
| 10 | Reversos | Manejo de reversos por integración API |
| 11 | Check-in y check-out por API (si aplica) | Integración Checkin API / Checkout API |
Si su integración opera con varios StoreId de un mismo grupo, la referencia correspondiente es Smart Accounts.
Las páginas de check-in/check-out y de Smart Accounts no aparecen listadas en el índice público: se consultan por enlace directo.
| # | Tema | Página |
|---|---|---|
| 1 | Panorama de la integración por SDK | Introducción SDK |
| 2 | Preparar la terminal | Configuración inicial de la terminal |
| 3 | Instalar su APK y mover archivos a la terminal | Configuraciones adicionales de la terminal |
| 4 | Métodos, versiones y manejo de la respuesta | Smart SDK Terminales |
| 5 | Reimprimir por folio y leer reprintModule | Reimpresión por folio en integración SDK — el folio debe ser único, incluso en las declinadas |
| 6 | Reversos | Manejo de reversos por integración SDK |
| 7 | Lectura NFC, QR en el ticket y bloqueo de botones (si aplica) | Características adicionales |
| 8 | Propina (si aplica) | Propina |
| 9 | Check-in por SDK y check-out por API (si aplica) | Integración de Check-in SDK · Cómo validarlo desde la terminal |
| 10 | Después de certificar: publicar su aplicación | Subir la app a PAX STORE |
Para kioscos y autoservicio: Cómo deshabilitar los botones de navegación.
| # | Tema | Página |
|---|---|---|
| 1 | Métodos, versiones de la DLL y manejo de la respuesta | Smart COMM .Net |
| 2 | Reimprimir por folio y leer reprintModule | Reimpresión por folio para integración COM — es la única página que publica la tabla completa de valores |
| 3 | Reversos | Manejo de reversos por integración COM |
| 4 | Certificación para .Net y VB6 | Certificación .Net y VB6 |
Si su desarrollo es en VB6, la referencia es Smart COMM VB6. Existen además librerías y aplicaciones demo para Delphi, Visual FoxPro y Java; el equipo de integraciones las entrega junto con el driver y la versión de DLL que corresponda a su proyecto.
La guía de Smart COMM .Net documenta hasta la versión 1.6 de la DLL. Si su proyecto utiliza una versión posterior, existen métodos como testConnection() y setBankOnly que forman parte de las pruebas sin estar aún descritos en la guía; puede consultar tanto la versión que le corresponde como esos métodos por correo con el equipo de integraciones antes de la sesión.
El check-in por COM existe como funcionalidad, pero todavía no cuenta con una página propia. Si su proyecto lo requiere, puede solicitarlo por correo al equipo de integraciones.
Temas cubiertos exclusivamente en esta guíaAlgunos temas que la certificación evalúa aún no cuentan con una página propia: el cashback y sus condiciones mínimas, los tiempos de espera, el bloqueo de multi-instancias y el check-in por COM. En estos casos, la presente guía constituye la referencia aplicable, y cualquier detalle adicional puede solicitarse por correo al equipo de integraciones.
4. Reglas transversales que su sistema debe cumplir
Estas reglas se repiten a lo largo del cuestionario y de varios escenarios. Conviene resolverlas desde el principio, ya que cada una de ellas afecta a un bloque completo de la certificación.
Tiempos de espera
| Dónde | Lo que se espera de su sistema |
|---|---|
| Backend | Un webhook, o hilos que permanezcan a la espera de la respuesta. Si en su lugar utiliza un temporizador, debe ser de 3 minutos para venta normal y 5 minutos para venta con cashback, con un intervalo que consulte de forma continua si la respuesta ya llegó. |
| Frontend | Un indicador de carga que permanezca en espera. Si utiliza un temporizador, los mismos 3 y 5 minutos, o bien espera sin límite de tiempo. Si el usuario completa la transacción antes, su sistema debe recibir la respuesta antes de que expire esa espera. |
| SDK | Los métodos nativos onActivityResult o registerForActivityResult(). Si en su lugar utiliza un temporizador, aplican los mismos tiempos. |
| COM | El intervalo con el que consulta getResponse debe estar entre 500 ms y 2 000 ms, y el tiempo total de espera recomendado es de 3 minutos como mínimo. |
Bloqueo de multi-instancias
Su sistema no debe permitir enviar dos ventas al mismo tiempo: tras el primer envío, el control debe quedar bloqueado hasta recibir la respuesta, y la operación no debe generar ventas duplicadas. La misma regla aplica a la cancelación: pulsar el botón varias veces seguidas no debe producir intentos duplicados.
El campo con el que se valida el resultado
responseCode con valor 00 indica transacción aprobada; cualquier otro valor representa un error o una declinación. En SDK también es válido el campo success. El texto impreso en el ticket no es una fuente válida para determinar el resultado.
Cancelación
Debe realizarse el mismo día de la venta y, como referencia, antes de las 20:00 hora de Ciudad de México.
Restricciones de red en sus sucursales
El firewall de sus sucursales puede bloquear las transaccionesEs una causa frecuente de fallas que aparecen solo en algunas sucursales y no en el ambiente de desarrollo. Si su red aplica controles de acceso o filtrado de tráfico, deben habilitarse las URLs, los puertos y las direcciones IP que utiliza la comunicación con NetPay, tanto en pruebas como en producción.
Por tratarse de información sensible, el listado vigente se mantiene en un documento de acceso restringido: matriz de URLs y puertos. Al abrirlo se le pedirá solicitar acceso; la autorización la otorga el equipo de integraciones. Conviene aplicar la configuración antes de la sesión de certificación, ya que una restricción de red no detectada a tiempo detiene la ejecución de los escenarios.
Autenticación · solo en integraciones por API
El token de acceso debe regenerarse de forma periódica —por ejemplo, cada 6 u 11 horas—. El refresh token no está disponible actualmente, por lo que no debe utilizarse ni implementarse.
Desconexión del cable · solo en integraciones por COM
El método depende de la versión de la DLL: con la 1.5.5.2 el puerto COM asignado se valida con findPortByDescription(); a partir de la 1.7.0 se dispone de testConnection(). Es lo que se comprueba en el escenario de desconexión de cable, por lo que le sugerimos confirmar por correo con el equipo de integraciones qué versión corresponde a su proyecto.
Recuperación de una venta por orderId
orderIdCuando recupere mediante la reimpresión por orderId una venta que no llegó a su sistema, ese valor debe tomarse del ticket físico impreso, nunca de otra fuente.
5. El ticket personalizado
Va antes que el resto por una razón práctica: cuando el ticket personalizado aplica, se certifica antes que las demás pruebas, y si más adelante se modifica, las evidencias ya entregadas deben repetirse. Si mantiene el voucher oficial de NetPay, puede pasar directamente al apartado 6.
Casos en los que aplica
flowchart TD
A{"¿Aplica el ticket<br/>personalizado?"}
A -->|"mantiene el voucher<br/>oficial de NetPay"| Z["No se evalúa"]
A -->|"lo desactiva, o la<br/>terminal no imprime"| B{"¿Cumple la<br/>versión mínima?"}
B -->|"por debajo"| N["Ticket Personalizado<br/>No Certificado"]
B -->|"SDK 1.1.9<br/>DLL 1.6.0"| C{"¿Smart PinPad<br/>2.0 o mayor?"}
C -->|"no"| N
C -->|"sí"| D{"¿Certificado antes<br/>y sin cambios?"}
D -->|"sí"| E["Se puede omitir"]
D -->|"no"| F["Debe certificar<br/>su ticket personalizado"]
Dos condiciones encadenadas: primero la versión correspondiente a su canal y después la de la terminal. El incumplimiento de cualquiera de ellas no deja el punto pendiente, sino que lo registra como «No Certificado».
Los cuatro requisitos aplicables
| # | Condición |
|---|---|
| 1 | Integración SDK → versión 1.1.9 en adelante. |
| 2 | Integración COM → versión 1.6.0 en adelante. |
| 3 | Terminal IM30 o Aries8 → certificar ticket personalizado es obligatorio. |
| 4 | Todas las integraciones con ticket personalizado → Smart PinPad 2.0 en adelante. |
Consecuencia de no cumplir los requisitosCuando el ticket personalizado no puede certificarse, NetPay lo registra explícitamente como «Ticket Personalizado 'No Certificado'». Deshabilitar el voucher oficial sin haber certificado el propio implica asumir los riesgos operativos correspondientes, así como las implicaciones frente a la normativa bancaria vigente.
Detalle para quienes deben certificarlo
Si tras el diagrama anterior confirmó que debe certificar su ticket, despliegue lo que sigue. Si mantiene el voucher oficial de NetPay, puede omitirlo por completo.
Campos que se revisan en el ticket
Se valida que su ticket impreso contenga la misma información que el voucher oficial. Cada campo se marca como OK cuando el ticket lo cumple, y se adjunta la captura del ticket junto con el JSON de respuesta correspondiente.
| Qué se imprime | Campo de la respuesta | Regla | Restricción |
|---|---|---|---|
| Logotipo | — | El del comercio. | Opcional |
AFILIACIÓN: <valor> | affiliation | — | Obligatorio |
TIPO DE TRANSACCIÓN: <valor> | transType | Se traduce el valor: A → VENTA, V → CANCELACIÓN, PRE → CHECK IN, POA → CHECK OUT. PRE y POA solo se devuelven en la operativa de check-in y check-out. | Obligatorio |
| Dirección del comercio | streetName | Solo el valor, sin etiqueta. | Obligatorio |
NÚMERO DE COMERCIO: <valor> | storeId | — | Obligatorio |
| Población del comercio | cityName | Solo el valor, sin etiqueta. | Obligatorio |
NÚMERO DE CUENTA: ************<valor> | cardNumber · spanRoute | Prioridad a cardNumber; si no trae valor, se usa spanRoute. 12 asteriscos para VISA y MasterCard, 11 para AMEX; se distingue con cardTypeName cuando devuelve AMEX o AmericanExpress. | Obligatorio |
<valor> / <valor> / <valor> | cardTypeName · bankName · cardType | Los tres, separados por diagonal y en ese orden. cardType se traduce: C → CRÉDITO, D → DÉBITO, V → VALERA. Si alguno llega vacío, nulo o con valor U, no se imprime. | Obligatorio |
RETIRO DE EFECTIVO: $<valor> | cashbackAmount | — | Obligatorio si aplica |
COMISIÓN POR RETIRO: $<valor> | cashbackFee | — | Obligatorio si aplica |
SUBTOTAL: $<valor> | calculado | Con cashback: amount − cashbackAmount − cashbackFee. Con propina: se usa tipLessAmount. | Obligatorio si aplica |
PROPINA: $<valor> | tipAmount | — | Obligatorio si aplica |
<valor> MESES SIN INTERESES | promotion | El número de meses es dinámico. | Obligatorio si aplica |
TOTAL: M.N. $<valor> | amount | En negritas, con el símbolo de moneda (M.N. para moneda nacional) y de uno a dos puntos más de tamaño de letra. | Obligatorio |
FOLIO: <valor> | folioNumber | — | Obligatorio |
LOT NUM: <valor> | moduleLote | — | Obligatorio |
CARGO: <valor> | moduleCharge | — | Obligatorio |
TERMINAL: <valor> | terminalId | — | Obligatorio |
RRN: <valor> | rrnNumber | — | Obligatorio |
ORDERID: <valor> | orderId | — | Obligatorio |
APROBACIÓN: <valor> | authCode | — | Obligatorio |
FECHA Y HORA: <valor> | transDate · ticketDate | Prioridad a transDate; si no trae valor, se usa ticketDate. | Obligatorio |
ARQC: ************<valor> | arqc | Se ocultan todos los dígitos salvo los cuatro últimos. Si llega vacío o nulo, no se imprime. | Obligatorio |
TC: ************<valor> | transactionCertificate | Se ocultan todos los dígitos salvo los cuatro últimos. | Obligatorio |
AID: <valor> | aid | — | Obligatorio |
APP LABEL: <valor> | applicationLabel | Si llega vacío o nulo, no se imprime. | Obligatorio |
| Leyenda de verificación del tarjetahabiente | hasPin · hexSign | Solo el valor, sin etiqueta. La regla completa está en el diagrama de abajo. | Obligatorio |
| Nombre del tarjetahabiente | customerName | Solo el valor, sin etiqueta. Si llega vacío o nulo, no se imprime. | Obligatorio |
COPIA CLIENTE | — | Leyenda de la primera impresión del ticket. | Obligatorio |
COPIA NEGOCIO | — | Leyenda de la segunda impresión del ticket. | Opcional |
| Leyenda de NetPay | — | «RECUERDA QUE EN TU ESTADO DE CUENTA EL CARGO APARECERÁ A NOMBRE DE NETPAY». | Obligatorio |
| Versión de la aplicación | rePrintDate | Solo el valor, sin etiqueta. | Obligatorio |
Ticket Personalizado de <nombreComercio> | — | Con el nombre del comercio que se certifica. | Obligatorio |
Leyenda de verificación del tarjetahabiente: los tres casos posibles
flowchart TD
A["Respuesta de la venta"] --> B{"¿hasPin<br/>es true?"}
B -->|"sí"| C["FIRMADO<br/>ELECTRÓNICAMENTE"]
B -->|"no"| D{"¿hexSign trae<br/>algún valor?"}
D -->|"sí"| E["FIRMA<br/>DIGITALIZADA"]
D -->|"no"| F["AUTORIZADO<br/>SIN FIRMA"]La leyenda no se elige: se determina a partir de esos dos campos, evaluados en este orden.
El tercer caso se presenta porque, en operaciones contactless por debajo de ciertos montos que varían según la marca, no se solicita NIP ni firma.
Tickets que se certifican
Se revisan cuatro tickets, y el de venta se valida en ocho variantes. Cada una requiere su captura y su JSON.
| Ticket | Variantes que se revisan |
|---|---|
| Venta | Con NIP débito · Sin NIP, con firma digital · Contactless MasterCard mayor a $1,501 · Contactless MasterCard menor a $10 · A meses sin intereses · Con propina · Con cashback · Check-in |
| Reimpresión | Reimpresión, por folio o por orderId, de una venta exitosa. |
| Cancelación | Cancelación de una venta. |
| Declinación | Declinación de una transacción, por cualquier motivo. |
Lo que cambia en cada uno respecto del ticket de venta
| Ticket | Diferencia |
|---|---|
| Reimpresión | Añade la leyenda -----DUPLICADO-----, con cinco guiones antes y cinco después, a partir del campo isRePrint cuando devuelve true. Es obligatoria en el escenario de reimpresión de una declinación. |
| Cancelación | El total se imprime en negativo: TOTAL: M.N. -$<valor>. |
| Declinación | Es el ticket más corto de los cuatro: 22 campos frente a los 33 de la venta. Añade tres elementos —la leyenda -----DUPLICADO----- a partir de isRePrint, el responseCode y el message, estos dos impresos solo con su valor y sin etiqueta— y omite los que no existen en una transacción rechazada: retiro de efectivo, comisión por retiro, subtotal, propina, RRN, ORDERID, APROBACIÓN, ARQC, TC, AID, APP LABEL, la leyenda de verificación del tarjetahabiente, el nombre del tarjetahabiente y la leyenda de NetPay. |
6. Cómo se evalúa cada punto
Cada escenario de la hoja Pruebas se ejecuta en la terminal y se respalda con la captura del ticket y el JSON de respuesta de esa misma transacción.
Criterio de evaluación de cada escenario
flowchart TD
A["Consulta el escenario<br/>que le corresponde"] --> B["Ejecuta la prueba<br/>en la terminal"]
B --> C["Resguarda el ticket<br/>y el JSON"]
C --> D["Los entrega<br/>como evidencia"]
D --> E{"NetPay contrasta<br/>con lo esperado"}
E -->|"cumple"| F["Realizado"]
E -->|"parcial"| G["A<br/>Mejorar"]
E -->|"no<br/>existe"| H["No<br/>Implementado"]
E -->|"faltó<br/>material"| I["No<br/>realizado"]
Los cuatro estatus posibles no representan grados de una misma condición: dos se refieren al alcance de su sistema y dos a la ejecución de la prueba. De ahí la importancia de contar con todo el material antes de iniciar.
Niveles de obligatoriedad
| Nivel | Qué significa |
|---|---|
Obligatoria · Condición obligatoria. | Se ejecuta o se responde en todos los casos. Es indispensable para concluir la certificación. |
Obligatoria solo si aplica | Aplica únicamente si su sistema ofrece esa funcionalidad (MSI, propina, cancelación, NFC…). Si no la ofrece, se registra como No Implementado, y eso no impide cerrar la certificación. |
Recomendada · Recomendada. | No condiciona la certificación, aunque NetPay sugiere su ejecución. |
Opcional. | Su ejecución queda a criterio del comercio. |
Evidencia que debe entregar
Para cada escenario que así lo requiere, se adjunta:
- La captura del ticket impreso por la terminal.
- El JSON de respuesta recibido por su sistema.
Ambos elementos deben corresponder a la misma transacción. La discrepancia entre ellos —el ticket de una prueba acompañado del JSON de otra— es la observación más frecuente de todo el proceso.
7. Bloques que requieren pasos concretos
Dos bloques de su matriz de pruebas no se resuelven leyendo el resultado esperado: es necesario provocar la situación en la terminal. Estos son los pasos.
Reversos, de implementación obligatoria
Un reverso se produce cuando la comunicación se interrumpe a mitad de una transacción. Aplica a los tres canales y su manejo mediante la reimpresión por folio es de implementación obligatoria. Es un flujo poco frecuente, pero conviene dejarlo resuelto durante la certificación: cuando está bien implementado, el propio sistema del comercio resuelve el caso sin necesidad de consultarlo con NetPay. Existen dos tipos, con comportamientos distintos: el automático, que la terminal resuelve por sí sola, y el manual, que necesita una transacción posterior para completarse.
Los pasos y los mensajes descritos en este bloque corresponden a terminales Pax. En Urovo y en Kozen el flujo de reversos puede diferir; le sugerimos confirmarlo con el equipo de integraciones si su terminal es de alguna de esas marcas.
flowchart TD
S["Venta en curso<br/>tarjeta y NIP"]
S --> P["Procesando<br/>Autorización"]
P -->|"se<br/>completa"| A["APROBADA"]
P -->|"se retira<br/>la tarjeta"| DEC["DECLINADA<br/>código 05"]
P -->|"se apaga<br/>la terminal"| SIN["SIN<br/>RESPUESTA"]
A --> AC["Reimpresión:<br/>Aprobada · C"]
DEC --> RC["Reimpresión:<br/>Reversada · RV"]
RC --> FIN1["Reverso automático<br/>concluido"]
SIN --> PC["Reimpresión:<br/>Pendiente · PRV"]
PC --> V2["Venta normal<br/>el mismo día"]
V2 --> RC2["Reimpresión:<br/>PRV pasa a RV"]
RC2 --> FIN2["Reverso manual<br/>concluido"]
classDef ok fill:#e8f5e9,stroke:#43a047,color:#1b5e20
classDef ko fill:#fff3e0,stroke:#fb8c00,color:#e65100
classDef nd fill:#ffebee,stroke:#e53935,color:#b71c1c
class A,AC,FIN1,FIN2,RC,RC2 ok
class DEC,PC ko
class SIN nd
Los tres desenlaces de una venta y el valor que devuelve la reimpresión por folio en cada uno. La rama central corresponde al reverso automático y la rama derecha al reverso manual: en esta última, la transacción permanece en «Pendiente por Reversar» hasta que una venta posterior del mismo día detona el reverso. Los pasos exactos para provocar cada rama se detallan a continuación.
Cómo reproducir cada escenario
Los pasos exactos están abajo. Despliéguelos cuando vaya a ejecutar las pruebas.
Pasos para reproducir el reverso automático
- Lance una venta por cualquier monto.
- Inserte la tarjeta para iniciar el flujo de autorización.
- Ingrese el NIP cuando la terminal lo solicite, pero no presione «Enviar».
- Presione el botón verde para continuar con la autorización, cuente dos segundos y retire la tarjeta de inmediato.
- Obtendrá una declinación por «Error de lectura» o «Error de conexión», acompañada de
responseCodecon valor05. - Su sistema debe poder reimprimir declinaciones, al menos para este tipo de casos.
- Reimprima el voucher de esa transacción: debe obtener el mensaje «Transacción Reversada».
Pasos para reproducir el reverso manual
- Lance una venta por cualquier monto.
- Inserte la tarjeta e ingrese el NIP, presionando el botón verde para continuar.
- Cuando la terminal solicite retirar la tarjeta, no la retire.
- Apague la terminal por completo. Puede hacerlo desde el botón de apagado o retirando la fuente de alimentación; lo importante es que el equipo quede sin energía en ese momento. Su punto de venta no recibirá respuesta alguna, y por eso debe estar preparado para reimprimir en estos escenarios.
- Con la terminal apagada, retire la tarjeta y vuelva a encenderla.
- Realice una reimpresión: obtendrá «Transacción Pendiente por Reversar», lo que indica que la venta aún no se ha reversado.
- Para forzar el reverso, lance una venta normal por cualquier monto y complete la autorización hasta obtener el voucher de venta. Esa transacción detona el reverso pendiente.
- Reimprima desde su punto de venta la transacción que quedó pendiente: ahora obtendrá «Transacción Reversada».
El voucher personalizado en los escenarios de reverso: son dos impresionesSi su integración emite su propio voucher, cada uno de estos escenarios produce dos tickets distintos, y ambos se entregan como evidencia.
1 · El de la venta declinada. Es la variante de declinación de su voucher, e incluye el
responseCodeoriginal —05o el que entregue la terminal para ese error— y el mensaje original del error en una línea.2 · El de la reimpresión por folio. Es un ticket aparte, con la leyenda
-----DUPLICADO-----cuandoisRePrintdevuelvetrue, y con el mensaje que entrega la reimpresión: «Transacción Reversada» o «Transacción Pendiente por Reversar».Sus campos son los de la tabla Revisión de ticket de Declinación de la hoja TICKET-PERSONALIZADO, que es una de las cuatro que se certifican.
Los escenarios que se ejecutan y se evalúan
| Escenario | Criterio de aprobación |
|---|---|
| Reverso automático | La declinación llega con responseCode 05 y el reverso se realiza de forma automática. |
| Reimpresión por folio del reverso automático | Mensaje «Transacción Reversada» y reprintModule con valor RV. |
| Reverso manual | La transacción queda en «Pendiente por reversar». |
| Reimpresión por folio del reverso manual | Mensaje «Transacción Pendiente por Reversar» y reprintModule con valor PRV. |
| Venta posterior al reverso manual | La nueva venta se aprueba y detona el reverso de la anterior. |
| Reimpresión por folio después del reverso | La transacción que estaba pendiente ya aparece como reversada: el mensaje cambia a «Transacción Reversada» y reprintModule pasa de PRV a RV. |
| Reimpresión por folio del reverso en Urovo CoreX · solo SDK en terminal Urovo | Además de RV, devuelve responseCode con valor R. |
| Voucher personalizado de la declinación | Solo si genera su propio voucher: se entregan los dos tickets descritos arriba, el de la venta declinada y el de la reimpresión. |
Los valores que devuelve la reimpresión por folio
Si almacena estos escenarios en su base de datos, los estatus de esas ventas deben actualizarse. El campo que debe consultar es reprintModule dentro del objeto JSON de respuesta, no responseCode:
| Valor | Significa |
|---|---|
C | Transacción aprobada |
V | Transacción cancelada |
D | Transacción declinada |
RV | Transacción reversada |
PRV | Pendiente por reversar: se requiere una transacción más en el mismo día |
En terminales Urovo con CoreX, la reimpresión posterior al reverso devuelve además responseCode con valor R. En el escenario de reverso automático sobre CoreX en integraciones SDK, la respuesta llega con message «Transacción Reversada», reprintModule con valor RV y responseCode con valor R40.
La terminal es la fuente de verdadAnte cualquier discrepancia de estatus entre NetPay Manager y la terminal, debe prevalecer el resultado de la reimpresión por folio en la terminal. Ninguna otra consulta es una fuente válida para determinar el estatus de un reverso.
Check-in y check-out, si su integración lo incluye
Aplica únicamente a las modalidades checkinAPI-checkoutAPI, checkinSDK-checkoutAPI y checkinCOM-checkoutAPI. Si la suya no es una de ellas, puede omitir este apartado.
Cómo funcionan el check-in y el check-out
El check-in se envía desde su propio canal —API, SDK o COM— con la misma petición de venta de siempre, activando la bandera checkIn en true. Lo procesa la terminal como cualquier venta, así que imprime el ticket oficial de NetPay, y la respuesta llega por su vía habitual: el webhook en API, el onActivityResult en SDK. En esa respuesta, transType devuelve PRE y preAuth devuelve 1.
El check-out es distinto: se consume en una API independiente de la terminal. El equipo no interviene, no imprime nada, y por eso el comprobante del cierre se obtiene con la reimpresión por folio.
flowchart TD
A["Check-in desde su canal<br/>checkIn: true"] --> B["La terminal procesa<br/>la preautorización"]
B --> C["Imprime el ticket oficial<br/>de NetPay"]
C --> D["Respuesta con transType PRE<br/>y transactionId"]
D --> E["Check-out por la API CheckIO<br/>con storeId, transactionId<br/>y totalAmount"]
E --> F["La API confirma el cierre<br/>sin imprimir ticket"]
F --> G["Reimpresión por folio<br/>para obtener el comprobante"]
classDef term fill:#e8f0fe,stroke:#4a6fa5,color:#12233d
classDef api fill:#fff4e5,stroke:#c98a2e,color:#4a3208
class A,B,C,D,G term
class E,F apiEn azul, lo que pasa por la terminal; en ámbar, lo que ocurre fuera de ella. El check-out siempre es por API, sea cual sea el canal del check-in, y es el único paso que no deja ticket impreso.
El campo que enlaza las dos operaciones estransactionIdNo es el folio ni el
orderId. EltransactionIdviene en la respuesta del check-in y es el valor con el que después se cierra el check-out, así que su sistema debe guardarlo. El cuerpo del check-out lleva únicamentestoreId,transactionIdytotalAmount.
Lo que responde la API de check-out
El servicio se autentica con una api-key que se envía en el encabezado Authorization. Es única por COMPANY y solo sirve para los STORE que pertenecen a esa COMPANY; NetPay entrega la URL y la clave por correo, distintas en pruebas y en producción.
| Respuesta | Qué significa |
|---|---|
202 · code 00 | Cierre aprobado. Devuelve el transactionId de la nueva transacción. |
202 · code 05 | Ese check-in ya tenía un check-out: no se puede volver a cerrar. |
409 · code 04 | No se encontró el check-in con ese transactionId. |
409 · code 06 | El StoreId no tiene habilitada la operativa de check-in y check-out. |
409 · code 08 | Error de NetPay: debe reportarse al equipo de soporte. |
409 · code 09 | El monto excede lo permitido para cerrar. |
401 · sin code | La api-key no tiene permisos sobre ese StoreId. |
Un200 OKsin contenido no es un cierre exitosoCuando la petición viene mal formada, el servicio responde
200pero con el cuerpo vacío, y su sistema no debe interpretarlo como una transacción aprobada. Conviene validar que el JSON sea sintácticamente correcto, questoreId,transactionIdytotalAmountestén presentes, y que el tipo de dato de cada uno sea el esperado.
Un check-out con monto $0 actúa como una cancelaciónNo es un error del servicio: se acepta, y en NetPay Manager la operación queda registrada como un check-out con monto $0. Le sugerimos que su sistema impida enviarlo de forma accidental —por un campo vacío o un total sin calcular—, ya que el efecto es cerrar la preautorización sin cobro.
Sobre el monto del check-outEl límite depende del giro del comercio. En giros gasolineros no se permite cerrar por encima del 100 % del monto preautorizado. Para el resto de los giros, la operativa admite hasta el monto original más un 20 %, y un intento superior se rechaza con el código
09.A efectos de la certificación, conviene tener presente que el ambiente de pruebas hoy solo permite validar hasta el 100 %. Si su caso requiere cerrar por encima de ese porcentaje, le sugerimos confirmarlo por correo con el equipo de integraciones antes de la sesión.
La validación no debe quedar únicamente del lado de NetPay: el sistema del comercio también debe impedir el envío de un monto superior al permitido.
Las referencias publicadasIntegración Checkin API / Checkout API para el check-in por API, e Integración de Check-in SDK para el check-in por SDK. El check-in por COM existe como funcionalidad, pero todavía no cuenta con una página propia: si su proyecto lo requiere, puede solicitarlo por correo al equipo de integraciones.
8. Interpretación de los estatus
Cada pregunta y cada escenario recibe un estatus durante la revisión. Esta tabla le será útil sobre todo cuando NetPay le devuelva sus resultados.
Significado de cada estatus
| Estatus | Quién lo pone | Qué significa |
|---|---|---|
| Pendiente / Pendiente ejecutar | Estado inicial | Aún no se contesta o no se ejecuta. |
| Falta validar si lo implementó el comercio | NetPay | Es el estatus inicial de los escenarios opcionales. NetPay aún no sabe si esa funcionalidad existe en su sistema y espera su confirmación para incluirlos o descartarlos. |
| En revisión | NetPay | Recibido y en evaluación. |
| Realizado ✔ / OK | NetPay | Cumple el resultado esperado. |
| A Mejorar | NetPay | Opera correctamente, aunque presenta áreas de oportunidad que deben atenderse. |
| No Implementado | NetPay | La funcionalidad no existe en su sistema. |
| No Aplica | NetPay | No corresponde a su tipo de integración. |
| No realizado debido a falta de insumos | NetPay | No fue posible ejecutarlo por ausencia de tarjeta, StoreId, versión o terminal. Es el estatus que con mayor frecuencia se evita reuniendo el material descrito en el apartado 2. |
| Ticket Personalizado 'No Certificado' | NetPay | El ticket propio no cumplió los requisitos del apartado 5. |
9. Puntos importantes que pueden retrasar la certificación
Estos son los puntos que con más frecuencia obligan a repetir una prueba o a reabrir un punto durante la revisión. Le sugerimos leerlos antes de empezar a llenar su matriz de pruebas, no después.
Lo que con más frecuencia genera retrasos
- Definir tarde el alcance. Cambiar el tipo de integración con el trabajo ya avanzado modifica las preguntas y los escenarios que aplican, y obliga a revisar de nuevo lo ya respondido.
- Responder el cuestionario sin verificar. Cada respuesta se contrasta con el comportamiento observado durante las pruebas, y cualquier incongruencia reabre el punto.
- Tiempos de espera insuficientes. Un temporizador de 60 segundos en el frontend compromete buena parte del bloque de esperas.
- Folio no único. Si el folio se repite entre sucursales o en operaciones declinadas, la recuperación por reimpresión deja de ser posible y varios escenarios quedan sin resolver.
- Evaluar el resultado con un campo distinto al indicado. El campo aplicable es
responseCode(00), osuccessen SDK; no el texto impreso en el ticket. - Utilizar Print-Ticket para consultar el estatus de reversos. La documentación indica que no es fiable para ese fin; debe emplearse la reimpresión por folio.
- Enviar el
orderIdcorto en devoluciones. La API de devoluciones requiere elorderIdlargo que devuelve Print-Ticket. - Evidencias cruzadas. El ticket de una prueba acompañado del JSON de otra.
- Iniciar la sesión sin el material requerido. Sin tarjeta contactless, sin un BIN habilitado para cashback o sin la versión mínima de Smart PinPad, la prueba se registra como No realizado por falta de insumos.
- Desactivar el voucher oficial sin certificar el propio. Conduce directamente al estatus Ticket Personalizado 'No Certificado'.
Precisiones sobre funcionalidades concretas
Los dos primeros aplican a cualquier integración; los siguientes solo si su sistema ofrece esa funcionalidad, por lo que se presentan plegados.
Aplica a toda integración
El manejo de reversos es de implementación obligatoriaNo es opcional ni depende de su tipo de integración: aplica a API, SDK y COM por igual, y se resuelve mediante la reimpresión por folio. Es un flujo poco frecuente y, precisamente por ello, suele quedar para el final y llegar sin implementar a la sesión de certificación. Los dos tipos de reverso, los pasos para provocar cada uno y los valores que devuelve la reimpresión están en el apartado 7.
Una venta de su sistema puede corresponder a varias transacciones en la terminalOcurre en las ventas parciales y en cualquier cobro que se liquide con más de una tarjeta o en más de un intento. Para su sistema es una sola venta, con un importe único y un solo registro en su base de datos; para la terminal son transacciones independientes, y cada una tiene su propia autorización y su propio resultado.
Por esa razón, cada transacción enviada a la terminal debe llevar un folio distinto. Si dos cobros comparten el mismo folio, la consulta por folio devolverá únicamente uno de ellos y el otro quedará sin trazabilidad. Ese es precisamente el punto que se valida.
Aplica solo si su integración lo incluye
Propina · valor por defecto
En todos los escenarios de propina, el valor propuesto por defecto debe ser inferior al 25 % del monto de la venta. Es el único requisito transversal del bloque: el resto de los escenarios de propina ya vienen listados en su matriz de pruebas.
Devoluciones · si su integración las incluye
Una devolución, total o parcial, se considera exitosa cuando el campo code devuelve el valor 02. Cualquier otro valor debe tratarse como un error y así debe registrarlo su sistema.
Cashback · solo en integraciones por COM
El cashback está disponible únicamente en integraciones por COM, en la variante COM (con cashback). Si su integración es por API o por SDK, este apartado no le aplica.
Las cinco condiciones del cashback
Para que la terminal ofrezca cashback deben cumplirse las cinco de forma simultánea: monto mínimo de venta, monto mínimo de retiro, StoreId habilitado para la operativa, Smart PinPad 2.4 o superior, y un BIN de tarjeta incluido en la lista autorizada. Si alguna no se cumple, la venta continúa sin cashback, y precisamente ese comportamiento es el que se valida.
El flujo de cashback tiene dos respuestas
La primera confirma el cashback; la segunda cierra la venta. Su sistema debe estar preparado para ambas, y también para que el usuario demore entre una y otra: puede emplear un minuto en insertar la tarjeta, uno o dos en ingresar el NIP con algún reintento y minuto y medio en confirmar el retiro, y aun así su sistema debe recibir la respuesta.
Si el cashback no se confirma en el punto de venta
La terminal devuelve una respuesta de timeout a los 2 minutos. Es uno de los escenarios de la certificación, y su sistema debe procesar esa respuesta sin quedar bloqueado.
