Autenticación y firma
URL base y formato
- Endpoint:
https://api.cobrex.com - Formato: peticiones y respuestas en JSON (
Content-Type: application/jsoncuando hay cuerpo). - Claves: se crean en ajustes del panel.
Códigos HTTP
| Rango | Significado |
|---|---|
| 200 | Éxito (en la documentación Cobrex suele ser 200). |
| 4xx | Error del cliente: firma, parámetros, permisos, no encontrado. |
| 5xx | Error del servidor; reintente más tarde si aplica. |
Cabeceras obligatorias
Toda petición protegida debe incluir:
1. x-uid o x-mid
x-uid— id de usuario (u-…). Para operaciones a nivel de cuenta.x-mid— id de comerciante (m-…). Para el contexto comerciante (p. ej. retiro desde la cuenta vinculada).
Envíe exactamente una de las dos, según el flujo.
2. x-timestamp
Hora actual en segundos enteros desde 1970-01-01 UTC (Unix). Reduce riesgo de replay; el servidor puede rechazar marcas antiguas o demasiado futuras.
const timestampSec = Math.floor(Date.now() / 1000);
No use Date.now() puro — son milisegundos y no coincidirá con la firma esperada.
3. x-signature
HMAC-SHA256 en hex de la cadena canónica (abajo), con su secreto API.
Cómo construir la cadena a firmar (paso a paso)
- URL completa de la petición — exactamente como llama a la API:
https+://+ host + ruta + query (si existe).
El orden de los parámetros en la query debe coincidir con la petición. - Salto de línea LF
\n. - Solo segundos — el mismo valor que envía en
x-timestamp. - Si hay cuerpo (p. ej. JSON en
POST):\n- Cuerpo en bruto — los mismos bytes que envía (tras
JSON.stringifyo equivalente).
Espacios y orden de claves deben coincidir con el cuerpo real.
Si no hay cuerpo (típico GET): deténgase tras el paso 3. No añada un \n extra por “cuerpo vacío”.
Ejemplo POST
https://api.cobrex.com/wallet
1752675847
{"asset":["USDT","TRX"],"network":"TRON","client":"test1","callback":"https://api.cobrex.com/webhook"}
Ejemplo GET
https://api.cobrex.com/payment/p-1a9a67a1-46ce-11f1-8b35-7cc255316480
1752675847
Firma hex en código
- Construya
canonicalStringcomo arriba. - HMAC-SHA256 sobre
canonicalStringcon el secreto API. - Codifique el digest en hex (minúsculas es habitual).
Node.js (crypto):
const crypto = require('crypto');
function cobrexRequestSignature(canonicalString, apiSecret) {
return crypto.createHmac('sha256', apiSecret).update(canonicalString).digest('hex');
}
Errores frecuentes
| Problema | Efecto |
|---|---|
Milisegundos en x-timestamp | La firma no coincide. |
| Otro orden/espaciado en JSON | Otro cuerpo → otra firma. Serialice una vez y reutilice. |
| URL sin query u orden distinto | La cadena canónica difiere del servidor. |
\n de más sin cuerpo | La firma no coincide. |
Webhooks: verificar peticiones entrantes
Cobrex llama a su URL cuando cambia el estado de un pago o retiro. El cuerpo es JSON (objeto de pago u objeto de retiro).
Opción A — lista blanca de IP
Solo acepte tráfico desde las IP de Cobrex:
46.166.162.83
(La infra puede cambiar — confirme la lista en soporte antes de producción.)
Opción B — cabecera x-signature
-
Lea el cuerpo HTTP en bruto como texto/búfer antes de
JSON.parse. -
Parse JSON a
datapara la lógica de negocio. -
Firma esperada según reglas Cobrex del webhook; a menudo es más fiable el HMAC sobre la cadena del cuerpo en bruto:
const crypto = require('crypto');const expected = crypto.createHmac('sha256', apiSecret).update(rawBodyString).digest('hex'); -
Compare
expectedconx-signaturecon comparación en tiempo constante.
Siguiente: cuentas y saldos, pagos, retiros.