Détection Transaction et Crédit Points
Diagramme de séquence du cœur fonctionnel de REWAPP
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
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)
DIAGRAMME DE SÉQUENCE - FLUX NOMINAL
3.1 Notation PlantUML
@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.
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
| Étape | Acteur | Action | Résultat |
|---|---|---|---|
| 1.1 | Utilisateur | Présente sa carte bancaire liée à REWAPP | Carte acceptée par le TPE |
| 1.2 | Terminal de Paiement | Envoie demande d'autorisation | Requête vers la banque émettrice |
| 1.3 | Banque Utilisateur | Vérifie le solde et autorise | Autorisation accordée |
| 1.4 | Terminal de Paiement | Confirme le paiement | Ticket de caisse imprimé |
4.2 Phase 2 : Notification OpenBanking
Étapes Phase 2
| Étape | Acteur | Action | Résultat |
|---|---|---|---|
| 2.1 | Banque Utilisateur | Transmet transaction à l'agrégateur | Données transmises via API PSD2 |
| 2.2 | Fournisseur OpenBanking | Détecte la nouvelle transaction | Transaction identifiée |
| 2.3 | Fournisseur OpenBanking | Envoie webhook à REWAPP | Webhook transaction.created |
4.2.1 Payload du Webhook (Exemple)
{
"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
| Étape | Acteur | Action | Durée Max |
|---|---|---|---|
| 3.1 | Webhook Handler | Vérifie signature HMAC-SHA256 | < 10ms |
| 3.2 | Webhook Handler | Vérifie timestamp (replay attack) | < 5ms |
| 3.3 | Webhook Handler | Valide schéma JSON du payload | < 10ms |
| 3.4 | Webhook Handler | Retourne HTTP 200 au fournisseur | < 100ms |
| 3.5 | Webhook Handler | Publie job dans Bull Queue | < 20ms |
4.3.1 Validation de la Signature
La signature est vérifiée selon l'algorithme suivant :
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
| Étape | Acteur | Action | Résultat |
|---|---|---|---|
| 4.1 | Transaction Service | Récupère le job depuis Bull Queue | Transaction à traiter |
| 4.2 | Transaction Service | Vérifie idempotence (transaction_id) | Évite les doublons |
| 4.3 | Transaction Service | Récupère les infos utilisateur | user_id, card_id |
| 4.4 | Merchant Service | Matching du commerçant | Identification partenaire |
| 4.5 | Points Service | Récupère le palier de fidélité | Bonus applicable |
| 4.6 | Transaction Service | Calcule le cashback | Points à créditer |
| 4.7 | Transaction Service | Enregistre la transaction | Historique complet |
4.4.1 Algorithme de Matching Commerçant
Le Merchant Service utilise une stratégie de matching en 3 étapes :
-
1
Matching par MCC Code
Le code MCC (Merchant Category Code) est comparé aux catégories des partenaires enregistrés.
-
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
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ètre | Valeur | Source |
|---|---|---|
| Montant de l'achat | 100,00 € | Webhook bancaire |
| Taux cashback partenaire | 4% | Configuration Merchant Service |
| Palier utilisateur | Gold | Points 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
| Étape | Acteur | Action | Durée |
|---|---|---|---|
| 5.1 | Points Service | Ouvre transaction PostgreSQL | < 5ms |
| 5.2 | Points Service | Insère ligne dans points_ledger | < 10ms |
| 5.3 | Points Service | Met à jour solde utilisateur | < 10ms |
| 5.4 | Points Service | Commit transaction | < 5ms |
| 5.5 | Points Service | Publie événement notification | < 10ms |
4.5.1 Structure de l'Enregistrement Points
Structure points_ledger
| Champ | Valeur | Description |
|---|---|---|
id | uuid_v4() | Identifiant unique du lot de points |
user_id | user_abc123 | Référence utilisateur |
amount | 44 | Nombre de points crédités |
type | CREDIT | Type de mouvement |
source | TRANSACTION | Origine des points |
reference_id | txn_abc123xyz | Transaction liée |
expires_at | 2026-11-24 | Date d'expiration (J+365) |
created_at | 2025-11-24 14:30:05 | Horodatage du crédit |
4.6 Phase 6 : Notification Utilisateur
Étapes Phase 6
| Étape | Acteur | Action | Canal |
|---|---|---|---|
| 6.1 | Notification Service | Récupère les préférences utilisateur | Base de données |
| 6.2 | Notification Service | Envoie notification push | Firebase Cloud Messaging |
| 6.3 | Notification Service | Enregistre notification in-app | Centre de notifications |
4.6.1 Contenu de la Notification Push
{
"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"
}
}
FLUX ALTERNATIFS ET CAS D'ERREUR
5.1 Cas Alternatif 1 : Commerçant Non Partenaire
| Condition | Comportement | Résultat |
|---|---|---|
| Commerçant non identifié comme partenaire | Transaction enregistrée avec status "no_cashback" | Aucun point crédité, pas de notification |
5.2 Cas Alternatif 2 : Transaction Déjà Traitée (Idempotence)
| Condition | Comportement | Résultat |
|---|---|---|
| transaction_id existe déjà en base | Webhook 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
| Code | Message | Action |
|---|---|---|
| HTTP 401 | WEBHOOK_SIGNATURE_INVALID | Rejet 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)
| Code | Message | Action |
|---|---|---|
| HTTP 401 | WEBHOOK_TIMESTAMP_EXPIRED | Rejet 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
| Condition | Comportement | Résultat |
|---|---|---|
| Compte utilisateur suspendu | Transaction enregistrée, points mis en attente | Points crédités à la levée de suspension |
5.6 Cas d'Erreur 4 : Carte Bancaire Révoquée
| Condition | Comportement | Résultat |
|---|---|---|
| Carte non trouvée ou révoquée | Transaction ignorée | Log d'anomalie pour investigation |
5.7 Cas d'Erreur 5 : Échec du Service Points
| Condition | Comportement | Résultat |
|---|---|---|
| Points Service indisponible | Job retourné dans la queue avec retry | 3 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
| Condition | Comportement | Résultat |
|---|---|---|
| Montant négatif (remboursement) | Débit des points précédemment crédités | Notification "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 Erreur | HTTP | Description | Retry |
|---|---|---|---|
WEBHOOK_SIGNATURE_INVALID | 401 | Signature HMAC invalide | Non |
WEBHOOK_TIMESTAMP_EXPIRED | 401 | Timestamp trop ancien (>5min) | Non |
WEBHOOK_PAYLOAD_INVALID | 400 | Format JSON invalide | Non |
TRANSACTION_DUPLICATE | 200 | Transaction déjà traitée | Non (ignorée) |
USER_NOT_FOUND | 404 | Utilisateur introuvable | Non |
CARD_NOT_LINKED | 404 | Carte bancaire non liée | Non |
MERCHANT_NOT_PARTNER | 200 | Commerçant non partenaire | Non |
POINTS_SERVICE_UNAVAILABLE | 503 | Service Points indisponible | Oui (3x) |
DATABASE_ERROR | 500 | Erreur base de données | Oui (3x) |
RÈGLES MÉTIER APPLIQUÉES
6.1 Règles de Calcul des Points
Règles de Calcul
| Règle | Valeur | Référence |
|---|---|---|
| Ratio de base | 1 point = 0,10 € | Document 1.4 Section 2.1.1 |
| Arrondi | À l'unité inférieure (floor) | Document 1.4 Section 6.1 |
| Validité des points | 12 mois à partir du crédit | Document 1.4 Section 2.2 |
| Méthode de débit | FIFO (First In, First Out) | Document 1.4 Section 2.2.2 |
6.2 Règles des Paliers de Fidélité
Paliers de Fidélité
| Palier | Bonus | Seuil (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ègle | Valeur | Description |
|---|---|---|
| Taux unique par partenaire | Oui | Pas de différenciation par produit |
| Commission totale | 6% | 4% client + 2% REWAPP |
| Modification du taux | Effet immédiat | Applicable aux nouvelles transactions |
SÉCURITÉ ET CONFORMITÉ
7.1 Sécurité du Webhook
Mesures de Sécurité
| Mesure | Description | Implémentation |
|---|---|---|
| Signature HMAC | Vérifie l'authenticité du webhook | HMAC-SHA256 avec secret partagé |
| Timestamp validation | Prévient les replay attacks | Fenêtre de 5 minutes maximum |
| HTTPS obligatoire | Chiffrement en transit | TLS 1.3 minimum |
| IP Whitelisting | Filtrage par IP source | Liste IPs du fournisseur bancaire |
| Rate limiting | Limite le nombre de webhooks | 1000 requêtes/minute par fournisseur |
7.2 Conformité PSD2
Exigences PSD2
| Exigence | Implémentation |
|---|---|
| Consentement explicite | Autorisation OAuth2 lors du card linking |
| Accès limité | Lecture seule des transactions |
| Révocation possible | Déliaison de carte à tout moment |
| Traçabilité | Logs complets de tous les accès |
7.3 Conformité RGPD
Exigences RGPD
| Exigence | Implémentation |
|---|---|
| Minimisation des données | Seules les données nécessaires sont conservées |
| Droit d'accès | Export possible via l'application |
| Droit à l'effacement | Suppression 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)
RÉFÉRENCES DOCUMENTAIRES
8.1 Documents de Référence
Documents Connexes
| Document | Section | Contenu Associé |
|---|---|---|
| 1.4 Règles Métier de Fidélité | Section 2 | Système de points, calculs, validité |
| 4.3 Architecture Backend API | Section 2.3 | Transaction 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éthode | Endpoint | Service |
|---|---|---|
| POST | /api/v1/webhooks/banking | Webhook Handler |
| GET | /internal/merchants/match | Merchant Service |
| GET | /internal/points/user/:id/tier/:merchant_id | Points Service |
| POST | /internal/points/credit | Points Service |
| POST | /internal/notifications/send | Notification Service |
8.3 Queues Bull Impliquées
Queues
| Queue | Événement | Priorité |
|---|---|---|
transactions | transaction.received | High |
points | points.credit | High |
notifications | notification.send | Medium |
MÉTRIQUES ET MONITORING
9.1 KPIs à Surveiller
Métriques Clés
| Métrique | Seuil Alerte | Description |
|---|---|---|
| Webhooks reçus/minute | < 10 pendant 5 min | Possible problème fournisseur |
| Taux de matching | < 80% | Revoir algorithme ou base partenaires |
| Délai traitement moyen | > 30 secondes | Performance dégradée |
| Taux d'erreur | > 1% | Problème technique à investiguer |
| Points crédités/heure | Variation > 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