v1.0 Novembre 2025
5.2.3

Détection Transaction et Crédit Points

Diagramme de séquence du cœur fonctionnel de REWAPP

24 novembre 2025
Version 1.0
1

VUE D'ENSEMBLE

1.1 Objectif du Document

Ce document décrit le diagramme de séquence pour la détection automatique des transactions bancaires et le crédit des points de cashback sur le compte utilisateur REWAPP.

PROPOSITION DE VALEUR

Ce processus constitue le cœur fonctionnel de l'application et représente la proposition de valeur principale : le cashback automatique sans action requise de l'utilisateur.

1.2 Contexte Fonctionnel

Lorsqu'un utilisateur REWAPP effectue un achat chez un commerçant partenaire avec sa carte bancaire liée, le système détecte automatiquement la transaction via l'intégration OpenBanking (Budget Insight, Tink ou Plaid). Les points de cashback sont ensuite calculés et crédités sur le compte de l'utilisateur.

1.3 Prérequis

  • Utilisateur inscrit et compte actif sur REWAPP
  • Au moins une carte bancaire liée via OpenBanking
  • Webhooks bancaires configurés et fonctionnels
  • Commerçant inscrit et validé comme partenaire REWAPP
2

ACTEURS DU DIAGRAMME

2.1 Liste des Acteurs

Acteurs du Système

Acteur Type Description
Utilisateur Externe Client final possédant l'application mobile REWAPP
Terminal de Paiement Externe TPE du commerçant partenaire
Banque Utilisateur Externe Établissement bancaire du client
Fournisseur OpenBanking Externe Budget Insight / Tink / Plaid - Agrégateur bancaire
Webhook Handler Interne Service de réception et validation des webhooks
API Gateway Interne Point d'entrée centralisé (Kong)
Transaction Service Interne Microservice de gestion des transactions
Merchant Service Interne Microservice de gestion des partenaires
Points Service Interne Microservice de gestion des points et fidélité
Notification Service Interne Microservice d'envoi des notifications
PostgreSQL Interne Stockage persistant
Redis Interne Cache distribué et queues de jobs

2.2 Responsabilités des Acteurs

2.2.1 Fournisseur OpenBanking

  • Agrège les comptes bancaires via API PSD2
  • Détecte les nouvelles transactions en temps réel
  • Envoie des webhooks à REWAPP pour chaque transaction
  • Fournit les détails : montant, date, nom commerçant, MCC code

2.2.2 Webhook Handler

  • Réceptionne les webhooks du fournisseur bancaire
  • Vérifie la signature HMAC-SHA256 du webhook
  • Valide le format et l'intégrité des données
  • Route vers le Transaction Service via Bull Queue

2.2.3 Transaction Service

  • Traite les transactions bancaires reçues
  • Identifie si le commerçant est un partenaire REWAPP
  • Calcule le montant de cashback selon le taux partenaire
  • Coordonne le crédit des points avec le Points Service

2.2.4 Points Service

  • Gère le solde de points de chaque utilisateur
  • Crédite les points selon la méthode FIFO
  • Calcule les bonus de palier de fidélité
  • Gère l'expiration des points (12 mois)
3

DIAGRAMME DE SÉQUENCE - FLUX NOMINAL

3.1 Notation PlantUML

Diagramme de Séquence - Détection Transaction et Crédit Points
@startuml
skinparam backgroundColor #FFFFFF
skinparam sequenceArrowThickness 2
skinparam roundcorner 10

title Detection Transaction et Credit Points REWAPP

actor "Utilisateur" as User #LightBlue
participant "Terminal Paiement" as TPE #Orange
participant "Banque" as Bank #Yellow
participant "OpenBanking" as OB #Cyan
participant "Webhook Handler" as WH #Pink
participant "Transaction Service" as TS #LightGreen
participant "Merchant Service" as MS #Gold
participant "Points Service" as PS #Plum
participant "Notification" as NS #Coral
database "PostgreSQL" as DB #LightGray
database "Redis" as Redis #Salmon

