Diagramme de Séquence
Génération QR Code
La solution de cashback nouvelle génération
PRÉSENTATION GÉNÉRALE
1.1 Objectif du Document
Ce document décrit le diagramme de séquence pour la fonctionnalité de génération de QR code dans l'application mobile REWAPP. Cette fonctionnalité permet aux utilisateurs de convertir leurs points en un QR code scannable par un commerçant partenaire pour obtenir une réduction immédiate sur leurs achats.
1.2 Contexte Fonctionnel
La génération de QR code est au cœur du système de cashback commerçant REWAPP. Elle permet aux utilisateurs de :
- Convertir leurs points accumulés en valeur dépensable
- Bénéficier d'un ratio avantageux (+5% vs cashback bancaire)
- Utiliser leurs points instantanément chez un partenaire
1.3 Règles Fondamentales
ACTEURS ET COMPOSANTS
2.1 Acteurs Principaux
Acteurs du Flux
| Acteur | Description | Responsabilité |
|---|---|---|
| Client | Utilisateur de l'application mobile | Initie la génération du QR code, sélectionne le montant |
| Application Mobile | Interface Angular + Ionic | Affiche l'interface, gère le compteur, affiche le QR code |
2.2 Composants Backend
Architecture Technique
| Composant | Technologie | Responsabilité |
|---|---|---|
API Gateway |
Kong / AWS API Gateway | Authentification, rate limiting, routage |
Service QR Codes |
NestJS Microservice | Génération, validation, gestion du cycle de vie |
Service Points |
NestJS Microservice | Vérification solde, blocage/déblocage des points |
Cache Redis |
Redis 7+ | Stockage temporaire du QR code, gestion expiration |
Base de Données |
PostgreSQL 15+ | Persistance des transactions QR code |
DIAGRAMME DE SÉQUENCE PLANTUML
3.1 Diagramme Complet
FLUX NOMINAL DÉTAILLÉ
4.1 Phase 1 : Consultation du Solde
| Étape | Action | Détail |
|---|---|---|
1.1 | Ouverture de l'écran | L'utilisateur accède à l'écran "Utiliser mes points" depuis le menu principal |
1.2 | Requête API | L'application envoie GET /api/v1/points/balance avec le token JWT |
1.3 | Vérification solde | Le Service Points interroge la base de données pour récupérer le solde disponible |
1.4 | Affichage | L'application affiche le solde en points ET sa valeur en euros (×0,105) |
4.2 Phase 2 : Saisie du Montant
| Étape | Action | Détail |
|---|---|---|
2.1 | Sélection montant | L'utilisateur saisit le nombre de points à utiliser (slider ou champ numérique) |
2.2 | Validation locale | Vérification côté client : montant ≥ 10 pts ET montant ≤ solde disponible |
2.3 | Aperçu conversion | Affichage en temps réel : "X points = Y,YY€" (formule : points × 0,105) |
2.4 | Confirmation | L'utilisateur clique sur le bouton "Générer QR Code" |
4.3 Phase 3 : Génération du QR Code
| Étape | Action | Détail |
|---|---|---|
3.1 | Requête génération | POST /api/v1/qrcode/generate avec { points: montant } |
3.2 | Blocage des points | Les points sont immédiatement verrouillés (indisponibles pour autre usage) |
3.3 | Création identifiant | Génération d'un UUID v4 unique pour ce QR code |
3.4 | Construction payload | Assemblage des données : userId, points, valeur, timestamps |
3.5 | Signature HMAC | Application de la signature HMAC-SHA256 avec clé secrète serveur |
3.6 | Stockage cache | Enregistrement dans Redis avec TTL de 70 secondes |
3.7 | Persistance | Enregistrement en base PostgreSQL pour historique et audit |
3.8 | Retour client | QR code encodé en base64 + métadonnées |
4.4 Phase 4 : Affichage et Compteur
| Étape | Action | Détail |
|---|---|---|
4.1 | Affichage QR | QR code affiché en grand format (plein écran recommandé) |
4.2 | Démarrage compteur | Compteur à rebours initialisé à 60 secondes |
4.3 | Code couleur | Vert (60-31s) → Orange (30-11s) → Rouge (10-0s) |
4.4 | Feedback haptique | Vibration légère quand le compteur passe sous 10 secondes |
4.5 | Fin de compteur | À 0s, QR code marqué comme expiré |
SCÉNARIOS ALTERNATIFS
5.1 Scénario A : Solde Insuffisant
Pré-condition
L'utilisateur a moins de 10 points disponibles
| Étape | Action | Résultat |
|---|---|---|
| A.1 | Ouverture écran | Le solde affiché est < 10 points |
| A.2 | Interface adaptée | Le bouton "Générer QR Code" est désactivé (grisé) |
| A.3 | Message informatif | "Solde insuffisant. Minimum requis : 10 points (1,05€)" |
| A.4 | Suggestion | Lien vers la liste des partenaires pour gagner plus de points |
5.2 Scénario B : Régénération Immédiate
Pré-condition
L'utilisateur souhaite générer un nouveau QR code alors qu'un est actif
| Étape | Action | Résultat |
|---|---|---|
| B.1 | Demande régénération | L'utilisateur clique sur "Nouveau QR Code" |
| B.2 | Confirmation requise | Popup : "Un QR code est actif. Le remplacer annulera l'actuel." |
| B.3a | Confirmation | Ancien QR invalidé, points débloqués, nouveau QR généré |
| B.3b | Annulation | Retour à l'écran avec le QR code actif |
5.3 Scénario C : Perte de Connexion
Pré-condition
La connexion internet est perdue après la génération du QR code
| Étape | Action | Résultat |
|---|---|---|
| C.1 | QR généré | Le QR code est affiché localement |
| C.2 | Perte connexion | Le compteur continue de fonctionner (données locales) |
| C.3 | Scan possible | Le commerçant peut scanner (le QR contient toutes les infos signées) |
| C.4 | Reconnexion | Synchronisation automatique de l'état à la reconnexion |
| C.5 | Expiration | Si expiré hors-ligne, le déblocage se fait à la reconnexion |
5.4 Scénario D : Application en Arrière-plan
| Étape | Action | Résultat |
|---|---|---|
| D.1 | Mise en arrière-plan | Le compteur continue en background |
| D.2 | Notification locale | Notification : "Votre QR code expire dans 30 secondes" |
| D.3 | Retour app | Réouverture affiche le temps restant réel |
| D.4 | Expiration background | Si expiré, message affiché au retour + points restaurés |
GESTION DES ERREURS ET EXCEPTIONS
6.1 Erreurs Côté Client
Erreurs Client
| Code | Erreur | Message Utilisateur | Action Technique |
|---|---|---|---|
E001 | Montant invalide | "Le montant doit être entre 10 et votre solde" | Validation front bloquante |
E002 | Timeout requête | "Connexion lente. Veuillez réessayer." | Retry automatique (max 3 fois) |
E003 | QR non généré | "Impossible de générer le QR code. Réessayez." | Log erreur + écran fallback |
6.2 Erreurs Côté Serveur
Erreurs Serveur
| Code HTTP | Code Interne | Description | Traitement |
|---|---|---|---|
| 400 | QR_INVALID_AMOUNT | Montant < 10 ou > solde | Retour message validation |
| 401 | AUTH_EXPIRED | Token JWT expiré | Redirection login |
| 409 | QR_ALREADY_ACTIVE | Un QR code est déjà actif | Proposition d'annuler l'actif |
| 422 | POINTS_LOCK_FAILED | Échec blocage points | Retry interne + alerte |
| 429 | RATE_LIMITED | Trop de demandes | Message "Attendez quelques secondes" |
| 500 | INTERNAL_ERROR | Erreur serveur | Log Sentry + message générique |
| 503 | SERVICE_UNAVAILABLE | Service indisponible | Mode dégradé + retry |
6.3 Exceptions Métier
Exceptions
| Exception | Contexte | Comportement |
|---|---|---|
| Points expirés pendant génération | Des points sélectionnés expirent pendant le processus | Recalcul automatique du montant disponible |
| Compte suspendu | Utilisateur marqué comme suspect | Blocage avec message "Contactez le support" |
| QR code compromis | Détection de pattern frauduleux | Invalidation immédiate + alerte admin |
RÈGLES MÉTIER ASSOCIÉES
7.1 Ratio de Conversion
🛍️ RÈGLE FONDAMENTALE
10 points = 1,05€ chez les commerçants
Formule : Valeur en € = Nombre de points × 0,105
Exemples de Conversion
| Points | Valeur Commerçant | Calcul |
|---|---|---|
| 10 | 1,05€ | 10 × 0,105 |
| 50 | 5,25€ | 50 × 0,105 |
| 100 | 10,50€ | 100 × 0,105 |
| 200 | 21,00€ | 200 × 0,105 |
| 500 | 52,50€ | 500 × 0,105 |
| 1000 | 105,00€ | 1000 × 0,105 |
7.2 Validité du QR Code
⏱️ VALIDITÉ STRICTE : 60 SECONDES
• Début : Timestamp de génération côté serveur
• Fin : Timestamp + 60 secondes exactement
• Tolérance : Aucune (expiration stricte)
• Marge technique : QR stocké 70s en cache (10s buffer pour latence)
7.3 Usage Unique
🔒 RÈGLE : UN QR CODE = UN USAGE UNIQUE
• Premier scan valide = QR code consommé définitivement
• Toute tentative de réutilisation = rejet immédiat
• Aucune possibilité de "réactiver" un QR code scanné
7.4 Blocage des Points (FIFO)
📊 Les points les plus anciens sont bloqués en priorité
Système FIFO (First In, First Out) pour la gestion des points
Exemple de Blocage FIFO
| Lot | Points | Expiration | Blocage 200 pts |
|---|---|---|---|
| Lot 1 (ancien) | 150 | 10/01/2026 | 150 bloqués |
| Lot 2 | 300 | 15/02/2026 | 50 bloqués |
| Lot 3 (récent) | 400 | 20/03/2026 | 0 bloqué |
| TOTAL | 850 | - | 200 bloqués |
CONSIDÉRATIONS DE SÉCURITÉ
8.1 Signature HMAC-SHA256
Le QR code contient une signature cryptographique garantissant son authenticité :
{
"data": {
"qrId": "qr_abc123def456",
"userId": "usr_789xyz",
"points": 200,
"valueEur": 21.00,
"createdAt": 1732456800,
"expiresAt": 1732456860
},
"signature": "a3b8c9d4e5f6..."
}
signature = HMAC-SHA256(JSON.stringify(data), SERVER_SECRET_KEY)
8.2 Protections Anti-Fraude
Mesures de Sécurité
| Mesure | Description | Implémentation |
|---|---|---|
| Rate Limiting | Max 5 QR codes par heure par utilisateur | Redis + middleware API Gateway |
| Détection anomalies | Alertes sur patterns suspects | Monitoring ML (montants, fréquence) |
| Blacklist | Blocage de codes compromis | Table PostgreSQL + check temps réel |
| Audit trail | Logs de toutes les opérations | CloudWatch + Elasticsearch |
| IP Tracking | Suivi des IP de génération | Corrélation géographique |
8.3 Protection du Secret
- Clé HMAC stockée dans Variables d'environnement CapRover
- Rotation automatique tous les 90 jours
- Accès restreint aux services autorisés uniquement
- Logs d'accès audités
SPÉCIFICATIONS TECHNIQUES
9.1 Endpoint API
/api/v1/qrcode/generate
Génère un QR code pour convertir des points en valeur dépensable.
Headers requis
Authorization: Bearer {jwt_token}
Content-Type: application/json
X-Device-Id: {device_uuid}
X-App-Version: {version}
Request Body
{
"points": 200,
"merchantId": "optional_merchant_uuid"
}
Response201 Created
{
"success": true,
"data": {
"qrId": "qr_abc123def456",
"qrCode": "data:image/png;base64,iVBORw0...",
"points": 200,
"valueEur": 21.00,
"createdAt": "2025-11-24T10:00:00Z",
"expiresAt": "2025-11-24T10:01:00Z",
"ttlSeconds": 60
}
}
9.2 Structure de Données Redis
Clé : qr:{qrId}
TTL : 70 secondes
Valeur :
{
"qrId": "qr_abc123",
"userId": "usr_456",
"points": 200,
"valueEur": 21.00,
"lockId": "lock_xyz123",
"status": "ACTIVE",
"createdAt": 1732456800,
"expiresAt": 1732456860,
"signature": "..."
}
9.3 Table PostgreSQL
qr_codes
Table de persistance des QR codes générés| Colonne | Type | Contrainte | Description |
|---|---|---|---|
| id | UUID |
PK |
Identifiant unique du QR code |
| user_id | UUID |
FK |
Référence utilisateur |
| points | INTEGER |
NOT NULL |
Nombre de points |
| value_eur | DECIMAL(10,2) |
NOT NULL |
Valeur en euros |
| status | ENUM |
NOT NULL |
ACTIVE, USED, EXPIRED, CANCELLED |
| lock_id | UUID |
NULLABLE |
Référence au blocage de points |
| scanned_by | UUID |
NULLABLE |
ID commerçant si scanné |
| scanned_at | TIMESTAMP |
NULLABLE |
Horodatage du scan |
| created_at | TIMESTAMP |
NOT NULL |
Date de création |
| expires_at | TIMESTAMP |
NOT NULL |
Date d'expiration |
Index PostgreSQL
idx_qrcode_user_id (user_id)
idx_qrcode_status (status)
idx_qrcode_expires_at (expires_at)
RÉCAPITULATIF
10.1 Points Clés du Flux
- Consultation du solde disponible en temps réel
- Validation du montant (min 10 points, max solde)
- Blocage immédiat des points à la génération
- Signature cryptographique HMAC-SHA256
- Validité stricte de 60 secondes
- Compteur visuel avec code couleur progressif
- Expiration automatique et déblocage des points
- Usage unique garanti côté serveur
10.2 Métriques de Performance
10.3 Checklist Implémentation
- Endpoint POST /api/v1/qrcode/generate implémenté
- Service de blocage/déblocage des points fonctionnel
- Signature HMAC-SHA256 avec clé sécurisée
- Stockage Redis avec TTL configuré
- Persistance PostgreSQL avec index optimisés
- Compteur visuel côté mobile avec animations
- Gestion expiration automatique (client + serveur)
- Rate limiting configuré (5/heure)
- Monitoring et alerting activés
- Tests unitaires et d'intégration validés