welloo_sdk 0.0.61 copy "welloo_sdk: ^0.0.61" to clipboard
welloo_sdk: ^0.0.61 copied to clipboard

Package de transaction Welloo

Welloo SDK - Guide d'Intégration #

SDK Flutter pour les paiements Welloo/Wave - Simple, sécurisé, plug & play


🚀 Installation en 3 étapes #

1️⃣ Ajouter la dépendance #

dependencies:
  welloo_sdk: ^0.0.51

2️⃣ Initialiser le SDK dans main() #

import 'package:flutter/material.dart';
import 'package:welloo_sdk/welloo_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await WellooSdk.init(); // ← OBLIGATOIRE
  
  runApp(const MyApp());
}

3️⃣ Lancer un dépôt #

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (_) => WellooDeposit(
      packageName: 'wellooapp',
      accessToken: "VOTRE_ACCESS_TOKEN",
      refreshToken: "VOTRE_REFRESH_TOKEN",
      waitResponse: (response) {
        // Transaction terminée
        print('Status: ${response['status']}'); // SUCCEEDED | FAILED
        print('Référence: ${response['reference_transaction']}');
      },
      onError: (error) {
        print('Erreur: ${error['description']}');
      },
    ),
  ),
);

C'est tout ! Le SDK gère automatiquement :

  • ✅ La vérification de la transaction (détection < 1s)
  • ✅ Le retour depuis l'app Wave vers votre app
  • ✅ Les erreurs et les cas limites

Pour une détection instantanée (< 1 seconde), configurez les deep links :

Android - AndroidManifest.xml #

<activity android:name=".MainActivity" android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="wellooapp"/>
    </intent-filter>
</activity>

iOS - Info.plist #

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>wellooapp</string>
        </array>
        <key>CFBundleURLName</key>
        <string>ci.wellooapp</string>
    </dict>
</array>
<key>FlutterDeepLinkingEnabled</key>
<true/>

⚠️ Important : Le scheme wellooapp est identique pour tous les intégrateurs.

Sans deep links : Le SDK utilise uniquement le polling (vérification toutes les 5s, max 5 min). Ça marche aussi !


🔧 Configuration Backend (Wave) #

Important : Le SDK N'A PAS DE ROUTES. Il écoute juste les deep links via app_links.

Deux Options Possibles #

Votre backend envoie directement le custom scheme à Wave :

// Dans votre backend lors de l'appel API Wave
{
  "success_url": "wellooapp://?status=success&reference={{reference}}",
  "error_url": "wellooapp://?status=error&reference={{reference}}"
}

Avantages :

  • ✅ Pas de serveur intermédiaire nécessaire
  • ✅ Wave ouvre directement votre app
  • ✅ Plus simple et plus rapide

Flux :

Wave termine paiement
  ↓
Wave ouvre "wellooapp://?status=success&reference=OP_123"
  ↓
