v1.0 Novembre 2025
Document 7.3

Documentation Intégration Solution Bancaire

La solution de cashback nouvelle génération

24 novembre 2025
Version 1.0
1

INTRODUCTION ET VUE D'ENSEMBLE

1.1 Objectif du Document

Ce document fournit les spécifications techniques complètes pour l'intégration de la solution bancaire OpenBanking dans l'écosystème REWAPP.

Il détaille :

  • La configuration du partenaire bancaire (Budget Insight)
  • Les endpoints API et leur utilisation
  • La gestion des webhooks pour la détection des transactions
  • L'initiation des virements SEPA pour le cashback bancaire
  • Les procédures de test et de mise en production
RÈGLE FONDAMENTALE

REWAPP ne stocke JAMAIS les données de carte bancaire. Seuls les tokens fournis par le partenaire sont conservés (chiffrés AES-256).

1.2 Périmètre de l'Intégration

L'intégration bancaire couvre les fonctionnalités suivantes :

Fonctionnalités Couvertes

Fonctionnalité Description Service Responsable
Card Linking Liaison carte bancaire via OAuth2 OpenBanking Banking Service
Détection Transactions Réception des webhooks de nouvelles transactions Webhook Handler
Matching Partenaire Identification du commerçant dans la base REWAPP Transaction Service
Crédit Points Calcul et crédit des points de cashback Points Service
Virement SEPA Initiation du cashback bancaire Banking Service

1.3 Architecture Globale

L'architecture d'intégration bancaire repose sur les composants suivants :

  • Application Mobile : Interface utilisateur pour le card linking
  • Banking Service : Gestion des tokens, virements, communication avec Budget Insight
  • Webhook Handler : Réception et validation des notifications Budget Insight
  • Transaction Service : Matching et traitement des transactions
  • Points Service : Gestion du solde et des crédits de points

Communication avec Budget Insight

  • API REST HTTPS (TLS 1.3)
  • Authentification OAuth2 Client Credentials
  • SDK natif compatible Capacitor pour le card linking mobile
  • Webhooks HTTPS pour les notifications temps réel

1.4 Prérequis Techniques

Avant de démarrer l'intégration, les éléments suivants doivent être en place :

Prérequis d'Intégration

Prérequis Description Statut
Contrat Budget Insight Contrat commercial signé avec Powens Obligatoire
Compte Développeur Accès au portail développeur Budget Insight Obligatoire
Clés API Sandbox Client ID et Client Secret pour environnement de test Obligatoire
Infrastructure CapRover Docker Containers, PostgreSQL, Redis Obligatoire
Certificats SSL Certificats TLS 1.3 pour le domaine REWAPP Obligatoire
Endpoint Webhook URL publique HTTPS pour la réception des webhooks Obligatoire
Variables d'environnement CapRover Configuration pour le stockage sécurisé des secrets Obligatoire
2

FOURNISSEURS OPENBANKING

2.1 Fournisseur Recommandé : Budget Insight (Powens)

Budget Insight (groupe Powens) est le fournisseur OpenBanking recommandé pour REWAPP.

Raisons du choix

  • Agrément ACPR : Établissement de paiement agréé par l'Autorité de Contrôle Prudentiel et de Résolution
  • Couverture bancaire : Plus de 350 banques françaises et européennes
  • Conformité PSD2 : Full compliance avec la directive européenne
  • Certification PCI DSS : Niveau 1 (plus haut niveau de certification)
  • SDK Capacitor : Intégration native pour l'application mobile Angular + Ionic
  • Webhooks temps réel : Notification immédiate des nouvelles transactions
  • Support technique : Documentation complète et support dédié

Services Utilisés

Service Type Usage REWAPP
AIS Account Information Service Détection des transactions chez les partenaires
PIS Payment Initiation Service Virement cashback bancaire
Card Linking Liaison carte Connexion sécurisée du compte bancaire utilisateur

2.2 Alternatives Supportées

En cas d'indisponibilité ou de besoin spécifique, les fournisseurs suivants sont compatibles :

Fournisseurs Alternatifs

