- Stack Builder (recommended)
- Manual integration
10 minutes, zero copy-paste de code. Vous remplissez vos clés dans SandPay, vous téléchargez un starter zip pré-rempli, vous lancez
./setup.sh. Marche pour macOS, Linux et Windows.Créer un compte SandPay
Inscrivez-vous sur sandpay.dev/sign-up. L’onboarding prend ~30 secondes : email, mot de passe, premier opérateur.
Générer une clé API
Allez dans
/settings → API keys → Create new key. La clé sp_sk_test_… n’est affichée qu’une seule fois — gardez l’onglet ouvert pour passer à l’étape 3 sans avoir à la recopier.Choisir votre stack
Cliquez sur le bouton “Open Integration guide with this key →” dans la modale, ou allez manuellement à
/integration (dans la sidebar, section Dev → Integration). La page Stack Builder liste 5 backends et 4 clients mobiles. Cochez :- Un backend parmi : Supabase Edge Functions, Next.js API Routes, Express, Hono, FastAPI
- Zero ou plus de clients : Next.js web, Flutter, React Native, iOS native, Android native
Télécharger et lancer
Cliquez sur “Download zana-app.zip”. Décompressez, puis :Le script confirme vos valeurs (ou les demande si vous n’avez pas activé l’inclusion des secrets), puis écrit les fichiers
.env au bon endroit. Suivez les commandes affichées pour déployer Supabase, lancer le backend, lancer le frontend et lancer le mobile.Premier paiement
Depuis votre app web ou mobile, lancez un paiement test :
- Numéro :
+250788123456(default Rwanda MTN) - Montant :
25000 - Référence :
ORDER-TEST-001
status: SUCCESS synchrone, puis le webhook payment.completed async quelques secondes plus tard avec le champ raw opérateur synthétisé — il reproduit fidèlement la shape native MTN/Orange/Moov/Airtel (avec _simulated: true au top-level).Tester en local avec Supabase (Edge Functions)
Tester en local avec Supabase (Edge Functions)
Deux modes, selon que vous voulez utiliser Docker ou non. Le détail complet
(et le tableau des directions réseau) est dans le
README.md du starter.- Option A — Full local (Docker requis).
supabase startlance tout sur votre machine, puissupabase functions serve --env-file supabase/.env. ⚠️ Gotcha : une Edge Function tourne dans un conteneur Docker, donclocalhosty désigne le conteneur, pas votre machine. Pour joindre SandPay (sur l’hôte enlocalhost:3800), la fonction doit utiliserhttp://host.docker.internal:3800. Les clients pointent sur le Supabase local (http://127.0.0.1:54321) ; le webhook SandPay pointe surhttp://localhost:54321/functions/v1/sandpay-webhook. (Sur émulateur Android, l’hôte se joint via10.0.2.2, pas127.0.0.1.) - Option B — Mixte (fonctions cloud + clients locaux, sans Docker). Les
Edge Functions restent sur Supabase cloud ; vos clients tournent en local.
Le cloud ne peut pas joindre votre
localhost:3800, donc exposez SandPay via ngrok avec un domaine statique réservé (gratuit, 1 domaine) :ngrok http 3800 --domain=votre-nom.ngrok-free.app, puissupabase secrets set SANDPAY_BASE_URL=https://votre-nom.ngrok-free.app. Avantage : l’URL ne change plus entre les redémarrages → vous posez le secret une seule fois. (Les quick-tunnelscloudflaredetngrok httpsans--domainfont tourner l’URL à chaque redémarrage — à éviter.) Le webhook pointe alors sur la fonction cloud.
Prochaines étapes
Integration Guide
Le contrat complet de bout en bout — la référence canonique.
Configurer les webhooks
Recevez les statuts asynchrones des transactions avec signature HMAC.
Tous les scénarios
10 scénarios de simulation pour tester chaque cas d’erreur opérateur.
Guides opérateurs
Spécificités MTN, Orange, Moov, Airtel.
SDK Node.js
@sandpay/node — types complets, helpers webhook.
FAQ & tips d'intégration
Webhook qui ne part pas en local, commission/
net_amount, réconciliation — les questions qu’on se pose vraiment.