OS ouvre votre app (retour sur l'écran SDK)
  ↓
SDK écoute via app_links → traite les données

Option 2 : Via Backend Intermédiaire (Logging/Analytics)

Si vous voulez logger ou tracker les callbacks de Wave :

// Votre backend envoie d'abord vers votre serveur
{
  "success_url": "https://votre-backend.com/wave/success",
  "error_url": "https://votre-backend.com/wave/error"
}

Votre backend doit ensuite :

// Node.js exemple
app.get('/wave/success', (req, res) => {
  const reference = req.query.reference;
  
  // 1. Logger l'événement
  logger.info('Payment success:', reference);
  
  // 2. Sauvegarder en DB
  await db.payments.update(reference, { status: 'success' });
  
  // 3. Rediriger vers l'app (OBLIGATOIRE)
  res.redirect(301, `wellooapp://?status=success&reference=${reference}`);
});

Flux :

Wave termine paiement
  ↓
Wave POST vers votre backend
  ↓
Votre backend : log + DB + redirect
  ↓
Navigateur redirige vers "wellooapp://..."
  ↓
OS ouvre votre app
  ↓
SDK écoute via app_links

⚠️ Ce que le SDK NE fait PAS #

  • ❌ Pas de navigation vers une route (/success, /error)
  • ❌ Pas de Navigator.push() lors du deep link
  • ❌ Pas de recherche de route dans le routing
  • ✅ Juste une écoute réactive via stream

L'app reste sur la même vue (écran du SDK), seules les données sont traitées.

📚 Documentation complète : Voir DEEP_LINK_NO_NAVIGATION.md


📖 Fonctionnalités Avancées #

Gestion de session utilisateur
// Enregistrer un client
final result = await WellooSdk().registerClient(
  accessToken: 'YOUR_TOKEN',
  refreshToken: 'YOUR_REFRESH',
);

// Vérifier la session
if (await WellooSdk.hasValidTokens()) {
  final client = await WellooSdk().getCurrentClient();
  print('Utilisateur: ${client.data?.nom}');
}

// Déconnexion
await WellooSdk().logout();
Double mécanisme de vérification

Le SDK combine automatiquement :

  1. Deep Link via Streams → Détection réactive (< 1s) via deepLinkDataStream
  2. Polling → Fallback automatique (vérification toutes les 5s)

Architecture :

Deep link reçu
  ↓
app_links.uriLinkStream
  ↓
DeepLinkService parse et émet
  ↓
deepLinkDataStream (référence + statut)
  ↓
DepositDataRemoteSource écoute
  ↓
Arrêt polling + émission transaction
  ↓
waitResponse() appelé avec résultat

Le système est 100% réactif : pas de polling du deep link, juste des streams asynchrones.

📚 Voir DEEP_LINK_STREAM.md pour l'architecture complète.

Configurations personnalisées

8 configurations prédéfinies disponibles :

Configuration Usage
waveConfig Wave CI (150x @ 2s)
welloConfig Wello (60x @ 3s)
productionConfig Production (60x @ 5s)
developmentConfig Dev/Debug (30x @ 1s)

Voir docs/SDK_INTEGRATION.md pour plus de détails.


❓ FAQ #

Le deep link est-il obligatoire ?

Non. Sans deep link, le SDK utilise le polling (vérification toutes les 5s). Ça fonctionne parfaitement, mais la détection prend 5-30 secondes au lieu de < 1 seconde.

Le SDK navigue-t-il vers une route quand il reçoit un deep link ?

NON ! C'est une confusion fréquente. Le SDK N'A AUCUNE ROUTE.

Quand wellooapp://?status=success est ouvert :

  1. L'OS ouvre votre app (qui était déjà sur l'écran du SDK)
  2. Le SDK écoute via app_links.uriLinkStream
  3. Il traite les données et appelle waitResponse()
  4. Aucun Navigator.push() n'est exécuté

L'app reste sur la même vue (celle du SDK). Pas de navigation, juste un traitement réactif des données.

Que signifie "packageName: 'wellooapp'" ?

C'est le scheme du deep link utilisé par le SDK. Tous les intégrateurs utilisent wellooapp. Ne le confondez pas avec le package Android de votre app (ex: com.example.myapp).

Comment obtenir mes tokens d'authentification ?

Les tokens sont fournis par votre backend après authentification utilisateur. Le SDK ne gère pas l'authentification, seulement les transactions.

Puis-je tester sans backend ?

Oui ! Créez un fichier .env dans example/ avec vos tokens de test :

ACCESS_TOKEN=votre_token_test
REFRESH_TOKEN=votre_refresh_token_test

Puis lancez example/lib/main.dart.

Le polling consomme-t-il beaucoup de batterie ?

Non. Le polling ne dure que 5 minutes maximum (60 tentatives × 5s) et s'arrête dès qu'une transaction est détectée ou que l'utilisateur quitte l'écran.


📚 Documentation Complète #

  • SDK_INTEGRATION.md - Guide d'intégration détaillé
  • DEEPLINK_INTEGRATION.md - Configuration deep links
  • TOKEN_STORAGE_FIX.md - Architecture du stockage des tokens

🆘 Support #