Fournisseur Agrément Couverture SDK Mobile Intégration
Tink (Visa) AISP agréé Europe 3 400+ banques EU Oui API REST + SDK
Plaid PCI DSS Niveau 1 11 000+ institutions Oui API REST + SDK
Bridge (Bankin') AISP agréé ACPR 350+ banques FR Oui API REST + SDK

2.3 Critères de Sélection

Critères de Sélection Fournisseur

Critère Exigence Poids
Agrément ACPR/Équivalent UE Obligatoire Critique
Certification PCI DSS Niveau 1 Obligatoire Critique
Couverture banques françaises > 95% Élevé
SLA disponibilité > 99.9% Élevé
SDK Capacitor Disponible Moyen
Webhooks temps réel Obligatoire Élevé
Support technique Dédié 24/7 Moyen
Tarification Compétitive Moyen

2.4 Comparatif des Fournisseurs

Comparatif Détaillé

Critère Budget Insight Tink Plaid Bridge
Agrément ACPR
Couverture FR 350+ 200+ 150+ 350+
PCI DSS Niveau 1
SDK Capacitor
Webhooks
PIS (Virements)
Support FR
Recommandation Principal Alternative Alternative Alternative
3

CONFIGURATION DU PARTENAIRE

3.1 Création du Compte Développeur

Étape 1 : Inscription sur le portail Budget Insight

URL : https://developers.budget-insight.com

Informations requises :

  • Raison sociale : REWAPP Solutions SAS
  • SIRET : [Numéro SIRET]
  • Contact technique : tech@rewapp.fr
  • Contact commercial : contact@rewapp.fr

Étape 2 : Validation du compte

Budget Insight procède à une vérification KYB (Know Your Business) :

  • Vérification des documents légaux (Kbis, statuts)
  • Validation du cas d'usage
  • Signature du contrat de partenariat
  • Délai : 5-10 jours ouvrés

3.2 Obtention des Clés API

Une fois le compte validé, les clés API sont disponibles dans le portail développeur :

Clés API

Clé Description Usage
client_id Identifiant unique de l'application REWAPP Toutes les requêtes API
client_secret Secret partagé pour l'authentification Obtention des tokens
webhook_secret Clé HMAC pour la signature des webhooks Validation des webhooks
SÉCURITÉ

Les clés ne doivent JAMAIS être commitées dans le code source. Utiliser les variables d'environnement CapRover.

3.3 Configuration des Environnements

Environnement Sandbox (Tests)

Configuration Sandbox

Paramètre Valeur
Base URL https://sandbox.budget-insight.com/api/v2
client_id bi_sandbox_[votre_id]
webhook_url https://sandbox-api.rewapp.fr/webhooks/banking
Banques disponibles Banques de test uniquement
Transactions Données simulées

Environnement Production

Configuration Production

Paramètre Valeur
Base URL https://api.budget-insight.com/api/v2
client_id bi_prod_[votre_id]
webhook_url https://api.rewapp.fr/webhooks/banking
Banques disponibles 350+ banques réelles
Transactions Données réelles utilisateurs

3.4 Gestion des Secrets

Configuration des variables d'environnement CapRover :

JSON
{
  "budget_insight": {
    "sandbox": {
      "client_id": "bi_sandbox_xxx",
      "client_secret": "xxx",
      "webhook_secret": "xxx"
    },
    "production": {
      "client_id": "bi_prod_xxx",
      "client_secret": "xxx",
      "webhook_secret": "xxx"
    }
  }
}

Règles de rotation

  • Rotation automatique tous les 90 jours
  • Rotation immédiate en cas de suspicion de compromission
  • Historique des versions conservé (30 jours)
4

API BUDGET INSIGHT - SPÉCIFICATIONS

4.1 Base URLs et Versioning

Environnements API

Environnement Base URL Version API
Sandbox https://sandbox.budget-insight.com/api/v2 v2
Production https://api.budget-insight.com/api/v2 v2

Versioning : L'API utilise le versioning dans l'URL. La version actuelle est v2.

Headers obligatoires

HTTP Headers
Content-Type: application/json
Authorization: Bearer {access_token}
X-Request-Id: {uuid} // Pour la traçabilité
User-Agent: REWAPP-BankingService/1.0

4.2 Authentification

L'API Budget Insight utilise OAuth2 avec le flow Client Credentials.

Obtention du token d'accès

POST /auth/token

Obtenir un token d'accès pour l'API.

Requête
Form Data
grant_type=client_credentials
&client_id={client_id}
&client_secret={client_secret}
Réponse 200 OK
JSON
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "accounts transactions payments"
}

Gestion des tokens

  • Durée de validité : 1 heure (3600 secondes)
  • Renouvellement : Automatique avant expiration (5 min avant)
  • Cache : Stockage en Redis avec TTL

4.3 Endpoints Principaux

Endpoints API Budget Insight

Endpoint Méthode Description Usage REWAPP
/auth/token POST Obtenir un token d'accès Authentification API
/auth/init POST Initialiser le flux OAuth2 utilisateur Card linking
/connections GET Lister les connexions actives Gestion des liaisons
/connections/{id} GET Détails d'une connexion Vérification statut
/connections/{id} DELETE Révoquer une connexion Déconnexion carte
/connections/{id}/accounts GET Comptes liés à une connexion Information compte
/transactions GET Récupérer les transactions Sync manuelle
/payments/initiate POST Initier un virement SEPA Cashback bancaire
/payments/{id} GET Statut d'un virement Suivi virement
/webhooks POST Enregistrer un webhook Configuration notifications
/webhooks/{id} DELETE Supprimer un webhook Désactivation

4.4 Formats de Données

Format Connexion

JSON - Connection Object
{
  "id": "conn_abc123xyz",
  "user_id": "user_789",
  "bank_id": "bnp_paribas",
  "bank_name": "BNP Paribas",
  "status": "active",
  "last_sync": "2025-11-24T14:30:00.000Z",
  "created_at": "2025-11-01T10:00:00.000Z",
  "expires_at": "2026-01-29T10:00:00.000Z",
  "accounts": [
    {
      "id": "acc_456",
      "type": "checking",
      "name": "Compte Courant",
      "iban": "FR76****1234",
      "currency": "EUR"
    }
  ]
}

