Especificación del protocolo
Este documento proporciona la especificación técnica del Network-Agnostic Secure Payment Instruction Protocol (NASPIP) tal como lo implementan Fluxis y naspip-go.
Descripción general
NASPIP define un formato estandarizado para instrucciones de pago que pueden transmitirse y validarse de forma segura en cualquier red de pago. Los tokens son PASETO v4 public (firmados, no cifrados) — cualquiera con la clave pública del emisor puede verificar autenticidad e integridad del payload.
Estructura de datos
Formato del token NASPIP
Un token NASPIP es una cadena delimitada por punto y coma que envuelve un token PASETO v4 public:
Code
| Component | Description | Example |
|---|---|---|
| Prefix | Identificador del protocolo | naspip |
Key issuer (kis) | Entidad que emitió la clave de firma | fluxis.us |
Key ID (kid) | Identificador de la clave de firma | fluxis.qr.dyn.1 |
| PASETO token | Token PASETO v4 public que contiene el payload firmado | v4.public.IhYyMDI... |
El payload interno de PASETO usa claims estándar (iss, sub, exp, iat, kid, kis, kep) más un campo data que contiene instrucciones de pago o un payload URL.
Esquemas de payload
NASPIP admite dos tipos de payload dentro del campo data del token PASETO.
Payload de instrucción (pago directo)
Code
Payload URL (checkout / instrucciones diferidas)
Code
Los códigos QR estáticos de PoS pueden omitir payment_options; las wallets llaman POST /v1/naspip/read y Fluxis resuelve las instrucciones obteniendo la URL cuando payment_options está ausente.
Operaciones criptográficas
NASPIP usa tokens PASETO v4 public con claves Ed25519. Los payloads se codifican en protobuf antes de firmar. En Fluxis, use naspip-go o la REST API — no implemente Ed25519+SHA-256 crudo sobre JSON.
Firma (create)
- Construir
InstructionPayloadoUrlPayload - Codificar el payload como protobuf
- Firmar con PASETO v4 usando la clave privada Ed25519 del emisor
- Prefijar con
naspip;{kis};{kid};
TTL predeterminado del token: 1 hora para instrucciones de pago; 10 años (87600h) para payloads solo URL.
Verificación (read)
- Dividir el token por
;y validar el prefijonaspip - Resolver la clave pública por
kis+kid - Verificar la firma PASETO v4 y los claims de expiración
- Devolver
PasetoCompleteResultconpayload.dataparseado
Forma de respuesta de Fluxis POST /v1/naspip/read
Code
::::warning Discrepancia en Swagger
OpenAPI documenta actualmente data como PasetoV4PayloadData plano (url, payment, order). La respuesta en runtime es PasetoCompleteResult como se muestra arriba. Consulte NASPIP_ENHANCEMENTS.md para la corrección planificada.
:::::
Soporte de redes
Las instrucciones de pago referencian activos por unique_asset_id (UAI), no por nombre de red o chain ID. Fluxis admite múltiples redes — consulte UAI para la lista completa de activos.
UAIs de ejemplo:
| Network | Asset | Example UAI |
|---|---|---|
| Polygon | USDC | npolygon_t0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 |
| Base | USDC | nbase_t0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| Avalanche | USDC | navalanche_t0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E |
| Avalanche | ARGt | navalanche_t0x2E4e93eCA2E16E4989b894e188B7F7fC0175703B |
| Arbitrum | USDC | narbitrum_t0xaf88d065e77c8cC2239327C5EDb3A432268e5831 |
| Arbitrum | USDT | narbitrum_t0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 |
Formato de código QR
Los tokens NASPIP se codifican en códigos QR como la cadena de token cruda (no una URI naspip://):
Code
Especificaciones del código QR
- Error Correction: Level M (15% recovery)
- Size: Minimum 256x256 pixels
- Format: Standard QR Code (ISO/IEC 18004)
Versionado
Los tokens NASPIP usan PASETO v4 (v4.public.*). El prefijo delimitador por punto y coma es naspip. Los cambios incompatibles en esquemas de payload se gestionan mediante releases de naspip-go.
Manejo de errores
Códigos de error de la API Fluxis (relacionados con NASPIP)
| Code | HTTP | Description |
|---|---|---|
MD0006 | 406 | Token NASPIP expirado |
GE0003 | 404 | Clave pública expirada |
MD0004 | 400 | Datos inválidos (p. ej. token o URL inválidos) |
PR0006 | 404 | No hay solicitud de pago activa (PoS caja; devuelto al resolver payload URL) |
Formato de respuesta de error
Code
Consideraciones de seguridad
Buenas prácticas
- Administración de claves: Fluxis gestiona las claves de firma; los integradores verifican vía búsqueda de clave pública (
kis+kid) - Expiración del token: Los tokens de instrucción de pago expiran tras 1 hora por defecto
- Validación de importes: Valide importes en el lado del emisor y del receptor
- Verificación de activos: Confirme que
unique_asset_idcoincide con la red y token esperados - Verificación de firma: Verifique siempre los tokens PASETO antes de procesar pagos
Modelo de amenazas
NASPIP protege contra:
- Manipulación de datos: Las firmas PASETO v4 previenen modificaciones
- Ataques de replay: La expiración del token y el ciclo de vida de la solicitud de pago previenen reutilización
- Suplantación: La verificación de clave pública vía
kis+kidgarantiza autenticidad
Directrices de implementación
Campos requeridos (payload de instrucción)
payment.address— dirección de destinopayment.unique_asset_id— activo objetivo (UAI)payment.amount— importe del pagopayment.is_open— si el importe es abierto
Campos opcionales
payment.id— identificador de solicitud de pagopayment.expires_at— expiración timestamp Unixorder— metadatos de comerciante y pedido
Reglas de validación
- El token debe parsearse como
naspip;{kis};{kid};v4.public.{paseto} - La firma PASETO y la expiración deben ser válidas
- La clave pública para
kis+kidno debe estar expirada unique_asset_iddebe ser un UAI admitido
Resolución de payload URL (Fluxis)
Cuando POST /v1/naspip/read recibe un token cuyo payload.data contiene una url no vacía y no payment_options:
- Fluxis realiza un HTTP GET a esa URL
- En caso de éxito, reemplaza
payload.datacon las instrucciones de checkout/pago obtenidas - En caso de fallo, devuelve
MD0004oPR0006según corresponda
Si payment_options está presente, el token se devuelve tal cual y la wallet selecciona un activo antes de una llamada de checkout posterior.
Endpoints de la API Fluxis
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/v1/naspip/read | POST | Bearer + x-fluxis-api-key | Verificar token y devolver PasetoCompleteResult |
/v1/naspip/create | POST | Bearer + x-fluxis-api-key | Crear token desde payload de instrucción o URL |
Consulte la Implementation Guide para ejemplos curl.