Passer au contenu principal

Documentation Index

Fetch the complete documentation index at: https://developers.ligdicash.com/llms.txt

Use this file to discover all available pages before exploring further.

Le SDK Dart LigdiCash est conçu pour Flutter. Il utilise les conventions Dart — named parameters, enums, Future<> — et s’intègre naturellement dans vos widgets et services.

Installation

Ajoutez la dépendance dans votre pubspec.yaml :
pubspec.yaml
dependencies:
  ligdicash: ^1.0.2
Puis installez :
flutter pub get
Prérequis : Dart SDK ≥ 3.4.1 / Flutter ≥ 3.x.

Initialisation

Dart
import 'package:ligdicash/ligdicash.dart';

final client = Ligdicash(
  apikey: '{API_KEY}',
  authToken: '{AUTH_TOKEN}',
  platform: PlatformType.live,
);
Obtenez votre apikey et votre authToken depuis le dashboard LigdiCash en créant un projet API. Stockez-les dans vos variables d’environnement, jamais en dur dans le code Flutter.

Payin avec redirection

Le client est redirigé vers la page de paiement hébergée par LigdiCash dans une WebView. C’est le flux recommandé sur mobile.
Dart
// 1. Créer la facture
final invoice = client.Invoice(
  currency: 'xof',
  description: 'Commande #ORD-20240512',
  customerFirstname: 'Amadou',
  customerLastname: 'Ouédraogo',
  customerEmail: 'amadou@exemple.com',
  storeName: 'MaSuperBoutique',
  storeWebsiteUrl: 'https://masuperboutique.com',
);

// 2. Ajouter les articles
invoice.addItem(
  name: 'Chemise kente',
  description: 'Taille M',
  quantity: 2,
  unitPrice: 15000,
);
invoice.addItem(
  name: 'Frais de livraison',
  description: '',
  quantity: 1,
  unitPrice: 1500,
);

// 3. Lancer le paiement
final response = await invoice.payWithRedirection(
  returnUrl: 'https://masuperboutique.com/commande/succes',
  cancelUrl: 'https://masuperboutique.com/commande/annulation',
  callbackUrl: 'https://backend.masuperboutique.com/ligdicash/callback',
  customData: {'transaction_id': 'ORD-20240512'},
);

// 4. Ouvrir la WebView avec l'URL de paiement
final paymentUrl = response.responseText;
Sur Flutter, ouvrez paymentUrl dans une WebView native (package webview_flutter). Ne jamais l’afficher dans un WebView basé sur iframe HTML — LigdiCash le bloque.
Détectez l’URL de retour (returnUrl / cancelUrl) dans le callback onNavigationRequest de la WebView pour la fermer automatiquement et reprendre le flux de l’application.
Laissez toujours customer absent dans le payin avec redirection. Si vous passez un numéro, LigdiCash filtre la page de paiement pour ne montrer que les opérateurs de ce numéro.

Payin sans redirection

Le client paie directement depuis votre interface Flutter. Vous devez collecter son numéro de téléphone et, selon l’opérateur, son code OTP.
Dart
// 1. Créer la facture
final invoice = client.Invoice(
  currency: 'xof',
  description: 'Commande #ORD-20240512',
  customerFirstname: 'Amadou',
  customerLastname: 'Ouédraogo',
  customerEmail: 'amadou@exemple.com',
  storeName: 'MaSuperBoutique',
  storeWebsiteUrl: 'https://masuperboutique.com',
);
invoice.addItem(
  name: 'Chemise kente',
  description: 'Taille M',
  quantity: 2,
  unitPrice: 15000,
);

// 2. Lancer le paiement (avec OTP fourni par le client)
final response = await invoice.payWithoutRedirection(
  otp: '123456',            // Code OTP saisi par le client
  customer: '22670123456',  // Numéro du client, sans + ni espaces
  callbackUrl: 'https://backend.masuperboutique.com/ligdicash/callback',
  customData: {'transaction_id': 'ORD-20240512'},
);