Format Transaction

JSON - Transaction Object
{
  "id": "txn_xyz789",
  "connection_id": "conn_abc123xyz",
  "account_id": "acc_456",
  "amount": -45.50,
  "currency": "EUR",
  "direction": "DEBIT",
  "date": "2025-11-24",
  "value_date": "2025-11-24",
  "description": "PAIEMENT CB 2411 RESTAURANT LE BISTROT",
  "merchant": {
    "name": "RESTAURANT LE BISTROT",
    "mcc_code": "5812",
    "mcc_category": "Restaurants",
    "city": "PARIS",
    "country": "FR"
  },
  "card": {
    "last_four": "1234"
  },
  "category": "food_and_dining",
  "status": "booked"
}

4.5 Codes de Réponse HTTP

Codes HTTP et Actions

Code HTTP Signification Action REWAPP
200 Succès Traiter la réponse
201 Ressource créée Confirmer la création
204 Succès sans contenu Confirmer l'action
400 Requête invalide Logger et corriger la requête
401 Non authentifié Renouveler le token
403 Accès refusé Vérifier les permissions
404 Ressource non trouvée Gérer le cas d'erreur
409 Conflit Gérer le doublon
429 Rate limit dépassé Backoff exponentiel
500 Erreur serveur Retry avec backoff
503 Service indisponible Retry avec backoff
5

FLUX D'INTÉGRATION - CARD LINKING

5.1 Vue d'Ensemble du Flux OAuth2

Le card linking utilise le flux OAuth2 Authorization Code avec PKCE pour une sécurité maximale.

Étapes du flux

  1. 1
    Application Mobile → Banking Service

    Demande d'initialisation

  2. 2
    Banking Service → Budget Insight

    POST /auth/init

  3. 3
    Budget Insight → Banking Service

    URL d'autorisation + state token

  4. 4
    Application Mobile → SDK Budget Insight

    Lancement interface de connexion

  5. 5
    Utilisateur → Banque

    Authentification SCA (2FA)

  6. 6
    Banque → Budget Insight

    Code d'autorisation

  7. 7
    Budget Insight → Application Mobile

    Callback avec connection_id

  8. 8
    Application Mobile → Banking Service

    Finalisation de la liaison

  9. 9
    Banking Service → Base de données

    Stockage token chiffré

5.2 Étape 1 : Initialisation de la Session

POST /api/v1/banking/cards/link

Requête App Mobile → Banking Service

Requête
JSON
{
  "device_id": "device_abc123",
  "platform": "ios"
}
Réponse 200 OK
JSON
{
  "session_id": "sess_xyz789",
  "auth_url": "https://webview.budget-insight.com/auth/xxx",
  "expires_at": "2025-11-24T14:40:00.000Z"
}

Actions Backend

  • Générer un session_id unique (UUID v4)
  • Stocker en Redis avec TTL 10 minutes
  • Appeler Budget Insight POST /auth/init
  • Retourner l'URL d'autorisation

5.3 Étape 2 : Redirection vers Budget Insight

POST /auth/init

Requête Banking Service → Budget Insight

Requête
JSON
{
  "client_id": "bi_prod_rewapp",
  "redirect_uri": "rewapp://banking/callback",
  "state": "sess_xyz789",
  "scope": "accounts transactions",
  "code_challenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM",
  "code_challenge_method": "S256"
}
Réponse 200 OK
JSON
{
  "auth_url": "https://webview.budget-insight.com/auth/abc123",
  "state": "sess_xyz789",
  "expires_in": 600
}

5.4 Étape 3 : Authentification Bancaire (SCA)

L'utilisateur est redirigé vers l'interface Budget Insight (webview ou navigateur in-app) où il :

  1. 1
    Sélectionne sa banque

    Dans la liste des banques supportées

  2. 2
    Saisit ses identifiants bancaires

    Directement chez Budget Insight

  3. 3
    Valide l'authentification forte (SCA)

    Via son application bancaire

  4. 4
    Accorde le consentement

    D'accès aux données

SÉCURITÉ

Les identifiants bancaires ne transitent JAMAIS par les serveurs REWAPP.

5.5 Étape 4 : Callback et Récupération des Tokens

Callback Budget Insight → Application Mobile

Deep Link
rewapp://banking/callback?connection_id=conn_abc123&state=sess_xyz789
POST /api/v1/banking/cards/complete

Requête App Mobile → Banking Service

Requête
JSON
{
  "session_id": "sess_xyz789",
  "connection_id": "conn_abc123"
}

Actions Backend

  • Valider le session_id (existe en Redis, non expiré)
  • Appeler Budget Insight GET /connections/{id}
  • Récupérer les détails de la connexion et du compte
  • Enregistrer le webhook pour cette connexion

5.6 Étape 5 : Stockage Sécurisé

Données stockées dans PostgreSQL (table bank_connections) :