== Phase 1 Achat Partenaire ==
User -> TPE : Paiement carte 100EUR
TPE -> Bank : Autorisation paiement
Bank --> TPE : Paiement autorise
TPE --> User : Ticket de caisse

== Phase 2 Notification OpenBanking ==
Bank -> OB : Transaction effectuee
OB -> WH : Webhook transaction.created

== Phase 3 Validation Webhook ==
WH -> WH : Verifier signature HMAC
WH -> WH : Verifier timestamp
WH --> OB : HTTP 200 OK
WH -> Redis : Publier job transaction.received

== Phase 4 Traitement Transaction ==
Redis -> TS : Consumer recupere job
TS -> DB : Verifier idempotence

alt #LightYellow Nouvelle transaction
  TS -> DB : Recuperer infos utilisateur
  TS -> MS : GET merchants/match
  
  alt #LightGreen Partenaire trouve
    MS --> TS : merchant_id cashback 4%
    TS -> PS : GET points/user/tier
    PS --> TS : tier GOLD bonus 10%
    TS -> TS : Calcul 44 points
    TS -> DB : INSERT transaction
    TS -> Redis : Publier points.credit
    
    == Phase 5 Credit Points ==
    Redis -> PS : Consumer recupere job
    PS -> DB : BEGIN TRANSACTION
    PS -> DB : INSERT points_ledger 44 pts
    PS -> DB : UPDATE user balance
    PS -> DB : COMMIT
    PS -> Redis : Publier notification.send
    
    == Phase 6 Notification ==
    Redis -> NS : Consumer recupere job
    NS -> User : Push 44 points gagnes
    NS -> DB : INSERT notification
    
  else #Pink Non partenaire
    MS --> TS : matched false
    TS -> DB : INSERT no_cashback
  end
end
@enduml

Le diagramme ci-dessus illustre le flux complet de détection d'une transaction et crédit des points, décomposé en 6 phases distinctes.

4

FLUX NOMINAL DÉTAILLÉ

4.1 Phase 1 : Achat chez le Partenaire

IMPORTANT

L'utilisateur n'a aucune action à effectuer dans l'application REWAPP. La détection est 100% automatique.

Étapes Phase 1

ÉtapeActeurActionRésultat
1.1UtilisateurPrésente sa carte bancaire liée à REWAPPCarte acceptée par le TPE
1.2Terminal de PaiementEnvoie demande d'autorisationRequête vers la banque émettrice
1.3Banque UtilisateurVérifie le solde et autoriseAutorisation accordée
1.4Terminal de PaiementConfirme le paiementTicket de caisse imprimé

4.2 Phase 2 : Notification OpenBanking

Étapes Phase 2

ÉtapeActeurActionRésultat
2.1Banque UtilisateurTransmet transaction à l'agrégateurDonnées transmises via API PSD2
2.2Fournisseur OpenBankingDétecte la nouvelle transactionTransaction identifiée
2.3Fournisseur OpenBankingEnvoie webhook à REWAPPWebhook transaction.created

4.2.1 Payload du Webhook (Exemple)

JSON
{
  "event": "transaction.created",
  "timestamp": "2025-11-24T14:30:00.000Z",
  "data": {
    "transaction_id": "txn_abc123xyz",
    "account_id": "acc_user456",
    "amount": 100.00,
    "currency": "EUR",
    "merchant": {
      "name": "RESTAURANT LE BISTROT",
      "mcc_code": "5812",
      "city": "PARIS"
    },
    "date": "2025-11-24",
    "type": "DEBIT"
  },
  "signature": "sha256=7d38cdd689735b008..."
}

4.3 Phase 3 : Validation du Webhook

Étapes Phase 3

ÉtapeActeurActionDurée Max
3.1Webhook HandlerVérifie signature HMAC-SHA256< 10ms
3.2Webhook HandlerVérifie timestamp (replay attack)< 5ms
3.3Webhook HandlerValide schéma JSON du payload< 10ms
3.4Webhook HandlerRetourne HTTP 200 au fournisseur< 100ms
3.5Webhook HandlerPublie job dans Bull Queue< 20ms

