GeniusPay Flutter SDK

pub package License

SDK Flutter officiel pour intégrer les paiements GeniusPay (Wave, Orange Money, MTN Money, Carte bancaire).

Installation

dependencies:
  geniuspay_flutter: ^1.0.0
flutter pub get

Configuration

Initialisation

import 'package:geniuspay_flutter/geniuspay_flutter.dart';

void main() {
  GeniusPay.initialize(
    GeniusPayConfig(
      apiKey: 'pk_sandbox_xxxxxxxxxxxx',
      apiSecret: 'sk_sandbox_xxxxxxxxxxxx', // Optionnel
      sandbox: true,
    ),
  );
  
  runApp(MyApp());
}

Configuration Android

Ajoutez dans android/app/src/main/AndroidManifest.xml :

<queries>
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="https" />
  </intent>
</queries>

Configuration iOS

Ajoutez dans ios/Runner/Info.plist :

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>https</string>
</array>

Utilisation

Bouton de paiement simple

GeniusPayButton(
  amount: 5000,
  currency: 'XOF',
  paymentMethod: PaymentMethod.wave,
  description: 'Commande #123',
  customer: Customer(
    name: 'John Doe',
    email: 'john@example.com',
    phone: '+221771234567',
  ),
  onSuccess: (payment) {
    print('Paiement réussi: ${payment.reference}');
  },
  onError: (error) {
    print('Erreur: ${error.message}');
  },
)

Bottom Sheet de paiement

final payment = await GeniusPaySheet.show(
  context,
  amount: 10000,
  currency: 'XOF',
  description: 'Abonnement Premium',
  allowedMethods: [
    PaymentMethod.wave,
    PaymentMethod.orangeMoney,
    PaymentMethod.card,
  ],
);

if (payment != null) {
  print('Paiement initié: ${payment.reference}');
}

Sélecteur de méthode de paiement

PaymentMethod _selectedMethod = PaymentMethod.wave;

PaymentMethodsSelector(
  value: _selectedMethod,
  onChanged: (method) {
    setState(() => _selectedMethod = method);
  },
  allowedMethods: [
    PaymentMethod.wave,
    PaymentMethod.orangeMoney,
    PaymentMethod.mtnMoney,
  ],
)

Suivi du statut d'un paiement

PaymentStatusWidget(
  reference: 'MTX-ABC123',
  pollInterval: Duration(seconds: 5),
  showDetails: true,
  onCompleted: (payment) {
    print('Paiement complété!');
  },
  onFailed: (payment) {
    print('Paiement échoué');
  },
)

Utilisation directe de l'API

// Créer un paiement
final payment = await GeniusPay.instance.createPayment(
  PaymentData(
    amount: 5000,
    currency: 'XOF',
    paymentMethod: PaymentMethod.wave,
    description: 'Ma commande',
    customer: Customer(email: 'user@example.com'),
    metadata: {'order_id': '123'},
  ),
);

// Ouvrir la page de paiement
if (payment.paymentUrl != null) {
  await GeniusPay.instance.openPaymentPage(payment.paymentUrl!);
}

// Vérifier le statut
final status = await GeniusPay.client.checkPaymentStatus(payment.reference);

// Récupérer un paiement
final existingPayment = await GeniusPay.instance.getPayment('MTX-ABC123');

// Lister les paiements
final payments = await GeniusPay.instance.listPayments(
  status: 'completed',
  from: '2025-01-01',
);

Méthodes de paiement

Méthode Enum Description
Wave PaymentMethod.wave 🌊 Paiement Wave
Orange Money PaymentMethod.orangeMoney 🟠 Paiement Orange Money
MTN Money PaymentMethod.mtnMoney 🟡 Paiement MTN Money
Moov Money PaymentMethod.moovMoney 🔵 Paiement Moov Money
Carte PaymentMethod.card 💳 Carte bancaire

Statuts de paiement

Statut Enum Description
En attente PaymentStatus.pending Paiement en attente
En cours PaymentStatus.processing Paiement en cours de traitement
Réussi PaymentStatus.completed Paiement réussi
Échoué PaymentStatus.failed Paiement échoué
Annulé PaymentStatus.cancelled Paiement annulé
Expiré PaymentStatus.expired Paiement expiré

Gestion des erreurs

try {
  final payment = await GeniusPay.instance.createPayment(data);
} on AuthenticationException catch (e) {
  // Clés API invalides
  print('Erreur auth: ${e.message}');
} on ValidationException catch (e) {
  // Données invalides
  print('Validation: ${e.message}');
  print('Erreurs: ${e.errors}');
} on NetworkException catch (e) {
  // Erreur réseau
  print('Réseau: ${e.message}');
} on GeniusPayException catch (e) {
  // Autre erreur
  print('Erreur: ${e.message}');
}

Mode Sandbox

En mode sandbox (sandbox: true), aucune transaction réelle n'est effectuée.

Cartes de test

Numéro Résultat
4084 0841 1111 1111 Succès
4084 0841 2222 2222 Échec

Exemple complet

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

void main() {
  GeniusPay.initialize(
    GeniusPayConfig.sandbox(
      apiKey: 'pk_sandbox_xxxxxxxxxxxx',
    ),
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CheckoutPage(),
    );
  }
}

class CheckoutPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Checkout')),
      body: Center(
        child: GeniusPayButton(
          amount: 15000,
          currency: 'XOF',
          description: 'Commande #12345',
          customer: Customer(
            name: 'Amadou Diallo',
            email: 'amadou@example.com',
            phone: '+221771234567',
          ),
          onSuccess: (payment) {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (_) => PaymentStatusPage(
                  reference: payment.reference,
                ),
              ),
            );
          },
          onError: (error) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(error.message)),
            );
          },
          child: Text('Payer 15 000 XOF'),
        ),
      ),
    );
  }
}

class PaymentStatusPage extends StatelessWidget {
  final String reference;
  
  const PaymentStatusPage({required this.reference});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Statut du paiement')),
      body: PaymentStatusWidget(
        reference: reference,
        onCompleted: (payment) {
          showDialog(
            context: context,
            builder: (_) => AlertDialog(
              title: Text('Succès!'),
              content: Text('Merci pour votre achat.'),
              actions: [
                TextButton(
                  onPressed: () => Navigator.popUntil(context, (r) => r.isFirst),
                  child: Text('OK'),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

📞 Support

Licence

MIT - Voir LICENSE

Libraries

geniuspay_flutter
SDK Flutter officiel pour GeniusPay