En QRwey!, resolver un código QR significa validar su firma y obtener el detalle completo de la transacción asociada.
Esto es lo que ocurre cuando un usuario escanea un QR desde la app de QRwey! (o cuando tú necesitas validar un QR desde tu backend).
Un QR de QRwey! no expone datos sensibles. En su lugar contiene (o apunta a) un deep link con 3 parámetros:
v: versión del formatot: token opaco (Base64URL)m: firma HMAC truncada (Base64URL)
Ejemplo de contenido (deep link):
https://clients.qrwey.com/go?v=1&t=YWFh...&m=YmJi...⚠️ Importante: no confíes en el contenido de cualquier QR sin validarlo vía API. La verificación real ocurre en los servidores de QRwey! Este endpoint es OPCIONAL ya que este proceso de lectura normalmente sucede en la app móvil de QRwey!
GET /api/v1/qrs?v=<v>&t=<t>&m=<m>Host (DEV):
https://api-dev.qrwey.comHost (PROD):
https://clients.qrwey.comX-API-Key: TU_API_KEYSi tienes el qr_content (recomendado guardar este valor al generar el QR), extrae los parámetros v, t y m desde la URL.
Ejemplo:
qr_content = "https://clients.qrwey.com/go?v=1&t=YWFh...&m=YmJi..."Extrae:
v = 1t = YWFh...m = YmJi...
Ejemplo en DEV:
curl -X GET "https://api-dev.qrwey.com/api/v1/qrs?v=1&t=YWFh...&m=YmJi..." -H "X-API-Key: TU_API_KEY"Si estás en PROD, cambia el host a:
curl -X GET "https://clients.qrwey.com/api/v1/qrs?v=1&t=YWFh...&m=YmJi..." -H "X-API-Key: TU_API_KEY"Una respuesta exitosa (200) retorna el detalle de la transacción y su desglose. Ejemplo:
{
"id": "tra_4aca0361cfcd41c097663db44008fbb9",
"store": "PetroStation #45",
"issuer_rfc": "EKU9003173C9",
"issuer_name": "ESCUELA KEMPER URGATE",
"amount": 133.0,
"subtotal": 115.08,
"currency": "MXN",
"sat_payment_method": "04",
"sat_payment_method_desc": "Tarjeta de crédito",
"created_at": "2025-09-29T13:00:00Z",
"expires_at": "2025-09-30T23:59:59Z",
"operation": "INVOICE",
"operation_data": [
{
"sku": "GAS87",
"description": "Gasolina Magna",
"amount": 115.08,
"quantity": 30,
"sat_unit_key": "LTR",
"sat_unit_desc": "Litro",
"unit_price": 20.325,
"sat_product_service_key": "15101515",
"sat_product_service_desc": "Gasolina premium mayor o igual a 91 octanos",
"sat_tax_object_key": "02",
"sat_tax_object_desc": "Sí objeto de impuesto",
"taxes": [
{
"type": "Traslado",
"tax": "002",
"factor": "Tasa",
"rate": "0.160000",
"taxable_base": 112.0,
"amount": 17.92
}
]
}
]
}Depende del actor:
- Muestra al cliente el detalle de la transacción (solo si aplica*)
- Guarda el
idcomo referencia interna
- Presenta la información al usuario para revisión/confirmación
- Si el usuario esta OK con la información, puede timbrar dicha intención a CFDi con un clic
| Código | Significado | Qué hacer |
|---|---|---|
| 400 | Parámetros inválidos (v, t o m) / firma inválida | Verifica que copiaste completo t y m |
| 401 | API Key inválida o ausente | Revisa X-API-Key y el ambiente |
| 404 | Token no encontrado (revocado/purgado) | Trata como QR inválido |
| 409 | Token ya consumido (si aplica) | Muestra mensaje de “QR ya utilizado” |
| 410 | QR expirado | Solicita generar uno nuevo |
| 422 | Regla de negocio / configuración | Revisa code y message en la respuesta |
Consulta: Manejo de errores
- Resuelve siempre desde tu backend (no expongas API Keys)
- Maneja explícitamente
410 Gone(expiración) - Trata
404como “QR inválido” sin filtrar detalles - Registra
id,created_at,expires_atpara auditoría y soporte
- Estados y seguridad: Ciclo de vida del QR
- Reintentos seguros: Idempotencia & Reintentos
- Contrato completo: Referencia del API