4.3.1 Validation de la Signature

La signature est vérifiée selon l'algorithme suivant :

JavaScript
expected_signature = HMAC-SHA256(webhook_secret, timestamp + "." + payload_body)
if (expected_signature !== received_signature) {
  return HTTP 401 Unauthorized
}

4.4 Phase 4 : Traitement de la Transaction

Étapes Phase 4

ÉtapeActeurActionRésultat
4.1Transaction ServiceRécupère le job depuis Bull QueueTransaction à traiter
4.2Transaction ServiceVérifie idempotence (transaction_id)Évite les doublons
4.3Transaction ServiceRécupère les infos utilisateuruser_id, card_id
4.4Merchant ServiceMatching du commerçantIdentification partenaire
4.5Points ServiceRécupère le palier de fidélitéBonus applicable
4.6Transaction ServiceCalcule le cashbackPoints à créditer
4.7Transaction ServiceEnregistre la transactionHistorique complet

4.4.1 Algorithme de Matching Commerçant

Le Merchant Service utilise une stratégie de matching en 3 étapes :

  1. 1
    Matching par MCC Code

    Le code MCC (Merchant Category Code) est comparé aux catégories des partenaires enregistrés.

  2. 2
    Matching par Nom (Fuzzy)

    Si le MCC ne suffit pas, un algorithme de similarité (Levenshtein, Soundex) compare le nom du commerçant avec les noms des partenaires.

  3. 3
    Matching par Identifiant Bancaire

    Certains partenaires fournissent leur identifiant bancaire exact pour un matching précis.

4.4.2 Formule de Calcul du Cashback

RÈGLE FONDAMENTALE

Points = (Montant_TTC × Taux_Partenaire × (1 + Bonus_Palier)) / 0.10

Exemple de Calcul Détaillé

ParamètreValeurSource
Montant de l'achat100,00 €Webhook bancaire
Taux cashback partenaire4%Configuration Merchant Service
Palier utilisateurGoldPoints Service
Bonus Gold+10%Règle métier paliers
CALCUL

• Cashback brut = 100 × 0.04 = 4,00 €
• Bonus Gold = 4,00 × 0.10 = 0,40 €
• Cashback total = 4,00 + 0,40 = 4,40 €
• Points crédités = 4,40 / 0,10 = 44 points

4.5 Phase 5 : Crédit des Points

Étapes Phase 5

ÉtapeActeurActionDurée
5.1Points ServiceOuvre transaction PostgreSQL< 5ms
5.2Points ServiceInsère ligne dans points_ledger< 10ms
5.3Points ServiceMet à jour solde utilisateur< 10ms
5.4Points ServiceCommit transaction< 5ms
5.5Points ServicePublie événement notification< 10ms

4.5.1 Structure de l'Enregistrement Points

Structure points_ledger

ChampValeurDescription
iduuid_v4()Identifiant unique du lot de points
user_iduser_abc123Référence utilisateur
amount44Nombre de points crédités
typeCREDITType de mouvement
sourceTRANSACTIONOrigine des points
reference_idtxn_abc123xyzTransaction liée
expires_at2026-11-24Date d'expiration (J+365)
created_at2025-11-24 14:30:05Horodatage du crédit

4.6 Phase 6 : Notification Utilisateur

Étapes Phase 6

ÉtapeActeurActionCanal
6.1Notification ServiceRécupère les préférences utilisateurBase de données
6.2Notification ServiceEnvoie notification pushFirebase Cloud Messaging
6.3Notification ServiceEnregistre notification in-appCentre de notifications

4.6.1 Contenu de la Notification Push