JSON - Structure de Stockage
{
  "id": "bc_rewapp_001",
  "user_id": "user_789",
  "bi_connection_id": "AES256_ENCRYPTED(conn_abc123)",
  "bank_name": "BNP Paribas",
  "bank_logo_url": "https://assets.bi.com/bnp.png",
  "account_iban_masked": "FR76****1234",
  "card_last_four": "1234",
  "status": "active",
  "consent_expires_at": "2026-01-29T10:00:00.000Z",
  "created_at": "2025-11-24T14:35:00.000Z",
  "updated_at": "2025-11-24T14:35:00.000Z"
}

Chiffrement

  • Algorithme : AES-256-GCM
  • Clé : Stockée dans variables d'environnement CapRover
  • IV : Généré aléatoirement pour chaque enregistrement

5.7 Exemples de Code

Service NestJS - Initialisation Card Linking

TypeScript - banking.service.ts
// banking.service.ts
@Injectable()
export class BankingService {
  async initCardLinking(userId: string, deviceId: string): Promise<CardLinkingSession> {
    // 1. Générer session ID
    const sessionId = uuidv4();
    
    // 2. Appeler Budget Insight
    const biResponse = await this.budgetInsightClient.post('/auth/init', {
      client_id: this.config.clientId,
      redirect_uri: 'rewapp://banking/callback',
      state: sessionId,
      scope: 'accounts transactions'
    });
    
    // 3. Stocker session en Redis (TTL 10 min)
    await this.redis.setex(
      'card_linking:' + sessionId,
      600,
      JSON.stringify({ userId, deviceId, createdAt: new Date() })
    );
    
    // 4. Retourner les infos
    return {
      sessionId,
      authUrl: biResponse.data.auth_url,
      expiresAt: new Date(Date.now() + 600000)
    };
  }
}
6

CONFIGURATION DES WEBHOOKS

6.1 Architecture des Webhooks

Les webhooks permettent à Budget Insight de notifier REWAPP en temps réel lorsqu'une nouvelle transaction est détectée sur le compte bancaire d'un utilisateur.

Flux de réception

  1. 1
    Budget Insight détecte une nouvelle transaction
  2. 2
    Budget Insight envoie un POST HTTPS vers l'endpoint REWAPP
  3. 3
    Webhook Handler valide la signature HMAC-SHA256
  4. 4
    Webhook Handler répond HTTP 200 immédiatement
  5. 5
    Job ajouté à la queue Bull pour traitement asynchrone
  6. 6
    Transaction Service traite le job

6.2 Événements Supportés

Événements Webhook

Événement Description Traitement REWAPP
transaction.created Nouvelle transaction détectée Matching partenaire + crédit points
transaction.updated Transaction mise à jour Mise à jour statut si nécessaire
connection.synced Synchronisation terminée Log informatif
connection.error Erreur de connexion Notification utilisateur
connection.expired Consentement expiré (90 jours) Notification + demande renouvellement
payment.initiated Virement initié Mise à jour statut withdrawal
payment.completed Virement effectué Confirmation + notification
payment.failed Virement échoué Déblocage points + notification

6.3 Format des Payloads

Payload transaction.created

HTTP Request
POST /webhooks/banking
Content-Type: application/json
X-Webhook-Signature: sha256=7d38cdd689735b008b3c702edd92eea23791c5f6...
X-Webhook-Timestamp: 1732456800
X-Webhook-Id: wh_evt_abc123

{
  "event": "transaction.created",
  "timestamp": "2025-11-24T14:30:00.000Z",
  "webhook_id": "wh_evt_abc123",
  "data": {
    "transaction_id": "txn_xyz789",
    "connection_id": "conn_abc123",
    "account_id": "acc_456",
    "amount": -45.50,
    "currency": "EUR",
    "direction": "DEBIT",
    "date": "2025-11-24",
    "description": "PAIEMENT CB 2411 RESTAURANT LE BISTROT",
    "merchant": {
      "name": "RESTAURANT LE BISTROT",
      "mcc_code": "5812",
      "mcc_category": "Restaurants",
      "city": "PARIS",
      "country": "FR"
    },
    "status": "booked"
  }
}

Payload payment.completed

JSON
{
  "event": "payment.completed",
  "timestamp": "2025-11-24T15:45:00.000Z",
  "webhook_id": "wh_evt_def456",
  "data": {
    "payment_id": "pay_xyz789",
    "amount": 9.50,
    "currency": "EUR",
    "status": "COMPLETED",
    "reference": "REWAPP-WD-2025-11-24-001",
    "beneficiary_iban": "FR76****5678",
    "execution_date": "2025-11-24"
  }
}

6.4 Sécurité et Validation

Étape 1 : Vérification de l'IP source

Les webhooks ne sont acceptés que depuis les IPs Budget Insight (whitelist) :

  • 52.47.XXX.XXX (Production EU-West-1)
  • 35.180.XXX.XXX (Production EU-West-1)

Étape 2 : Vérification de la signature HMAC-SHA256

TypeScript
// Calcul de la signature attendue
const expectedSignature = crypto
  .createHmac('sha256', webhookSecret)
  .update(timestamp + '.' + rawBody)
  .digest('hex');

