QR estático
Diagrama de Estado del QR Estático

- 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 Estático
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”.
00020101021243370012com.pagos36098113059891004599020150290011232448256640110PezRX0SIxq5204509453030325802AR5906Prisma6007CORDOBA63047846
¿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 12 | 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 XX 00 11 {{ CUIT }} 01 XX {{QR_NAME}} |
| CUIT:
Nombre del QR:
|
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. |
63 04 {{ CHECKSUM }} | Checksum (CRC) para validar la integridad del string. | Alfanumérico. Siempre debe ser de 4 carácteres.00 02 0100 02 0100 02 0100 02 0100 02 0100 02 0100 02 0100 02 0100 02 01 |
¿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