Problèmes fréquents :

  1. Tokens détruits → Vérifiez que WellooSdk.init() est appelé dans main()
  2. Deep link ne fonctionne pas → Vérifiez la configuration AndroidManifest.xml / Info.plist
  3. Transaction timeout → Le polling s'arrête après 5 min, utilisez checkDepositStatus() pour vérifier manuellement

Contact : Consultez les issues GitHub


📄 Licence #

Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.

Avec Logs Détaillés #

Le SDK affiche automatiquement des logs structurés dans la console :

============================================================
🚀 WELLOO SDK - DOUBLE MÉCANISME ACTIF
============================================================
Configuration: Wave Config (2s, 150x)
🔄 Deep link: wellooapp://?status=...&reference=...
🔄 Polling: 5s × 60 tentatives (fallback)
Circuit Breaker: Activé
Retry Policy: Max 3 tentatives
============================================================

📦 INITIATION DÉPÔT
============================================================
🔗 Deep link détecté: OP_DEP_20251209_ABC123
⚡ Vérification immédiate via API...

✅ RÉPONSE TRANSACTION:
Status: SUCCEEDED
Reference: TXN_DEP_20251205_ABC123

Vérification Manuelle #

Vous pouvez vérifier manuellement le statut d'une transaction :

final sdk = WellooSdk();

final result = await sdk.checkDepositStatus(
  reference: 'TXN_DEP_20251204_ABC123',
);

if (result.isSuccess && result.data != null) {
  final transaction = result.data!;
  print('Status: ${transaction.status}');
} else {
  print('Error: ${result.error}');
}

🎨 Exemple Complet #

Voir example/lib/main.dart pour un exemple d'application complète avec :

  • Gestion de session utilisateur
  • Enregistrement client
  • Lancement de dépôts
  • Vérification manuelle de transactions
  • Gestion d'erreurs

🏗️ Pour les Développeurs #

Architecture du SDK

Le SDK utilise une architecture moderne :

  • Strategy Pattern : 3 stratégies de vérification (Polling, Deeplink, Hybrid)
  • Repository Pattern : Abstraction API avec AuthTokenService
  • Cache Pattern : Tokens en mémoire + FlutterSecureStorage isolé
  • Circuit Breaker Pattern : Protection contre les erreurs en cascade
lib/
├── src/
│   ├── features/
│   │   ├── authentication/   # Gestion tokens
│   │   ├── depots/          # Services dépôt
│   │   └── transactions/    # Vérification
│   ├── shared/
│   │   ├── config/          # Configurations
│   │   ├── services/        # Logger, Storage
│   │   └── deep_link_service.dart
│   └── welloo_sdk.dart
└── welloo_sdk.dart
Métriques disponibles

Le SDK expose des métriques en temps réel :

final metrics = WellooSdk().getMetrics();
print('Taux de succès: ${metrics.successRate}%');
print('Temps moyen: ${metrics.averageResponseTime}ms');
print('Deep links reçus: ${metrics.deeplinkCount}');

Flux de Données #

UI Layer (Widgets)
    ↓
Business Logic (BLoC/Cubit)
    ↓
Use Cases
    ↓
Repositories
    ↓
Data Sources (Remote/Local)
    ↓
ApiClient ← AuthTokenService (avec cache)
    ↓
SharedPreferences (storage persistant)

Gestion des Tokens #

registerClient(accessToken, refreshToken)
    ↓
AuthTokenService.saveTokens()
    ├─→ SharedPreferences.setString()  (storage)
    └─→ _cachedAccessToken = token     (cache)

getAccessToken()
    ├─→ Si en cache → retourne cache   (rapide)
    └─→ Sinon → lit storage → met en cache

refreshTokens()
    ├─→ Appel API refresh
    ├─→ Sauvegarde storage
    └─→ Met à jour cache immédiatement

clearTokens()
    ├─→ Supprime de storage
    └─→ Invalide cache

📊 Pays Supportés #

  • 🇨🇮 Côte d'Ivoire (+225)
  • 🇸🇳 Sénégal (+221)
  • 🇲🇱 Mali (+223)
  • 🇧🇫 Burkina Faso (+226)
  • 🇧🇯 Bénin (+229)
  • 🇹🇬 Togo (+228)
  • 🇳🇪 Niger (+227)
  • 🇬🇳 Guinée (+224)
  • 🇫🇷 France (+33)