// 3. Stocker le token pour vérification ultérieure
final token = response.token;
Le mode OTP varie selon l’opérateur. Par exemple, pour un opérateur en mode USSD, le client génère son OTP sur son téléphone avant que vous ne soumetttiez. Pour un opérateur en mode approbation (ex. Moov Africa), envoyez otp: '' — le client approuve directement sur son application. Consultez la page de l’opérateur concerné.

Payout

Envoyez de l’argent vers un client — remboursement, gain, salaire.

Vers le wallet LigdiCash du client

Dart
final withdrawal = client.Withdrawal(
  amount: 5000,
  description: 'Remboursement commande ORD-20240510',
  customer: '22670123456',
);

final response = await withdrawal.send(
  type: WithdrawalType.client,
  toWallet: false,  // false = virement automatique vers le mobile money lié
  callbackUrl: 'https://backend.masuperboutique.com/ligdicash/callback-payout',
  customData: {'transaction_id': 'REFUND-20240512'},
);

final token = response.token;

Directement vers le mobile money

Dart
final response = await withdrawal.send(
  type: WithdrawalType.merchant,  // Payout direct, sans wallet intermédiaire
  callbackUrl: 'https://backend.masuperboutique.com/ligdicash/callback-payout',
  customData: {'transaction_id': 'PAY-20240512'},
);
WithdrawalType.client utilise POST /pay/v01/withdrawal/create (via wallet LigdiCash). WithdrawalType.merchant utilise POST /pay/v01/straight/payout (mobile money direct, plus lent). Voir Payout — Introduction.

Vérification de statut

Appelez getTransaction avec le token stocké à la création (pas le token du callback, qui est différent).
Dart
final token = 'eyJ0eXAiOiJ...';  // Token retourné lors de la création

// Payin
final transaction = await client.getTransaction(
  token: token,
  type: TransactionType.payin,
);

// Payout client (withdrawal/create)
// final transaction = await client.getTransaction(
//   token: token,
//   type: TransactionType.clientPayout,
// );

if (transaction.status == 'completed') {
  // Livrer la commande / valider le paiement
} else if (transaction.status == 'pending') {
  // Paiement en cours — relancer dans quelques secondes
} else {
  // Paiement échoué ou annulé
}
Valeurs de TransactionType :
ValeurEndpoint vérifié
TransactionType.payinGET /redirect/checkout-invoice/confirm
TransactionType.clientPayoutGET /withdrawal/confirm
Champs disponibles sur transaction :
PropriétéTypeDescription
statusString"completed", "pending", "cancelled"
responseCodeString"00" succès, "01" échec
amountdoubleMontant de la transaction
operatorIdStringIdentifiant de l’opérateur
operatorNameStringNom de l’opérateur
customerStringNuméro du client
tokenStringToken de la transaction
customDataMap<String, dynamic>Données personnalisées envoyées à la création
Ne livrez jamais une commande uniquement sur la base d’un callback entrant. Appelez toujours getTransaction avec le token stocké à la création pour confirmer le statut côté serveur LigdiCash. Voir Sécurisation du callback.

Gestion des erreurs

Dart
try {
  final response = await invoice.payWithRedirection(
    returnUrl: 'https://masuperboutique.com/succes',
    cancelUrl: 'https://masuperboutique.com/annulation',
    callbackUrl: 'https://backend.masuperboutique.com/callback',
    customData: {'transaction_id': 'ORD-20240512'},
  );

  if (response.responseCode != '00') {
    // Erreur retournée par l'API — consultez response.wiki
    debugPrint('Erreur API: ${response.responseText}');
  }
} catch (e) {
  // Erreur réseau ou exception inattendue
  debugPrint('Erreur: $e');
}
Vérifiez response.responseCode après chaque appel : "00" indique un succès, "01" une erreur. En cas d’erreur, consultez response.wiki pour obtenir l’URL de détail des sous-codes.

Liens utiles