Documentation Intégration Solution Bancaire
La solution de cashback nouvelle génération
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 |
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 |
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 :
{
"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)
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
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
/auth/token
Obtenir un token d'accès pour l'API.
Requête
grant_type=client_credentials
&client_id={client_id}
&client_secret={client_secret}
Réponse 200 OK
{
"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
{
"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
{
"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 |
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
Application Mobile → Banking Service
Demande d'initialisation
-
2
Banking Service → Budget Insight
POST /auth/init
-
3
Budget Insight → Banking Service
URL d'autorisation + state token
-
4
Application Mobile → SDK Budget Insight
Lancement interface de connexion
-
5
Utilisateur → Banque
Authentification SCA (2FA)
-
6
Banque → Budget Insight
Code d'autorisation
-
7
Budget Insight → Application Mobile
Callback avec connection_id
-
8
Application Mobile → Banking Service
Finalisation de la liaison
-
9
Banking Service → Base de données
Stockage token chiffré
5.2 Étape 1 : Initialisation de la Session
/api/v1/banking/cards/link
Requête App Mobile → Banking Service
Requête
{
"device_id": "device_abc123",
"platform": "ios"
}
Réponse 200 OK
{
"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
/auth/init
Requête Banking Service → Budget Insight
Requête
{
"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
{
"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
Sélectionne sa banque
Dans la liste des banques supportées
-
2
Saisit ses identifiants bancaires
Directement chez Budget Insight
-
3
Valide l'authentification forte (SCA)
Via son application bancaire
-
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
rewapp://banking/callback?connection_id=conn_abc123&state=sess_xyz789
/api/v1/banking/cards/complete
Requête App Mobile → Banking Service
Requête
{
"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) :
{
"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
// 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)
};
}
}
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
Budget Insight détecte une nouvelle transaction
-
2
Budget Insight envoie un POST HTTPS vers l'endpoint REWAPP
-
3
Webhook Handler valide la signature HMAC-SHA256
-
4
Webhook Handler répond HTTP 200 immédiatement
-
5
Job ajouté à la queue Bull pour traitement asynchrone
-
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
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
{
"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
// 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
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
// 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
// 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 };
}
}
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
Webhook Handler reçoit et valide le webhook
-
2
Job ajouté à la queue "transactions"
-
3
Transaction Service consomme le job
-
4
Vérification d'idempotence
Transaction déjà traitée ?
-
5
Identification de l'utilisateur via connection_id
-
6
Matching du commerçant dans la base REWAPP
-
7
Si match → Calcul des points et crédit
-
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
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
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
Utilisateur demande un virement dans l'app
Minimum 100 points
-
2
Banking Service vérifie le solde disponible
-
3
Points Service bloque les points concernés
-
4
Banking Service calcule le montant
points × 0.095 = -5% vs valeur nominale
-
5
Création d'un enregistrement withdrawal
status: pending
-
6
Banking Service appelle POST /payments/initiate
-
7
Budget Insight initie le virement SEPA
-
8
Mise à jour du statut
status: processing
-
9
Webhook payment.completed reçu
2-3 semaines
-
10
Points définitivement débités
status: completed
8.3 Validation de l'IBAN
Avant chaque virement, l'IBAN est validé :
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
/api/v1/banking/withdrawals
Requête d'initiation de virement
Requête
{
"points_amount": 100,
"destination_iban": "FR7612345678901234567890123"
}
Réponse 201 Created
{
"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
{
"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"
}
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
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 |
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
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 | Support + Utilisateur |
11.3 Dashboard de Supervision
Tableaux de bord CloudWatch :
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 |
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 |