QR dinámico
Diagrama de estado del QR dinámico

- Pendiente: Es el estado inicial de un QR.
- Eliminado: Solo se puede eliminar un QR si el mismo se encuentra en estado “Pendiente”. Bajo determinados casos especiales puede ocurrir por excepción que un QR “Eliminado” pase a “Pagado”
- Pagado: Si un QR se encuentra en estado “Pendiente”, puede pasar a “pagado”. Lo cual este puede ser devuelto.
- Devuelto: Se puede devolver un QR solo si se encuentra en estado “pagado”.
Generación de un QR dinámico
Contenido del QR
Los datos a cambiar son sólo aquellos que se encuentran entre dos pares de llaves (incluyendo las mismas) y las “XX” y “ZZ”.
00020101021143370012com.pagos36098113059891004599020150150011{{ CUIT }}5204{{ CATEGORY_CODE }}53030325802AR59XX{{ COMPANY_NAME }}60XX{{ CITY }}6108{{POSTAL_CODE}}62XX01ZZ{{ QR_ID }}6304{{ CHECKSUM }}
¿Cómo interpretar correctamente un QR String?
El QR String no tiene una longitud máxima fija, pero debe cumplir con el estándar EMVCo Merchant Presented Code, en el cual ciertos atributos tienen un límite de longitud.
Para interpretar correctamente la estructura del QR String, se deben tener en cuenta los siguientes elementos:
Ejemplo simple: 00 02 01
- La primera columna de 2 dígitos “00” corresponden a la posición.
- La segunda columna de 2 dígitos “02” corresponden a la longitud del valor.
- La tercera columna “01” es el valor asociado a la posición.
Ejemplo con sub-matriz:
43 37
00 12 com.pagos360
98 11 30714100803
99 02 01
- La primera columna de 2 dígitos “43” corresponde a la posición.
- La segunda columna de 2 dígitos “37” corresponde a la longitud de la sub-matriz que sigue.
- La tercera columna contiene una sub-matriz con diferentes niveles, donde:
- La primera columna de 2 dígitos “00” corresponde a la posición dentro de la sub-matriz.
- La segunda columna de 2 dígitos “12” corresponde a la longitud del valor de la sub-matriz.
- La tercera columna “com.pagos360” es el valor asociado a esa posición dentro de la sub-matriz.
Data | Descripción | Observaciones |
---|---|---|
00 02 01 | Indicador de formato. | Constante. |
01 02 11 | Punto del método de iniciación. | Constante. |
43 37 00 12 com.pagos360 98 11 30714100803 99 02 01 | Identificador de PAGOS360. | Constante. |
50 15 00 11 {{ CUIT }} | CUIT de la compañía. | Numérico. Siempre debe ser de 11 dígitos. |
52 04 {{ CATEGORY_CODE }} | Código de categoría de la compañía. | Constante. Numérico. Debe ser de 4 dígitos |
53 03 032 | Código de la moneda. | Constante. |
58 02 AR | Código del país. | Constante. |
59 XX {{ COMPANY_NAME }} | Largo y nombre de la compañía. | El largo debe ser de dos dígitos. El nombre debe ser del largo que indica anteriormente, hasta 25 carácteres. |
60 XX {{ CITY }} | Largo y nombre de la ciudad. (El nombre DEBE estar en mayúsculas.) | El largo debe ser de dos dígitos. El nombre debe ser del largo que indica la variable anterior, hasta 15 carácteres. |
61 08 {{POSTAL_CODE}} | Es el código postal de la empresa. En este caso utilizamos el CPA | La cantidad máxima y mínima es de 8 caracteres. El valor constante debe ser X5009KHC |
62 XX 01 ZZ {{ QR_ID }} | ID único del QR y su largo. ZZ corresponde al largo del QR_ID. XX = ZZ + 4 (suma numérica) | El ID del QR debe contener el ID de la cuenta del negocio, en su caso, valor constante igual a 454133B2 seguido de un “-” y el identificador a su elección. El tamaño total no debe superar los 25 caracteres. Luego de la constante “454133B2-” se debe concatenar un id que como máximo tenga 16 caracteres. El mismo puede estar conformado por números y letras |
63 04 {{ CHECKSUM }} | Checksum (CRC) para validar la integridad del string. | Alfanumérico. Siempre debe ser de 4 carácteres. |
¿Qué es el CRC / checksum?
La verificación por redundancia cíclica (CRC) es un código de detección de errores usado frecuentemente en redes digitales y en dispositivos de almacenamiento para detectar cambios accidentales en los datos.
¿Cómo se calcula?
El checksum se debe calcular conforme al estándar [ISO/IEC 13239] usando el polinomio '1021' (hex) y el valor inicial 'FFFF' (hex).
Los datos que se deben incluir en el armado del checksum abarcan a todos los objetos que se incluirán en el Código QR, en su orden respectivo, así como el ID y longitud del propio CRC (pero excluyendo su valor).
Ejemplo en javascript
const calculateCRC = function (qrString) {
qrString = qrString.split('').map((c) => c.charCodeAt(0))
let crc = 0xffff + 0
const polynomial = 0x1021
for (const b of qrString) {
for (let i = 0; i < 8; i++) {
const bit = ((b >> (7 - i)) & 1) === 1
const c15 = ((crc >> 15) & 1) === 1
crc <<= 1
if (c15 ^ bit) crc ^= polynomial
}
}
return (crc &= 0xffff).toString(16).padStart(4, 0);
}
Links de utilidad:
https://es.wikipedia.org/wiki/Verificaci%C3%B3n_de_redundancia_c%C3%ADclica