// Comparaison sécurisée (timing-safe)
if (!crypto.timingSafeEqual(
  Buffer.from(receivedSignature),
  Buffer.from('sha256=' + expectedSignature)
)) {
  throw new UnauthorizedException('WEBHOOK_SIGNATURE_INVALID');
}

Étape 3 : Protection anti-replay

TypeScript
const webhookTimestamp = parseInt(headers['x-webhook-timestamp']);
const currentTimestamp = Math.floor(Date.now() / 1000);

if (currentTimestamp - webhookTimestamp > 300) { // 5 minutes
  throw new UnauthorizedException('WEBHOOK_TIMESTAMP_EXPIRED');
}

Étape 4 : Idempotence

TypeScript
// Vérifier si le webhook a déjà été traité
const processed = await this.redis.get('webhook:' + webhookId);
if (processed) {
  return { status: 'already_processed' };
}

// Marquer comme traité (TTL 24h)
await this.redis.setex('webhook:' + webhookId, 86400, 'processed');

6.5 Gestion des Retries

Politique de retry Budget Insight

Politique de Retry

Tentative Délai Action si échec
1 Immédiat Retry
2 1 minute Retry
3 5 minutes Retry
4 30 minutes Retry
5 2 heures Abandon + Alerte

Réponses attendues par Budget Insight

Codes de Réponse

Code HTTP Interprétation Action Budget Insight
200-299 Succès Pas de retry
400-499 Erreur client Pas de retry (sauf 429)
429 Rate limit Retry avec backoff
500-599 Erreur serveur Retry automatique
Timeout Pas de réponse (30s) Retry automatique

6.6 Exemples de Traitement

Webhook Handler NestJS

TypeScript - webhook.controller.ts
// webhook.controller.ts
@Controller('webhooks')
export class WebhookController {
  @Post('banking')
  async handleBankingWebhook(
    @Headers() headers: Record<string, string>,
    @Body() body: any,
    @Req() req: Request
  ) {
    // 1. Valider la signature
    await this.webhookService.validateSignature(
      headers['x-webhook-signature'],
      headers['x-webhook-timestamp'],
      req.rawBody
    );
    
    // 2. Répondre immédiatement (important pour éviter le timeout)
    // Le traitement se fait de manière asynchrone
    
    // 3. Ajouter le job à la queue
    await this.transactionQueue.add('process-webhook', {
      event: body.event,
      data: body.data,
      webhookId: body.webhook_id
    });
    
    return { received: true };
  }
}
7

DÉTECTION ET MATCHING DES TRANSACTIONS

7.1 Flux de Détection

Lorsqu'une transaction est reçue via webhook, le flux suivant est exécuté :

  1. 1
    Webhook Handler reçoit et valide le webhook
  2. 2
    Job ajouté à la queue "transactions"
  3. 3
    Transaction Service consomme le job
  4. 4
    Vérification d'idempotence

    Transaction déjà traitée ?

  5. 5
    Identification de l'utilisateur via connection_id
  6. 6
    Matching du commerçant dans la base REWAPP
  7. 7
    Si match → Calcul des points et crédit
  8. 8
    Si pas de match → Transaction ignorée (log uniquement)

7.2 Algorithme de Matching Commerçant

Le matching s'effectue selon plusieurs critères, par ordre de priorité :

Critères de Matching

Priorité Critère Score Exemple
1 ID partenaire exact 100% merchant_external_id = "bi_merchant_123"
2 SIRET/SIREN 95% siret = "12345678901234"
3 Nom exact 90% name = "RESTAURANT LE BISTROT"
4 Nom fuzzy + Ville 80% name LIKE '%BISTROT%' AND city = 'PARIS'
5 MCC Code + Nom fuzzy 70% mcc_code = '5812' AND similarity > 0.7

Algorithme de matching

TypeScript
async function matchMerchant(transaction: Transaction): Promise<Merchant | null> {
  // 1. Match par ID externe (le plus fiable)
  let merchant = await this.merchantRepo.findByExternalId(
    transaction.merchant.external_id
  );
  if (merchant) return merchant;
  
  // 2. Match par SIRET si disponible
  if (transaction.merchant.siret) {
    merchant = await this.merchantRepo.findBySiret(
      transaction.merchant.siret
    );
    if (merchant) return merchant;
  }
  
  // 3. Match par nom exact + ville
  merchant = await this.merchantRepo.findByNameAndCity(
    transaction.merchant.name,
    transaction.merchant.city
  );
  if (merchant) return merchant;
  
  // 4. Match fuzzy (Levenshtein distance < 3)
  merchant = await this.merchantRepo.findByFuzzyName(
    transaction.merchant.name,
    transaction.merchant.mcc_code
  );
  if (merchant && merchant.matchScore > 0.7) return merchant;
  
  // Pas de match
  return null;
}

7.3 Calcul des Points de Cashback

FORMULE DE CALCUL

Points = (Montant × Taux Cashback × (1 + Bonus Palier)) / 0.10

Exemple

  • Montant transaction : 100€
  • Taux cashback commerçant : 4%
  • Palier utilisateur : Silver (+5%)
  • Calcul : (100 × 0.04 × 1.05) / 0.10 = 42 points

Éléments du Calcul

