Titanio PayDocumentación

Guía de integración · PRIVORA con Titanio Pay

Para el equipo de PRIVORA. Responde, punto por punto, al contrato que pide el ADR-006 de ~/privora/docs/DECISIONES.md, con los nombres reales que publica Titanio 2.0.0. Referencia completa: docs/API.md y https://ceoo.world/pago/docs.

1. Modelo: una plataforma, un comercio por fraccionamiento

2. Lo que pidió el ADR-006 y cómo queda

ADR-006 pideTitanio 2.0.0Nota
POST /api/cobro con x-integration-token por comercioPOST /api/v1/cobros con Authorization: Bearer <llave de plataforma> + Titanio-ComercioLa ruta heredada sigue viva para Capital Trading; la nueva es la de PRIVORA
Idempotency-Key: prv-<fee_assessment_id>-<intento>Igual, obligatoriaMisma llave + mismo cuerpo = mismo cobro; otro cuerpo = 409
monto_centavos entero, moneda: "MXN", conceptoIgualDecimales = 400
referencia_externa: "PRV-<community_id>-<fee_assessment_id>"Igual; viaja en cada evento y se puede buscar: GET /api/v1/cobros?referencia_externa=…
metodos (tarjeta, spei, oxxo)Se acepta la lista; Titanio toma el primero que puede atender hoy (hoy: spei)Tarjeta y OXXO para terceros requieren contrato con agregador
notificar_url por cobroWebhook por comercio (POST /api/v1/comercio/webhook) o el de la plataforma, que recibe los eventos de todos sus hijosUna URL por comercio evita que un cobro desvíe notificaciones
metadatos (comunidad, predio, periodo)Igual, hasta 20 claves
Cabeceras X-Titanio-Evento (id único) y X-Titanio-Firma: t=…,v1=…Se envían exactamente así (además de Titanio-Evento-Id y Titanio-Firma)v1 = HMAC-SHA256(secreto, t + "." + cuerpo crudo)
GET /api/cobro/<id> para releerGET /api/v1/cobros/<id>La verdad es la consulta

Qué secreto firma: si el webhook es el del fraccionamiento, firma con el secreto de ese fraccionamiento (compuerta 1 del ADR tal cual). Si PRIVORA usa un solo webhook de plataforma, los eventos de todos los hijos llegan firmados con el secreto de la plataforma y el campo comercio del evento dice de qué fraccionamiento es.

3. Las cinco compuertas de PRIVORA, con Titanio

  1. Firma válida y t dentro de ±300 s: Titanio firma cada envío en el momento del intento (los reintentos llevan t nuevo).
  2. Evento no visto: X-Titanio-Evento es único por evento y se repite idéntico en los reintentos.
  3. Relectura: GET /api/v1/cobros/<id> con Titanio-Comercio.
  4. Cuadre: el cobro trae comercio, referencia_externa, monto_centavos, moneda y pago.monto_centavos (lo efectivamente pagado; puede ser mayor si hubo excedente, en cuyo caso pago.excedente_centavos).
  5. Transacción local en PRIVORA.

4. Cuotas recurrentes

Dos caminos, a elegir:

5. Conciliación

PRIVORA (o tesorería del fraccionamiento) sube el estado de cuenta del fraccionamiento en CSV a POST /api/v1/conciliacion/spei. Cada abono casado dispara cobro.pagado; lo que no cuadra dispara conciliacion.excepcion y queda en GET /api/v1/conciliacion/excepciones para la tabla payment_reconciliations.

6. Pruebas sin dinero

CEOO puede encender el sandbox (metodo: "sandbox"): el cobro queda pendiente y se paga con una notificación firmada al endpoint del proveedor sandbox. Sirve para probar todo el ciclo de PRIVORA (webhook, relectura, cuadre) sin mover un peso.

7. Modo real (23-oct-2026)

Ricardo Estrada liberó el esquema (cargo directo a la cuenta del fraccionamiento, comisión facturada aparte por CEOO) el 23-oct-2026. Ver docs/RIESGOS_REGULATORIOS.md.