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.
| Clave | Ejemplo | Notas |
|---|---|---|
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
- Al iniciar sesión (y cada vez que el token rote) la app llama
POST /push/tokens. - Al recibir un aviso,
POST /push/eventsconevent: "received"; al tocarlo,event: "opened". - Al cerrar sesión,
DELETE /push/tokenscon eldevice_id(el servidor también revoca el token de la sesión que lo registró al hacerPOST /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).