QvaPay API
Push

Notificaciones push

Cómo registra un dispositivo las notificaciones push de QvaPay, qué recibe y cómo reporta aperturas.

QvaPay envía las notificaciones push directamente a cada plataforma: FCM (Android), APNs (iOS) y Web Push (navegadores). Una app o un navegador recibe push cuando registra su token con la sesión del usuario (POST /push/tokens). Las preferencias viven en /user/notifications: push_enabled apaga todo, push_promos las campañas y push_p2p las alertas del mercado P2P. Lo transaccional (pagos recibidos, cambios en tus ofertas P2P, seguridad) solo se apaga con push_enabled.

Payload que recibe el dispositivo

Las claves viajan en el campo data (Android y navegador) o en la raíz del aviso junto a aps (iOS). Siempre son strings.

ClaveEjemploNotas
did"8412"id de la entrega, para POST /push/events
mid"771"id del mensaje, el que lista GET /push/inbox
cid"12"id de campaña; "" si es transaccional
type"p2p_completed"tipo del aviso (deep link). Es el mismo data.type que ya recibían las apps
deeplink"qvapay://p2p/82a0…?order=…"lo que abre la app al tocar
url"https://www.qvapay.com/p2p/82a0…"la misma ruta en la web (compatibilidad con builds anteriores)
image"https://…/promo.jpg"opcional

Las claves que cada aviso traía antes (p2p_uuid, order_uuid, transaction_uuid, day, …) se conservan.

Tipos (type)

transfer_received, transfer_sent, invite_sent, transaction_comment, p2p_applied, p2p_partial_applied, p2p_paid, p2p_partial_paid, p2p_completed, p2p_partial_completed, p2p_chat, p2p_partial_revision, p2p_partial_dispute_resolved, p2p_offer_closed_by_staff, p2p_offer_reopen_paused, p2p_promo_outbid, p2p_promo_won, p2p_promo_expired, p2p_promo_ending, gold_renewed, gold_expired, savings_debt, cart_stage, cart_message, miniapp_review, qvasuerte_prize, qvasuerte_referral, qvasuerte_reminder, broadcast, generic.

Sonidos y canales (Android / iOS)

Los avisos de dinero llevan canal qp_money_in / qp_money_out en Android (la app los crea al arrancar) y money_in.caf / money_out.caf en iOS. El resto usa el sonido por defecto. En iOS un aviso con imagen lleva mutable-content: 1; sin Notification Service Extension la imagen simplemente se ignora.

Ciclo de vida

  1. Al iniciar sesión (y cada vez que el token rote) la app llama POST /push/tokens.
  2. Al recibir un aviso, POST /push/events con event: "received"; al tocarlo, event: "opened".
  3. Al cerrar sesión, DELETE /push/tokens con el device_id (el servidor también revoca el token de la sesión que lo registró al hacer POST /auth/logout).

Un aviso que no se puede entregar caduca a las 72 h (24 h las campañas). Las campañas no se entregan de noche en la hora local del dispositivo (según su timezone).