Élément Valeur Source
Montant Montant absolu de la transaction Webhook Budget Insight
Taux Cashback Défini par le commerçant (ex: 4%) Base REWAPP (table merchants)
Bonus Palier Selon fidélité (0%, 5%, 10%, 15%, 20%) Calculé sur 12 mois glissants
Ratio Point 1 point = 0.10€ Règle métier REWAPP

7.4 Gestion des Transactions Non Matchées

Les transactions qui ne correspondent à aucun partenaire REWAPP sont :

  • Loggées pour analyse (amélioration du matching)
  • Ignorées pour le crédit de points
  • Non notifiées à l'utilisateur

Métriques suivies

  • Taux de matching global (objectif > 80%)
  • Top 10 commerçants non matchés
  • Transactions par MCC code non couvert
8

INITIATION DES VIREMENTS SEPA

8.1 Prérequis PIS (Payment Initiation Service)

Pour initier des virements, REWAPP utilise le service PIS de Budget Insight qui requiert :

  • Agrément PIS actif (inclus dans le contrat Budget Insight)
  • IBAN source : Compte REWAPP dédié aux virements
  • IBAN destination : Compte bancaire de l'utilisateur (récupéré lors du card linking)
  • Montant : Calculé selon le ratio cashback bancaire (points × 0.095)

8.2 Flux d'Initiation de Virement

  1. 1
    Utilisateur demande un virement dans l'app

    Minimum 100 points

  2. 2
    Banking Service vérifie le solde disponible
  3. 3
    Points Service bloque les points concernés
  4. 4
    Banking Service calcule le montant

    points × 0.095 = -5% vs valeur nominale

  5. 5
    Création d'un enregistrement withdrawal

    status: pending

  6. 6
    Banking Service appelle POST /payments/initiate
  7. 7
    Budget Insight initie le virement SEPA
  8. 8
    Mise à jour du statut

    status: processing

  9. 9
    Webhook payment.completed reçu

    2-3 semaines

  10. 10
    Points définitivement débités

    status: completed

8.3 Validation de l'IBAN

Avant chaque virement, l'IBAN est validé :

TypeScript
function validateIBAN(iban: string): boolean {
  // 1. Nettoyage (suppression espaces)
  const cleanIban = iban.replace(/s/g, '').toUpperCase();
  
  // 2. Vérification format FR
  if (!cleanIban.match(/^FR[0-9]{2}[0-9A-Z]{23}$/)) {
    return false;
  }
  
  // 3. Vérification checksum (modulo 97)
  const rearranged = cleanIban.slice(4) + cleanIban.slice(0, 4);
  const numericIban = rearranged.replace(/[A-Z]/g, 
    (char) => (char.charCodeAt(0) - 55).toString()
  );
  
  return BigInt(numericIban) % 97n === 1n;
}

8.4 Suivi du Statut

États du Virement

Statut Description Actions Possibles
pending Demande créée, en attente de traitement Annulation possible
processing Virement initié chez Budget Insight Annulation impossible
completed Virement effectué sur le compte utilisateur Aucune
failed Échec du virement Points débloqués, notification
cancelled Annulé par l'utilisateur Points débloqués

8.5 Exemples de Requêtes

POST /api/v1/banking/withdrawals

Requête d'initiation de virement

Requête
JSON
{
  "points_amount": 100,
  "destination_iban": "FR7612345678901234567890123"
}
Réponse 201 Created
JSON
{
  "withdrawal_id": "wd_abc123",
  "points_amount": 100,
  "euro_amount": 9.50,
  "status": "pending",
  "estimated_arrival": "2025-12-08",
  "created_at": "2025-11-24T16:00:00.000Z"
}

Requête Banking Service → Budget Insight

JSON
{
  "amount": 9.50,
  "currency": "EUR",
  "source_iban": "FR7699999999999999999999999",
  "beneficiary": {
    "name": "Jean Dupont",
    "iban": "FR7612345678901234567890123"
  },
  "reference": "REWAPP-WD-2025-11-24-001",
  "execution_date": "2025-11-24"
}
9

GESTION DES ERREURS

9.1 Codes d'Erreur Budget Insight

Erreurs Budget Insight

Code HTTP Description Action
auth_expired 401 Token d'accès expiré Renouveler le token
auth_invalid 401 Token invalide Ré-authentifier
connection_not_found 404 Connexion inexistante Vérifier l'ID
connection_expired 401 Consentement expiré (90j) Demander renouvellement
bank_unavailable 503 Banque temporairement indisponible Retry avec backoff
rate_limit_exceeded 429 Trop de requêtes Backoff exponentiel
payment_insufficient_funds 400 Solde insuffisant (compte REWAPP) Alerte administrative
payment_invalid_iban 400 IBAN invalide Demander correction
payment_rejected 400 Virement rejeté par la banque Notification utilisateur

9.2 Codes d'Erreur REWAPP

Erreurs REWAPP