JSON
{
  "title": "🎉 Points crédités !",
  "body": "Vous avez gagné 44 points chez Restaurant Le Bistrot. Solde : 544 points",
  "data": {
    "type": "points_credited",
    "transaction_id": "txn_abc123xyz",
    "amount": 44,
    "merchant_name": "Restaurant Le Bistrot"
  }
}
5

FLUX ALTERNATIFS ET CAS D'ERREUR

5.1 Cas Alternatif 1 : Commerçant Non Partenaire

ConditionComportementRésultat
Commerçant non identifié comme partenaireTransaction enregistrée avec status "no_cashback"Aucun point crédité, pas de notification

5.2 Cas Alternatif 2 : Transaction Déjà Traitée (Idempotence)

ConditionComportementRésultat
transaction_id existe déjà en baseWebhook ignoréPas de doublon de points

L'idempotence est garantie par une contrainte UNIQUE sur le champ external_transaction_id.

5.3 Cas d'Erreur 1 : Signature Webhook Invalide

CodeMessageAction
HTTP 401WEBHOOK_SIGNATURE_INVALIDRejet du webhook, log de sécurité
SÉCURITÉ

Toute tentative avec signature invalide est loguée avec l'IP source et remontée aux alertes de sécurité.

5.4 Cas d'Erreur 2 : Timestamp Expiré (Replay Attack)

CodeMessageAction
HTTP 401WEBHOOK_TIMESTAMP_EXPIREDRejet du webhook (timestamp > 5 minutes)

Protection contre les attaques par rejeu : les webhooks de plus de 5 minutes sont systématiquement rejetés.

5.5 Cas d'Erreur 3 : Utilisateur Suspendu

ConditionComportementRésultat
Compte utilisateur suspenduTransaction enregistrée, points mis en attentePoints crédités à la levée de suspension

5.6 Cas d'Erreur 4 : Carte Bancaire Révoquée

ConditionComportementRésultat
Carte non trouvée ou révoquéeTransaction ignoréeLog d'anomalie pour investigation

5.7 Cas d'Erreur 5 : Échec du Service Points

ConditionComportementRésultat
Points Service indisponibleJob retourné dans la queue avec retry3 tentatives espacées (1s, 2s, 4s)

Après 3 échecs, le job est placé dans la Dead Letter Queue pour traitement manuel.

5.8 Cas d'Erreur 6 : Transaction de Remboursement

ConditionComportementRésultat
Montant négatif (remboursement)Débit des points précédemment créditésNotification "Points débités suite à remboursement"

Si le solde est insuffisant, le compte passe en négatif temporairement jusqu'à régularisation.

5.9 Tableau Récapitulatif des Codes d'Erreur

Codes d'Erreur

Code ErreurHTTPDescriptionRetry
WEBHOOK_SIGNATURE_INVALID401Signature HMAC invalideNon
WEBHOOK_TIMESTAMP_EXPIRED401Timestamp trop ancien (>5min)Non
WEBHOOK_PAYLOAD_INVALID400Format JSON invalideNon
TRANSACTION_DUPLICATE200Transaction déjà traitéeNon (ignorée)
USER_NOT_FOUND404Utilisateur introuvableNon
CARD_NOT_LINKED404Carte bancaire non liéeNon
MERCHANT_NOT_PARTNER200Commerçant non partenaireNon
POINTS_SERVICE_UNAVAILABLE503Service Points indisponibleOui (3x)
DATABASE_ERROR500Erreur base de donnéesOui (3x)
6

RÈGLES MÉTIER APPLIQUÉES

6.1 Règles de Calcul des Points

Règles de Calcul

RègleValeurRéférence
Ratio de base1 point = 0,10 €Document 1.4 Section 2.1.1
ArrondiÀ l'unité inférieure (floor)Document 1.4 Section 6.1
Validité des points12 mois à partir du créditDocument 1.4 Section 2.2
Méthode de débitFIFO (First In, First Out)Document 1.4 Section 2.2.2

6.2 Règles des Paliers de Fidélité

Paliers de Fidélité

