Guides pratiques

Du premier appel à la production.

Des guides courts, en français, qui reflètent l’API réelle — pas de la théorie. Chacun est faisable en sandbox, gratuitement.

Votre premier paiement Mobile Money

Créez un compte, récupérez votre clé sk_test_, puis encaissez. En sandbox, un numéro finissant par 0 réussit, par 1 échoue.

curl -X POST https://api.goropay.com/v1/payments \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: commande-42" \
  -d '{"amount":10000,"currency":"XOF",
       "payment_method":{"type":"mobile_money","operator":"mtn","phone":"+2290197000001"}}'

Encaisser sur WhatsApp (liens + QR)

Générez un lien de paiement partageable ; la réponse contient aussi un QR Code prêt à imprimer pour l’encaissement en présentiel.

const link = await goro.paymentLinks.create({
  amount: 5000, currency: 'XOF', description: 'Sandales artisanales',
});
// link.url  → https://.../pay/lnk_...   (à partager)
// link.qr   → data:image/png;base64,... (à afficher)

Checkout hébergé, pensé mobile

Une page de paiement hébergée avec success_url / cancel_url. La session gère l’anti-double-encaissement et la reprise après un échec.

const s = await goro.checkout.sessions.create({
  amount: 25000, currency: 'XOF',
  success_url: 'https://boutique.bj/merci',
  cancel_url:  'https://boutique.bj/panier',
});
// redirigez le client vers s.url

Factures & abonnements (avec relances)

Émettez des factures numérotées, ou des abonnements récurrents. En cas d’échec de prélèvement, le dunning relance automatiquement puis annule.

await goro.subscriptions.create({
  customer_name: 'Kofi', customer_phone: '+2290190000000',
  operator: 'mtn', amount: 9900, currency: 'XOF', interval: 'month',
});

Payouts & réversements (à l’unité ou en masse)

Reversez votre solde vers n’importe quel Mobile Money. Le batch traite bourses et salaires ; chaque ligne a sa propre garde anti-découvert.

await goro.payouts.batch([
  { amount: 50000, currency: 'XOF', destination: { operator: 'mtn',  phone: '+2290190000001' } },
  { amount: 45000, currency: 'XOF', destination: { operator: 'moov', phone: '+2290190000002' } },
]);

Marketplaces (Connect) & séquestre (Protect)

Orchestrez l’encaissement pour plusieurs vendeurs et la répartition automatique instruite (votre commission reste). Ou orchestrez un séquestre : le paiement est bloqué puis libéré à la confirmation de livraison ; la détention effective des fonds relève d’un établissement agréé partenaire.

Webhooks signés & idempotence

Chaque événement est signé en HMAC-SHA256 (en-tête Goropay-Signature) et rejoué jusqu’à 72 h. Vérifiez la signature avant d’agir ; utilisez une clé d’idempotence sur chaque requête sensible.

Passer en production (KYB + live)

Soumettez vos pièces (RCCM, IFU) depuis le dashboard. Une fois validé, votre mode live s’active et vos clés sk_live_ sont débloquées.

Payouts en masse par CSV

Bourses, salaires, remboursements groupés : envoyez un lot de reversements en une requête. Chaque ligne a sa propre garde anti-découvert ; une ligne en échec n’interrompt pas le lot.

await goro.payouts.batch([
  { amount: 50000, currency: 'XOF', destination: { operator: 'mtn',  phone: '+2290190000001' } },
  { amount: 45000, currency: 'XOF', destination: { operator: 'wave', phone: '+2290190000002' } },
]);
// → { total, submitted, errored, results }

Vérifier une signature de webhook

Chaque webhook porte un en-tête Goropay-Signature (HMAC-SHA256). Recalculez la signature avec votre secret et comparez en temps constant avant d’agir — puis dédupliquez sur Goropay-Event-Id.

Reçus clients automatiques

Sur chaque paiement réussi, GoroPay envoie un reçu au payeur sur son numéro (activé par défaut, désactivable). Vos clients sont rassurés sans effort d’intégration.

Les 5 réseaux Mobile Money

MTN, Moov, Celtiis, Orange et Wave partagent le même objet payment_method. Changez d’opérateur sans changer une ligne de code — et testez chacun en sandbox.