🔄 Scénarios de Cycle de Vie Supportés #

Le SDK gère parfaitement ces scénarios :

Scénario Comportement Tokens Préservés
Premier lancement Initialisation complète ❌ (pas encore de tokens)
registerClient() Enregistre tokens en cache + storage
App en arrière-plan Tokens restent en cache
App fermée/rouverte Tokens rechargés depuis storage
Appels multiples init() Ignorés (déjà initialisé)
init(forceReinit: true) Réinitialisation complète ✅ (lus depuis storage)
logout() Supprime tokens
dispose() Nettoie ressources ✅ (persistent en storage)

✅ Bonnes Pratiques #

1. Initialisation du SDK #

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // ✅ TOUJOURS initialiser le SDK dans main()
  await WellooSdk.init();
  
  runApp(const MyApp());
}

2. Utilisation du packageName #

// ✅ BON : Utiliser le scheme deep link
WellooDeposit(
  packageName: 'wellooapp', // Scheme fixe pour tous les intégrateurs
  accessToken: token,
  refreshToken: refreshToken,
)

// ❌ MAUVAIS : Utiliser le package Android
WellooDeposit(
  packageName: 'com.example.myapp', // Ne pas utiliser !
  accessToken: token,
  refreshToken: refreshToken,
)
<!-- ✅ BON : Scheme sans host/path -->
<data android:scheme="wellooapp"/>

<!-- ❌ MAUVAIS : Avec host (cause des 404) -->
<data android:scheme="wellooapp" android:host="payment"/>

4. Format des URLs #

// ✅ BON : Format racine avec query parameters
"wellooapp://?status=success&reference=OP_DEP_..."

// ❌ MAUVAIS : Avec path (navigation vers route inexistante)
"wellooapp://home?status=success&reference=OP_DEP_..."

5. Gestion des Tokens #

// ✅ BON : Vérifier avant utilisation
if (await WellooSdk.hasValidTokens()) {
  await WellooSdk().initDeposit(context: context);
} else {
  // Demander à l'utilisateur de se connecter
}

// ✅ BON : Enregistrer après connexion
await WellooSdk().registerClient(
  accessToken: loginResponse.accessToken,
  refreshToken: loginResponse.refreshToken,
);

6. Gestion du Cycle de Vie #

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    // ✅ Disposer le SDK en fin de vie
    WellooSdk.dispose();
    super.dispose();
  }
}

7. Gestion des Erreurs #

final result = await WellooSdk().initDeposit(context: context);

switch (result.status) {
  case TransactionStatus.completed:
    // ✅ Succès - afficher confirmation
    showSuccessDialog();
    break;
  case TransactionStatus.failed:
    // ⚠️ Échec - afficher erreur avec message
    showErrorDialog(result.message);
    break;
  case TransactionStatus.canceled:
    // ℹ️ Annulé - retour simple
    Navigator.pop(context);
    break;
  case TransactionStatus.pending:
    // ⏳ En attente - afficher loader
    showLoadingDialog();
    break;
}

🆘 Support #

Pour toute question ou problème :

📝 Changelog #

Version 0.0.51 #

  • 🔐 Gestion robuste du cycle de vie avec cache intelligent des tokens
  • Validation automatique des tokens avant opérations critiques
  • 🔄 Réinitialisations multiples sécurisées avec option forceReinit
  • 🚀 Performance optimisée : Cache mémoire pour les tokens
  • 🛡️ Synchronisation garantie : Cache ↔ Storage toujours cohérents

Version 0.0.50 #

  • Nouveau système de vérification avec 3 stratégies
  • 🎯 8 configurations prédéfinies (Wave, Wello, Production, etc.)
  • 🛡️ Circuit Breaker et Retry Policy
  • 📊 Métriques détaillées et 12 types d'events
  • 🔍 Logs structurés avec 4 niveaux
  • Type-safe avec sealed classes
  • 🔄 Amélioration de la résilience avec stratégie Hybrid

Développé avec ❤️ par l'équipe Finapay