PalierBonusSeuil (Paramétrable)
Bronze+0%Par défaut
Silver+5%Défini par le partenaire
Gold+10%Défini par le partenaire
Platine+15%Défini par le partenaire
Diamant+20%Défini par le partenaire
IMPORTANT

Le palier est calculé PAR PARTENAIRE sur les 12 derniers mois glissants. Un utilisateur peut avoir des paliers différents chez différents partenaires.

6.3 Règles du Taux de Cashback

Taux de Cashback

RègleValeurDescription
Taux unique par partenaireOuiPas de différenciation par produit
Commission totale6%4% client + 2% REWAPP
Modification du tauxEffet immédiatApplicable aux nouvelles transactions
7

SÉCURITÉ ET CONFORMITÉ

7.1 Sécurité du Webhook

Mesures de Sécurité

MesureDescriptionImplémentation
Signature HMACVérifie l'authenticité du webhookHMAC-SHA256 avec secret partagé
Timestamp validationPrévient les replay attacksFenêtre de 5 minutes maximum
HTTPS obligatoireChiffrement en transitTLS 1.3 minimum
IP WhitelistingFiltrage par IP sourceListe IPs du fournisseur bancaire
Rate limitingLimite le nombre de webhooks1000 requêtes/minute par fournisseur

7.2 Conformité PSD2

Exigences PSD2

ExigenceImplémentation
Consentement expliciteAutorisation OAuth2 lors du card linking
Accès limitéLecture seule des transactions
Révocation possibleDéliaison de carte à tout moment
TraçabilitéLogs complets de tous les accès

7.3 Conformité RGPD

Exigences RGPD

ExigenceImplémentation
Minimisation des donnéesSeules les données nécessaires sont conservées
Droit d'accèsExport possible via l'application
Droit à l'effacementSuppression complète sur demande
PortabilitéExport JSON/CSV des transactions

7.4 Audit Trail

Chaque étape du processus génère une entrée d'audit contenant :

  • Timestamp précis (millisecondes)
  • Identifiant de corrélation (traceId)
  • Acteur (service ou utilisateur)
  • Action effectuée
  • Données avant/après modification
  • Résultat (succès/échec)
8

RÉFÉRENCES DOCUMENTAIRES

8.1 Documents de Référence

Documents Connexes

DocumentSectionContenu Associé
1.4 Règles Métier de FidélitéSection 2Système de points, calculs, validité
4.3 Architecture Backend APISection 2.3Transaction Service, webhooks
5.2.2 Liaison Carte Bancaire-Prérequis : carte liée
5.3 Flux Bancaire-Architecture intégration bancaire
6.1 Document de Sécurité-Mesures de sécurité globales
7.3 Intégration Solution Bancaire-Configuration OpenBanking

8.2 Endpoints API Concernés

Endpoints API

MéthodeEndpointService
POST/api/v1/webhooks/bankingWebhook Handler
GET/internal/merchants/matchMerchant Service
GET/internal/points/user/:id/tier/:merchant_idPoints Service
POST/internal/points/creditPoints Service
POST/internal/notifications/sendNotification Service

8.3 Queues Bull Impliquées

Queues

QueueÉvénementPriorité
transactionstransaction.receivedHigh
pointspoints.creditHigh
notificationsnotification.sendMedium
9

MÉTRIQUES ET MONITORING

9.1 KPIs à Surveiller

Métriques Clés

MétriqueSeuil AlerteDescription
Webhooks reçus/minute< 10 pendant 5 minPossible problème fournisseur
Taux de matching< 80%Revoir algorithme ou base partenaires
Délai traitement moyen> 30 secondesPerformance dégradée
Taux d'erreur> 1%Problème technique à investiguer
Points crédités/heureVariation > 50%Anomalie à vérifier

9.2 Alertes Configurées

  • Slack #alerts-critical : Échec de validation webhook
  • Slack #alerts-business : Taux de matching < 70%
  • PagerDuty : Service indisponible > 2 minutes
  • Email équipe : Rapport quotidien des anomalies