Chargement de vos clés API…

SDK Flutter

Encaisser par carte dans une application mobile Flutter.

Principe

Le paiement se fait sur la page hébergée Mobupay (widget Monext), ouverte dans le navigateur système (Chrome Custom Tabs sur Android, ASWebAuthenticationSession sur iOS), pas dans une WebView : la carte ne transite jamais par votre application (périmètre PCI minimal, anti-phishing). Au retour, l'app est notifiée et confirme la commande via le webhook signé reçu par votre backend.

Règle de sécurité

  • Ne jamais embarquer de clé sk_… dans l'app (elle serait extractible du binaire). La session est créée par votre backend, qui renvoie le checkoutUrl à l'app.
  • Le statut lu au retour n'est pas une preuve de paiement. La vérité vient du webhook signé côté serveur : confirmez la commande via votre backend.

Installation

dependencies:
  mobupay: ^0.1.0

Le SDK s'appuie sur flutter_web_auth_2 (v5+) pour ouvrir le navigateur système et capter le retour.

Utilisation (app mobile)

import 'package:mobupay/mobupay.dart';

// 1. Votre backend crée la session (avec sk_) et renvoie checkoutUrl.
final checkoutUrl = await monBackend.creerSessionMobupay(montant: 2500);

// 2. L'app présente la page Mobupay dans le navigateur système.
final result = await MobupayCheckout.present(
  checkoutUrl: checkoutUrl,
  callbackUrlScheme: 'https', // App Links (recommandé) ; ou votre schéma custom
);

// 3. Confirmez via votre backend (webhook signé), pas via result.reportedStatus.
if (result.outcome == MobupayCheckoutOutcome.returned) {
  await monBackend.confirmerCommande();
}

Retour dans l'app : App Links / Universal Links (recommandé)

Pour un retour fiable après paiement, le redirectUrl de la session doit être une URL https revendiquée par votre app : l'OS route automatiquement cette URL vers l'application (Android App Links, iOS Universal Links). Un schéma custom (monapp://) est possible mais moins fiable (certains navigateurs bloquent la navigation vers un schéma externe).

  1. 1Hébergez /.well-known/assetlinks.json (Android) et apple-app-site-association (iOS) sur le domaine du redirectUrl, avec l'empreinte de signature de l'app.
  2. 2Déclarez l'intent-filter autoVerify (Android) et l'associated domain (iOS) pour ce domaine.
  3. 3Utilisez redirectUrl: https://votre-domaine/paiement-retour à la création de session.

Client API (backend / test uniquement)

final client = MobupayClient('sk_test_…'); // jamais sk_live_ dans une app distribuée

final session = await client.createCheckoutSession(
  reference: 'CMD-1042',
  amount: MobupayClient.toMinorUnits(25.00, 'EUR'), // 2500
  currency: 'EUR',
  redirectUrl: 'https://votre-domaine/paiement-retour',
  notificationUrl: 'https://votre-domaine/mobupay-webhook',
  externalId: '1042',
);

final paiement = await client.retrievePayment(session.paymentId);
await client.refund(session.paymentId);          // total
await client.refund(session.paymentId, amount: 1000); // partiel

Tester

Avec une clé sk_test_…, lancez le paiement et réglez sur la page Mobupay avec la carte de test Monext 5476 4309 9999 9892 (CVV 123, expiration future). Devises : EUR et XPF (montants en unité mineure via toMinorUnits).