@sandpay/node,
ou un client fait maison en Deno / Python / Go via HTTP brut).
SandPay est la source de vérité. Ancrez votre comportement sur ce que
GET /v1/meta rapporte et sur ce que dit le
Changelog d’intégration — jamais sur une hypothèse
codée en dur. Ce guide reste valide à travers les versions car chaque détail
spécifique à une version provient de ces deux sources.Quel chemin prenez-vous ?
Chemin A — Mise à niveau
Vous avez déjà une intégration fonctionnelle sur une ancienne version de l’API
et souhaitez passer à la version courante (adopter les remboursements/décaissements,
etc.).
Chemin B — Installation / réinstallation
Vous intégrez depuis zéro, ou vous supprimez l’ancienne intégration pour la
refaire proprement.
Chemin A — Mettre à niveau une intégration existante
Faites le point : version actuelle vs version cible
Demandez à l’instance ce qu’elle supporte. La version qu’elle rapporte est
votre cible :Puis lisez le Changelog d’intégration depuis votre
version actuelle jusqu’à la cible — notez chaque ligne “Action requise ?”.
Mettez à jour le client vers ≥ min_sdk_version
- Node :
npm i @sandpay/node@latest(doit être ≥min_sdk_version). - Client fait maison (Deno/Python/Go) : reproduisez manuellement les nouvelles méthodes/champs (les nouveaux endpoints + champs de réponse sont dans le changelog et le Guide d’intégration).
Migrez la base de données — uniquement si vous hébergez SandPay vous-même
Contre le service hébergé
api.sandpay.dev : rien à faire. Si vous
faites tourner votre propre instance : corepack pnpm --filter sandpay-app run db:migrate.Appliquez chaque modification 'Action requise'
Faites exactement ce que les entrées du changelog indiquent. À partir de
2026-05-30, la seule qui affecte le code existant est : branchez votre
handler webhook sur event (pour que les remboursements/décaissements ne
soient pas confondus avec des collectes) — voir
Récepteur webhook ci-dessous. Tout le reste
est additif et ne nécessite aucune modification.Chemin B — Installer (ou réinstaller) depuis zéro
Étape 0 — Prérequis
- Un compte SandPay + une clé API (
sp_sk_test_…). - Au moins un environnement opérateur configuré dans le tableau de bord
(Paramètres → Pays & opérateurs), ex.
MTN / RW / RWF. - Un secret de signature webhook (affiché dans les paramètres webhook du tableau de bord).
Étape 1 — Variables d’environnement (côté serveur uniquement)
Étape 2 — Installez le client
Authorization: Bearer $SANDPAY_API_KEY vers ${SANDPAY_BASE_URL}/api/v1/…
(hébergé : /v1/…).
Étape 3 — Testez la connectivité + les capacités
api_version, min_sdk_version, et que capabilities liste ce que
vous comptez utiliser (payments, et refunds/disbursements si vous avez besoin
de versements). Détectez les fonctionnalités via cela plutôt qu’en supposant.
Étape 4 — Créez un paiement (collecte : client → marchand)
id retourné (votre provider_ref). Mappez les 11 statuts ;
seul PENDING est non terminal. USER_CANCELLED est terminal (ne pollez
pas indéfiniment).
Voir Vocabulaire des statuts.
Étape 5 — Obtenez le statut final (polling + webhook)
GET /v1/payments/{id} (~toutes les 4s) comme
mécanisme de repli résilient, et le webhook (ci-dessous) comme notification
instantanée. Réconciliez votre grand livre marchand sur net_amount, pas sur
amount (commission opérateur). Voir
Commission & règlement.
Étape 6 — Récepteur webhook
Un petit endpoint sur votre backend vers lequel SandPay envoie des requêtesPOST. Configurez son URL dans le tableau de bord. Il doit :
- Vérifier la signature HMAC en temps constant, échouer fermé si le
secret est absent. L’en-tête est
X-SandPay-Signature: sha256=<hex>sur le corps brut. - Être déployé sans authentification JWT (l’authenticité provient de la signature).
- Associer la transaction par
tx_id(SandPay ne renvoie pas votrereference). - Se brancher sur
event— c’est ce qui piège le plus souvent :
status terminal — vérifiez-le, pas seulement le nom
de l’événement. Voir Webhooks.
Étape 7 — Versements (optionnel : remboursements & décaissements)
Uniquement sicapabilities les inclut (vérifiez au moment de l’exécution) :
Étape 8 — Développement local
Votre URL webhook doit être publiquement accessible, et SandPay envoie les webhooks via Inngest. Donc en local :- Exposez votre backend avec un tunnel stable (domaine réservé ngrok) et
configurez
SANDPAY_BASE_URL/l’URL webhook une seule fois. Voir la configuration du tunnel. - Faites tourner le serveur de développement Inngest de SandPay ou reposez-vous sur le polling (Étape 5) — voir Inngest local vs cloud.
Étape 9 — Checklist finale
- Les variables
SANDPAY_*sont dans l’environnement serveur uniquement ; l’URL de base n’a pas de slash final. - L’environnement opérateur est activé dans le tableau de bord.
- Création de collecte → stocker l’
id; les 11 statuts mappés ;USER_CANCELLEDterminal. - Statut résolu par polling + webhook ; grand livre réconcilié sur
net_amount. - Webhook :
--no-verify-jwt, HMAC en temps constant, associer partx_id, se brancher surevent. - URL webhook + secret configurés dans le tableau de bord (secret identique des deux côtés).
- Versements conditionnés aux
capabilities(si utilisés). - Développement local : tunnel + (serveur Inngest dev ou polling).
-
GET /v1/metarapporte la version attendue après déploiement.
Voir aussi
Guide d'intégration
La référence complète faisant autorité.
Changelog d'intégration
Ce qui a changé par version — et quoi faire.
FAQ d'intégration
Pièges courants + conseils.
Démarrage rapide
Premier paiement en 10 minutes.