Code HTTP Message Utilisateur
BANK_CARD_LINKING_FAILED 400 "La liaison de votre carte a échoué. Veuillez réessayer."
BANK_CARD_ALREADY_LINKED 409 "Cette carte est déjà liée à votre compte."
BANK_CONNECTION_EXPIRED 401 "Votre autorisation bancaire a expiré. Veuillez la renouveler."
BANK_PROVIDER_UNAVAILABLE 503 "Le service bancaire est temporairement indisponible."
BANK_IBAN_INVALID 400 "L'IBAN saisi est invalide."
BANK_WITHDRAWAL_MINIMUM 400 "Vous devez avoir au moins 100 points pour demander un virement."
BANK_WITHDRAWAL_PENDING 409 "Un virement est déjà en cours de traitement."

9.3 Stratégies de Retry

Configuration des Retries

Composant Tentatives Délais Conditions
Appels API Budget Insight 3 1s, 2s, 4s (exponential) 5xx, 429, timeout
Jobs Bull Queue 3 1s, 2s, 4s Toute erreur
Webhooks sortants 5 1s, 5s, 30s, 2min, 10min 5xx, timeout

Implémentation retry avec backoff

TypeScript
async function callWithRetry<T>(
  fn: () => Promise<T>,
  maxRetries: number = 3
): Promise<T> {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      if (attempt === maxRetries || !isRetryable(error)) {
        throw error;
      }
      const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
      await sleep(delay);
    }
  }
}

9.4 Circuit Breaker

Protection contre les cascades de pannes :

Configuration Circuit Breaker

Service Seuil Ouverture Délai Recovery Fallback
Budget Insight API 5 erreurs en 10s 30 secondes Queue pour retry différé
Points Service 10 erreurs en 10s 15 secondes Erreur utilisateur
Notification Service 20 erreurs en 10s 10 secondes Silencieux (non bloquant)

9.5 Dead Letter Queue

Les jobs échoués après toutes les tentatives sont placés en DLQ :

Dead Letter Queues

Queue DLQ Contenu Traitement
dlq:transactions Transactions non traitables Analyse quotidienne
dlq:points Crédits points échoués Traitement manuel prioritaire
dlq:withdrawals Virements échoués Investigation + contact utilisateur
dlq:notifications Notifications non envoyées Retry manuel si critique
10

ENVIRONNEMENTS ET TESTS

10.1 Environnement Sandbox

Configuration Sandbox

Paramètre Valeur
Base URL API https://sandbox.budget-insight.com/api/v2
Base URL REWAPP https://sandbox-api.rewapp.fr
Banques disponibles Banques de test ("Banque Demo", "Test Bank")
Transactions Générées automatiquement (simulées)
Virements Simulés (pas de vrai transfert)
Webhooks Envoyés vers endpoint sandbox

Comptes de test disponibles

Comptes de Test

Banque Test Identifiant Mot de passe Comportement
Banque Demo demo_user demo_pass Succès standard
Test Bank SCA sca_user sca_pass Requiert 2FA simulé
Test Bank Error error_user error_pass Génère des erreurs
Test Bank Slow slow_user slow_pass Latence élevée (5s)

10.2 Environnement de Staging

Configuration Staging

Paramètre Valeur
Base URL API https://staging.budget-insight.com/api/v2
Base URL REWAPP https://staging-api.rewapp.fr
Banques Banques réelles (mode test)
Transactions Transactions réelles (comptes de test internes)
Virements Simulés ou réels (selon configuration)

10.3 Environnement de Production

Configuration Production

Paramètre Valeur
Base URL API https://api.budget-insight.com/api/v2
Base URL REWAPP https://api.rewapp.fr
Banques 350+ banques françaises réelles
Transactions Transactions réelles utilisateurs
Virements Virements SEPA réels
Monitoring CloudWatch, alertes PagerDuty

10.4 Données de Test

Transactions de Test (Sandbox)

Merchant MCC Montant Attendu
RESTAURANT LE BISTROT 5812 45.50€ Match → 18 points (4%)
CARREFOUR MARKET 5411 120.00€ Match → 36 points (3%)
FNAC PARIS 5732 89.99€ Match → 45 points (5%)
COMPAGNIE INCONNUE 9999 50.00€ Pas de match

10.5 Checklist de Validation

Avant mise en production :

☐ Card Linking

  • Flux OAuth2 complet testé
  • Gestion des erreurs (annulation, timeout)
  • Stockage chiffré des tokens vérifié
  • Révocation de connexion testée

☐ Webhooks

  • Réception et validation signature OK
  • Protection anti-replay fonctionnelle
  • Idempotence vérifiée (même webhook 2x)
  • Traitement asynchrone (queue Bull)

☐ Matching Transactions

  • Match par ID externe OK
  • Match par nom + ville OK
  • Calcul points correct
  • Transactions non matchées ignorées

☐ Virements

  • Validation IBAN fonctionnelle
  • Blocage points avant initiation
  • Webhook payment.completed traité
  • Gestion des échecs (déblocage points)

☐ Sécurité

  • Chiffrement AES-256 vérifié
  • Secrets dans variables d'environnement CapRover
  • IP whitelisting webhooks
  • Rate limiting actif

☐ Monitoring

  • Alertes CloudWatch configurées
  • Dashboard de supervision opérationnel
  • Logs centralisés
