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 lecheckoutUrlà 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.0Le 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).
- 1Hébergez
/.well-known/assetlinks.json(Android) etapple-app-site-association(iOS) sur le domaine duredirectUrl, avec l'empreinte de signature de l'app. - 2Déclarez l'
intent-filterautoVerify(Android) et l'associated domain (iOS) pour ce domaine. - 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); // partielTester
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).