11

MONITORING ET OBSERVABILITÉ

11.1 Métriques Clés

Seuils de Métriques

Métrique Seuil Normal Warning Critique
Webhooks reçus/min 50-500 <10 (5 min) <1 (10 min)
Latence webhook handler <100ms >200ms >500ms
Taux matching partenaire >80% <70% <50%
Jobs en DLQ 0 >10 >100
Erreurs Banking Service <1% >2% >5%
Card linking succès >90% <85% <75%
Virements en échec <1% >2% >5%
Tokens expirés non renouvelés 0 >10 >100

11.2 Alertes Configurées

Configuration des Alertes

Alerte Condition Canal Destinataires
Service Down Indisponibilité >2 min PagerDuty Équipe on-call
DLQ Critique >100 jobs en DLQ Slack #alerts-critical Équipe dev
Latence Élevée >500ms pendant 5 min Slack #alerts-warning Équipe dev
Taux Matching Bas <50% pendant 1h Slack #alerts-warning Product + Dev
Webhook Signature Invalid Toute occurrence Slack #security Équipe sécurité
Virement Échoué Tout échec Email Support + Utilisateur

11.3 Dashboard de Supervision

Tableaux de bord CloudWatch :

Banking Overview Webhooks/min, latence, taux de succès
Card Linking Taux succès, durée moyenne, abandons
Transactions Volume détecté, taux matching, points crédités
Withdrawals Demandes/jour, statuts, délais moyens
12

CONFORMITÉ ET SÉCURITÉ

12.1 Conformité PSD2

Exigences PSD2

Exigence PSD2 Implémentation REWAPP
SCA (Strong Customer Authentication) Déléguée à la banque via Budget Insight
Consentement explicite Écran de consentement avec durée (90 jours)
Accès limité (AIS) Lecture seule des transactions
Initiation de paiement (PIS) Via agrégateur agréé ACPR
Durée de consentement 90 jours max, notification J-7
Révocation Possible à tout moment via l'application

12.2 Conformité PCI DSS

PRINCIPE FONDAMENTAL

REWAPP ne stocke AUCUNE donnée de carte bancaire.

Stockage des Données Sensibles

Donnée Stockage REWAPP Responsable
Numéro de carte (PAN) JAMAIS Budget Insight
CVV/CVC JAMAIS N/A
Date d'expiration JAMAIS Budget Insight
Token connexion Chiffré AES-256 REWAPP
4 derniers chiffres Pour affichage UX REWAPP
IBAN utilisateur Chiffré AES-256 REWAPP

12.3 Conformité RGPD

Application des Principes RGPD

Principe RGPD Application
Licéité Double consentement (REWAPP + banque)
Finalité Données utilisées exclusivement pour le cashback
Minimisation Seules les transactions partenaires conservées
Exactitude Synchronisation régulière avec source bancaire
Limitation conservation Transactions : 3 ans, Tokens : jusqu'à révocation
Intégrité Chiffrement AES-256, audit trail

12.4 Mesures de Sécurité

Mesures par Couche

Couche Mesure Implémentation
Réseau TLS 1.3 obligatoire ALB avec certificat ACM
Réseau IP Whitelisting Firewall CapRover / Traefik
API Rate limiting 1000 req/min auth, 100 req/min non-auth
API JWT validation RS256, expiration 15 min
Application Chiffrement tokens AES-256-GCM
Application Signature webhooks HMAC-SHA256
Base de données Chiffrement au repos RDS encryption AES-256
Cache Chiffrement transit Redis TLS
Audit Journalisation CloudWatch Logs, 90 jours
13

RÉCAPITULATIF

13.1 Points Clés de l'Intégration

  • Fournisseur recommandé : Budget Insight (Powens) - Agrément ACPR, PCI DSS niveau 1
  • Card Linking : OAuth2 + PKCE via SDK natif, tokens chiffrés AES-256
  • Webhooks : Signature HMAC-SHA256, protection anti-replay, traitement asynchrone
  • Matching : Algorithme multi-critères (ID, SIRET, nom, MCC), taux objectif >80%
  • Virements : PIS via Budget Insight, validation IBAN, délai 2-3 semaines
  • Sécurité : Aucune donnée de carte stockée, conformité PSD2/PCI DSS/RGPD

13.2 Contacts et Support

Contacts

Contact Usage Email/URL
Support Technique Budget Insight Problèmes d'intégration support@budget-insight.com
Portail Développeur Documentation, clés API https://developers.budget-insight.com
Équipe REWAPP Backend Questions internes backend@rewapp.fr
Équipe REWAPP Sécurité Incidents sécurité security@rewapp.fr

13.3 Documents Connexes

Références

Document Contenu Lié
1.4 Règles Métier de Fidélité Calcul des points, paliers, validité
4.3 Architecture Backend API Services, endpoints, communication
5.3 Schéma Technique - Flux Bancaire Diagrammes d'architecture détaillés
6.4 Conformité PCI DSS - Bancaire Exigences de sécurité bancaire
7.1 Documentation API Backend Endpoints REWAPP complets
7.2 Spécifications Webhooks Webhooks internes REWAPP