FidePay v1.0.4 Support développeur Espace marchand Créer un compte
Prêt à intégrer FidePay ? Créez votre compte marchand, récupérez votre clé publique et commencez dans l’environnement de test.

Introduction

FidePay permet à un marchand d’encaisser par carte, mobile money, lien de paiement, QR code ou wallet. Pour une nouvelle intégration web, utilisez les Checkout Sessions. Pour un traitement strictement serveur à serveur, l’API historique Access token + Make payment reste disponible.

Checkout moderne : https://admin.fide-pay.com/api · API serveur : https://admin.fide-pay.com/api/merchant · Vos clés se trouvent dans l’espace marchand. La clé secrète ne doit jamais être placée dans un navigateur.
Parcours recommandé

Checkout Sessions

Créez une session avec la clé publique, ouvrez l’URL sécurisée retournée par FidePay, puis suivez son statut. Le mode Test de votre espace marchand route automatiquement les nouvelles sessions vers la sandbox.

Avant de passer en production Commencez par POST /api/checkout-sessions. Vérifiez que le marchand possède le wallet du pays et de la devise à encaisser. Utilisez uniquement des domaines HTTPS dans allowed_domains en mode live.

Comment ça marche, étape par étape

1

Créez votre compte marchand

Inscrivez-vous, complétez le profil marchand, puis récupérez votre clé publique et votre clé secrète dans l'espace marchand.

Créer un compte marchand →
2

Activez le mode Test

Basculez votre compte marchand en mode Test. Les nouvelles Checkout Sessions utiliseront automatiquement la sandbox, sans modifier votre intégration.

Comprendre Test et production →
3

Créez une Checkout Session

Appelez POST /api/checkout-sessions avec la clé publique, le montant, la devise et vos domaines autorisés. FidePay renvoie un jeton public et une URL de checkout sécurisée.

Voir Créer une session →
4

Ouvrez le checkout

Redirigez le client vers checkout_url ou utilisez le SDK navigateur en mode superposition ou intégré. Les URL de retour et d’annulation restent sous votre contrôle.

5

Vérifiez le statut

Interrogez GET /api/checkout-sessions/{public_token}/status ou laissez le SDK le faire. Ne considérez pas une simple redirection navigateur comme une preuve de paiement.

Voir l’intégration navigateur →

Choisissez votre façon d'intégrer

Plusieurs chemins mènent au paiement. Démarrez simple, montez en puissance quand vous en avez besoin.

Conseils pratiques

Clé secrète côté serveurStockez-la dans une variable d'environnement. Jamais dans le navigateur, le dépôt Git ou le front.
Vérifiez toujours la signature IPNNe marquez jamais une commande comme payée sans valider le HMAC reçu — c'est votre garde-fou anti-fraude.
Une référence unique par paiementUn transaction_id unique facilite l'idempotence et le rapprochement comptable.
Séparez pays et devisePour XOF et XAF, envoyez toujours country : BJ pour Bénin, CI pour Côte d'Ivoire, GA pour Gabon, CM pour Cameroun.
Répondez 200 rapidement à l'IPNSinon FidePay réessaie. Si le traitement est long, accusez réception puis traitez en asynchrone.

Versions & migration

La documentation conserve le parcours historique, mais toute nouvelle intégration doit utiliser la version actuelle du checkout.

Publié le 10 août 2026
Version actuelle

API v1.0.4

Ajoute les Abonnements : plans récurrents, page de souscription hébergée, prélèvement automatique (solde FidePay sous mandat, carte tokenisée), relance mobile money par lien, et webhooks subscription.*. Entièrement compatible avec les intégrations v1.0.3.

Historique

API v1.0.3

Clés d’API sandbox dédiées et webhooks par environnement (sandbox / production). Toujours fonctionnelle.

Historique

API v1.0.2

Webhooks configurables au niveau du compte et conversion de devise selon le pays du payeur. Toujours fonctionnelle.

Historique

API v1.0.1

Checkout Sessions, checkout hébergé, collecte des informations du payeur et confirmation fiable du paiement. Toujours fonctionnelle.

Historique

API v1.0

Conservée comme référence pour les intégrations existantes. Sa compatibilité avec les nouveaux écrans de checkout n’est plus garantie : migrez et retestez avant toute remise en production.

Nouveautés de la version 1.0.3

Clés d’API sandbox dédiéesChaque compte dispose d’une paire de clés de démonstration, préfixée sandbox_, générée depuis l’espace marchand (Développeurs → Documentation API → onglet Sandbox). Une clé sandbox est refusée sur les endpoints de production, et inversement les endpoints sandbox continuent d’accepter la clé live pour ne pas casser les intégrations écrites avant cette version.
Webhooks par environnementURL, événements et journal séparés pour la sandbox et la production. Les notifications sandbox sont signées avec la clé secrète sandbox — même formule qu’en production.
Nouveaux en-têtes de notificationX-Webhook-Event, X-Webhook-Environment, X-Webhook-Timestamp, X-Webhook-Delivery et X-Webhook-Retry accompagnent désormais chaque envoi. Le corps gagne un champ environment. Purement additif : vos vérifications existantes restent valables.
Webhook de paiement sandboxUn paiement de test mené à son terme déclenche la notification payment.succeeded sur votre URL sandbox — de quoi valider toute la chaîne sans argent réel.
Espace développeursLe tableau de bord regroupe désormais Clé API, Webhooks, Gateway, Couverture des pays, Applications et SDK & plugins.

Nouveautés de la version 1.0.2

Webhooks au niveau du compteEnregistrez une URL de notification une fois pour toutes depuis votre espace marchand, au lieu de transmettre ipn_url à chaque requête. L’ancien paramètre reste prioritaire et pleinement supporté.
Choix des événementsSélectionnez les événements à recevoir parmi payment.succeeded, payment.failed, payment.pending, payout.succeeded, payout.failed, subscription.renewed et subscription.cancelled. Sans sélection, tous sont envoyés.
Journal des livraisonsChaque tentative est tracée : événement, code HTTP, réponse, erreur et horodatage. Une notification échouée peut être relancée en un clic.
Notification de testValidez votre endpoint avant la mise en production, sans créer de vrai paiement.
Conversion selon le pays du payeurLe paramètre currency_mode convertit le montant d’un lien dans la devise du payeur. Voir Devise du payeur.
Signature inchangéeLe schéma reste hmac_sha256(secret_key, transaction_id + total_amount) : aucune modification à apporter à vos vérifications existantes.

Améliorations de la version 1.0.1

  • Le checkout carte collecte le nom, le prénom, l’adresse e-mail, le téléphone et l’adresse de facturation du payeur.
  • Le pays utilise un code ISO à deux lettres et la devise doit être activée pour le marchand et la passerelle choisie.
  • Le consentement aux conditions de paiement est demandé avant l’encaissement.
  • Les informations du payeur peuvent être transmises au partenaire par le statut de session, les métadonnées ou le webhook, selon l’intégration.
  • La réussite doit être confirmée côté serveur par un statut ou un webhook signé, jamais uniquement par la redirection du navigateur.
Migration depuis v1.0 : créez les nouveaux paiements avec POST /api/checkout-sessions, utilisez l’URL checkout_url renvoyée par l’API et ne dépendez jamais de la structure HTML interne du checkout. Les intégrations anciennes doivent être retestées en sandbox avant le passage en production.
Carte bancaire et devises

Le moyen « Carte bancaire » accepte Visa et Mastercard via une page de paiement sécurisée (3D Secure inclus). Le réseau de la carte est détecté automatiquement dans le champ sécurisé — aucune donnée de carte ne transite par FidePay.

Devises actuellement compatibles avec le paiement par carte : AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, ILS, JPY, MXN, NOK, NZD, PLN, RON, SEK, SGD, TRY, USD et ZAR.

Le formulaire carte est identique pour ces 21 devises. Si la carte du payeur est libellée dans une autre devise, sa banque peut effectuer une conversion et appliquer ses propres frais. Les moyens de paiement alternatifs (portefeuilles, virements) sont traités séparément et ne sont pas présentés comme un paiement Visa ou Mastercard.

Test & go live

Test et production sont deux circuits séparés. Pour les Checkout Sessions, le sélecteur Test/Live de l’espace marchand est la source de vérité : en mode Test, les nouvelles sessions sont automatiquement envoyées vers la sandbox. L’API serveur historique conserve aussi ses routes sandbox dédiées.

Circuit sandboxPour tester l'intégration, les webhooks, les pays et les erreurs sans mouvement financier réel.
Circuit productionPour encaisser de vrais clients. Les échecs viennent alors des soldes, opérateurs, limites ou validations réelles.
UsageSandboxProduction
Checkout SessionPOST /api/checkout-sessions avec le compte en mode TestPOST /api/checkout-sessions avec le compte en mode Live
Access tokenPOST /api/merchant/sandbox/access-tokenPOST /api/merchant/access-token
PaiementPOST /api/merchant/sandbox/make-paymentPOST /api/merchant/make-payment
Clé publiquesandbox_… (onglet Sandbox de votre espace)clé live (onglet Production)
WebhooksURL et événements de l’onglet Sandbox, signés avec la clé secrète sandboxURL et événements de l’onglet Production, signés avec la clé secrète live
Clés sandbox dédiées (v1.0.3) : générez une paire de clés de démonstration, préfixée sandbox_, depuis Développeurs → Documentation API → onglet Sandbox. Une clé sandbox est refusée sur les endpoints de production — impossible de mélanger les environnements par erreur. Les endpoints sandbox acceptent encore la clé live pour les intégrations écrites avant la v1.0.3.
Carte test (succès)Visa 4242 4242 4242 4242 ou Mastercard 4242 4242 4242 4242 · date future · CVV libre.
Carte test (échecs)4000 0000 0000 9995 fonds insuffisants · 4532 3367 4387 4205 carte expirée · 4242 4242 4242 4242 échec 3DS (montant ≥ 30 €).
Mobile money testNuméros de test pour les 12 pays couverts : voir Numéros de test. Envoyez 5000, pas 5000.00.
Webhook testUtilisez une URL HTTPS publique et répondez 200.
Page de paiement sandboxUID 12344567890 · mot de passe 12345678. Le paiement validé déclenche payment.succeeded sur votre URL de webhook sandbox.

Diagnostic rapide

Le paiement n'apparaît pas dans le CSV sandboxVérifiez que vous avez appelé /api/merchant/sandbox/make-payment. Si vous avez utilisé /api/merchant/make-payment, le paiement est parti sur le circuit live.
Erreur Bénin / montant invalideLes opérateurs Bénin n'acceptent pas les décimales sur PawaPay. Envoyez 5000 et non 5000.00.
Erreur pays ou mauvais opérateurLe champ country doit correspondre au wallet marchand et au numéro mobile. Exemple : BJ avec un numéro 229....
Webhook non reçuLe navigateur n'est pas la preuve du paiement. La confirmation fiable vient de l'IPN signé ou du contrôle de statut côté serveur.

Numéros de test mobile money

En sandbox, chaque opérateur expose des numéros qui simulent un résultat précis : le paiement aboutit, reste en attente, ou échoue avec un motif donné. Utilisez-les avec POST /api/merchant/sandbox/make-payment ou une Checkout Session en mode Test — si votre intégration passe ces scénarios, elle passera en production. Les tableaux ci-dessous couvrent uniquement les corridors actifs chez FidePay ; ils reprennent les numéros officiels du bac à sable de notre partenaire mobile money.

Rappel : ces numéros concernent les paiements entrants (dépôts). Le montant doit être un entier pour les corridors XOF/XAF (5000, pas 5000.00). Aucun SMS n’est envoyé : la confirmation est simulée automatiquement.
Bénin
OpérateurNuméro de testRésultat simulé
MTN MoMo22951345789Paiement réussi
22951345129Reste en attente
22951345039Refusé par le payeur
22951345029Payeur introuvable
22951345069Échec générique
Moov Money22995345789Paiement réussi
22995345639Reste en attente
22995345679Refusé par le payeur
22995345529Échec générique
Cameroun
OpérateurNuméro de testRésultat simulé
MTN MoMo237653456789Paiement réussi
237653456129Reste en attente
237653456039Refusé par le payeur
237653456029Payeur introuvable
237653456019Plafond payeur atteint
237653456069Échec générique
Congo-Brazzaville
OpérateurNuméro de testRésultat simulé
Airtel Money242053456789Paiement réussi
242053456129Reste en attente
242053456039Refusé par le payeur
242053456049Solde insuffisant
242053456069Échec générique
MTN MoMo242063456789Paiement réussi
242063456129Reste en attente
242063456039Refusé par le payeur
242063456029Payeur introuvable
242063456049Solde insuffisant
242063456069Échec générique
Congo-Kinshasa (RDC)
OpérateurNuméro de testRésultat simulé
Airtel Money243973456789Paiement réussi
243973456129Reste en attente
243973456069Échec générique
Orange Money243893456789Paiement réussi
243893456129Reste en attente
243893456039Refusé par le payeur
243893456029Payeur introuvable
243893456049Solde insuffisant
243893456069Échec générique
M-Pesa (Vodacom)243813456789Paiement réussi
243813456129Reste en attente
243813456039Refusé par le payeur
243813456029Payeur introuvable
243813456049Solde insuffisant
243813456019Plafond payeur atteint
243813456069Échec générique
Côte d'Ivoire
OpérateurNuméro de testRésultat simulé
MTN MoMo2250503456789Paiement réussi
2250503456129Reste en attente
2250503456039Refusé par le payeur
2250503456029Payeur introuvable
2250503456069Échec générique
Orange Money2250734567890Paiement réussi
2250734567130Reste en attente
2250734567030Refusé par le payeur
2250734567060Échec générique
Gabon
OpérateurNuméro de testRésultat simulé
Airtel Money24174345678Paiement réussi
24174345128Reste en attente
24174345048Solde insuffisant
24174345068Échec générique
Kenya
OpérateurNuméro de testRésultat simulé
M-Pesa254703456789Paiement réussi
254703456129Reste en attente
254703456039Refusé par le payeur
254703456049Solde insuffisant
254703456019Plafond payeur atteint
254703456059Transaction déjà en cours
254703456069Échec générique
Ouganda
OpérateurNuméro de testRésultat simulé
Airtel Money256753456789Paiement réussi
256753456129Reste en attente
256753456039Refusé par le payeur
256753456049Solde insuffisant
256753456019Plafond payeur atteint
256753456069Échec générique
MTN MoMo256783456789Paiement réussi
256783456129Reste en attente
256783456029Payeur introuvable
256783456019Plafond payeur atteint
256783456069Échec générique
Rwanda
OpérateurNuméro de testRésultat simulé
MTN MoMo250783456789Paiement réussi
250783456129Reste en attente
250783456039Refusé par le payeur
250783456029Payeur introuvable
250783456019Plafond payeur atteint
250783456069Échec générique
Airtel Money250733456789Paiement réussi
250733456129Reste en attente
250733456039Refusé par le payeur
250733456049Solde insuffisant
250733456069Échec générique
Sénégal
OpérateurNuméro de testRésultat simulé
Orange Money221773456789Paiement réussi
221773456129Reste en attente
221773456029Payeur introuvable
221773456049Solde insuffisant
221773456069Échec générique
Free Money221763456789Paiement réussi
221763456129Reste en attente
221763456049Solde insuffisant
221763456069Échec générique
Sierra Leone
OpérateurNuméro de testRésultat simulé
Orange Money23276123456Paiement réussi
Zambie
OpérateurNuméro de testRésultat simulé
MTN MoMo260763456789Paiement réussi
260763456129Reste en attente
260763456039Refusé par le payeur
260763456029Payeur introuvable
260763456019Plafond payeur atteint
260763456069Échec générique
Zamtel Money260953456700Paiement réussi
260953456789Reste en attente
260953456704Solde insuffisant
260953456712Échec générique

Checkout Sessions

C’est le point d’entrée recommandé pour une nouvelle intégration. Une session contient le montant, la devise, le client, les domaines autorisés et le mode d’exécution. FidePay retourne une URL de paiement hébergée et un jeton public utilisable pour suivre le statut.

POST/api/checkout-sessions
Authentification : envoyez la publishable_key du marchand. Cette clé peut être utilisée par le SDK navigateur. La clé secrète n’est jamais nécessaire pour créer une Checkout Session.
curl -X POST https://admin.fide-pay.com/api/checkout-sessions \
  -H "Content-Type: application/json" \
  -d '{
    "publishable_key": "votre_cle_publique",
    "amount": 25,
    "currency": "EUR",
    "description": "Commande #001",
    "return_url": "https://shop.tld/merci",
    "cancel_url": "https://shop.tld/panier",
    "customer_email": "client@example.com",
    "allowed_domains": ["https://shop.tld"]
  }'
const response = await fetch(
  "https://admin.fide-pay.com/api/checkout-sessions",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      publishable_key: "votre_cle_publique",
      amount: 25,
      currency: "EUR",
      description: "Commande #001",
      return_url: "https://shop.tld/merci",
      cancel_url: "https://shop.tld/panier",
      customer_email: "client@example.com",
      allowed_domains: ["https://shop.tld"]
    })
  }
);

const { data: session } = await response.json();
window.location.assign(session.checkout_url);

Réponse

{
  "status": "success",
  "data": {
    "id": "jeton_public",
    "public_token": "jeton_public",
    "checkout_url": "https://admin.fide-pay.com/checkout/jeton_public",
    "amount": "25.00000000",
    "currency": "EUR",
    "status": "pending",
    "mode": "sandbox",
    "expires_at": "2026-07-28T14:30:00Z"
  }
}

Champs principaux

ChampObligatoireRègle
publishable_keyOuiClé publique d’un marchand approuvé.
amountOuiNombre supérieur ou égal à 0.01.
currencyOuiCode ISO sur 3 lettres pris en charge par FidePay.
allowed_domainsOuiDe 1 à 10 origines, sans joker. HTTPS obligatoire en production.
return_url / cancel_urlNonURL de retour après succès ou annulation.
customer_email, customer_name, customer_phoneNonPréremplissage du checkout. Téléphone au format international.
modeNonlive ou sandbox. Le mode Test du compte marchand force la sandbox.
metadataNonJusqu’à 20 valeurs texte pour votre rapprochement interne.

Suivre le statut

GET/api/checkout-sessions/{public_token}/status

Cette route publique est limitée en fréquence et prévue pour le suivi temporaire du checkout. Les statuts terminaux sont succeeded, failed, cancelled ou expired. Le SDK navigateur l’interroge automatiquement toutes les deux secondes pendant le paiement.

Access token

Échangez la clé publique du marchand contre un token Bearer court. Le token sert ensuite à créer la session de paiement.

POST/api/merchant/access-token
curl -X POST https://admin.fide-pay.com/api/merchant/access-token \
  -H "Content-Type: application/json" \
  -d '{"public_key":"pk_xxx"}'
const res = await fetch("https://admin.fide-pay.com/api/merchant/access-token", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ public_key: "pk_xxx" })
});

const { token } = await res.json();
$ch = curl_init("https://admin.fide-pay.com/api/merchant/access-token");
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
  CURLOPT_POSTFIELDS => json_encode(["public_key" => "pk_xxx"]),
  CURLOPT_RETURNTRANSFER => true,
]);

$token = json_decode(curl_exec($ch))->token;
import requests

r = requests.post(
  "https://admin.fide-pay.com/api/merchant/access-token",
  json={"public_key": "pk_xxx"},
)

token = r.json()["token"]
var client = HttpClient.newHttpClient();
var req = HttpRequest.newBuilder()
  .uri(URI.create("https://admin.fide-pay.com/api/merchant/access-token"))
  .header("Content-Type", "application/json")
  .POST(HttpRequest.BodyPublishers.ofString("{\"public_key\":\"pk_xxx\"}"))
  .build();

var res = client.send(req, HttpResponse.BodyHandlers.ofString());
payload, _ := json.Marshal(map[string]string{
  "public_key": "pk_xxx",
})

req, _ := http.NewRequest(
  "POST",
  "https://admin.fide-pay.com/api/merchant/access-token",
  bytes.NewBuffer(payload),
)
req.Header.Set("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)
using System.Net.Http.Json;

var http = new HttpClient();
var response = await http.PostAsJsonAsync(
  "https://admin.fide-pay.com/api/merchant/access-token",
  new { public_key = "pk_xxx" }
);

var body = await response.Content.ReadFromJsonAsync<TokenResponse>();
var token = body?.Token;
require "net/http"
require "json"

uri = URI("https://admin.fide-pay.com/api/merchant/access-token")
res = Net::HTTP.post(
  uri,
  { public_key: "pk_xxx" }.to_json,
  "Content-Type" => "application/json"
)

token = JSON.parse(res.body)["token"]

Créer un paiement

Créez une session, puis redirigez votre client vers le champ payment_url retourné par l'API. Pour les devises utilisées dans plusieurs pays comme XOF et XAF, le champ country est obligatoire afin d'afficher les bons moyens de paiement.

POST/api/merchant/make-payment
curl -X POST https://admin.fide-pay.com/api/merchant/make-payment \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 5000,
    "currency": "XOF",
    "country": "BJ",
    "transaction_id": "BJXOF260001",
    "description": "Ticket Benin",
    "ipn_url": "https://shop.tld/webhook",
    "callback_url": "https://shop.tld/ok",
    "customer_name": "Alice",
    "customer_email": "alice@exemple.com"
  }'
const pay = await fetch("https://admin.fide-pay.com/api/merchant/make-payment", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + token,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    amount: 5000,
    currency: "XOF",
    country: "BJ",
    transaction_id: "BJXOF260001",
    description: "Ticket Benin",
    ipn_url: "https://shop.tld/webhook",
    callback_url: "https://shop.tld/ok"
  })
});

const { payment_url } = await pay.json();
$ch = curl_init("https://admin.fide-pay.com/api/merchant/make-payment");
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer " . $token,
    "Content-Type: application/json"
  ],
  CURLOPT_POSTFIELDS => json_encode([
    "amount" => 5000,
    "currency" => "XOF",
    "country" => "BJ",
    "transaction_id" => "BJXOF260001",
    "description" => "Ticket Benin",
    "ipn_url" => "https://shop.tld/webhook",
    "callback_url" => "https://shop.tld/ok"
  ]),
  CURLOPT_RETURNTRANSFER => true,
]);

$paymentUrl = json_decode(curl_exec($ch))->payment_url;
pay = requests.post(
  "https://admin.fide-pay.com/api/merchant/make-payment",
  headers={"Authorization": f"Bearer {token}"},
  json={
    "amount": 5000,
    "currency": "XOF",
    "country": "BJ",
    "transaction_id": "BJXOF260001",
    "description": "Ticket Benin",
    "ipn_url": "https://shop.tld/webhook",
    "callback_url": "https://shop.tld/ok",
  },
)

payment_url = pay.json()["payment_url"]
String body = """
{
  "amount": 5000,
  "currency": "XOF",
  "country": "BJ",
  "transaction_id": "BJXOF260001",
  "description": "Ticket Benin",
  "ipn_url": "https://shop.tld/webhook",
  "callback_url": "https://shop.tld/ok"
}
""";

var req = HttpRequest.newBuilder()
  .uri(URI.create("https://admin.fide-pay.com/api/merchant/make-payment"))
  .header("Authorization", "Bearer " + token)
  .header("Content-Type", "application/json")
  .POST(HttpRequest.BodyPublishers.ofString(body))
  .build();
payload := map[string]any{
  "amount": 5000,
  "currency": "XOF",
  "country": "BJ",
  "transaction_id": "BJXOF260001",
  "description": "Ticket Benin",
  "ipn_url": "https://shop.tld/webhook",
  "callback_url": "https://shop.tld/ok",
}

body, _ := json.Marshal(payload)
req, _ := http.NewRequest(
  "POST",
  "https://admin.fide-pay.com/api/merchant/make-payment",
  bytes.NewBuffer(body),
)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)
using System.Net.Http.Headers;
using System.Net.Http.Json;

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", token);

var response = await http.PostAsJsonAsync(
  "https://admin.fide-pay.com/api/merchant/make-payment",
  new {
    amount = 5000,
    currency = "XOF",
    country = "BJ",
    transaction_id = "BJXOF260001",
    description = "Ticket Benin",
    ipn_url = "https://shop.tld/webhook",
    callback_url = "https://shop.tld/ok"
  }
);
require "net/http"
require "json"

uri = URI("https://admin.fide-pay.com/api/merchant/make-payment")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{token}"
req["Content-Type"] = "application/json"
req.body = {
  amount: 5000,
  currency: "XOF",
  country: "BJ",
  transaction_id: "BJXOF260001",
  description: "Ticket Benin",
  ipn_url: "https://shop.tld/webhook",
  callback_url: "https://shop.tld/ok"
}.to_json

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
ChampRègle
amountMontant à encaisser. Pour le Bénin/XOF, envoyez un entier comme 5000, pas 5000.00.
currencyEUR, USD, CDF, XOF, XAF ou devise activée sur le wallet marchand.
countryCode pays ISO-2. Obligatoire pour XOF et XAF afin de charger les bons opérateurs : BJ, CI, GA, CM...
transaction_idRéférence unique côté marchand.
ipn_urlURL serveur qui reçoit la confirmation signée.
callback_urlURL vers laquelle le client revient après paiement.

Webhook IPN

FidePay envoie une notification vers votre ipn_url. Vérifiez la signature avant de marquer la commande comme payée.

Signature : hmac_sha256(secret_key, transaction_id + total_amount). Utilisez la valeur brute reçue dans data[total_amount].
status=success
signature=<hex hmac-sha256>
data[transaction_id]=ORD-001
data[total_amount]=25.50
data[currency]=EUR
data[customer_email]=alice@exemple.com
import crypto from "crypto";

const expected = crypto
  .createHmac("sha256", secretKey)
  .update(data.transaction_id + data.total_amount)
  .digest("hex");

if (crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
  // créditez la commande, répondez 200
}
$expected = hash_hmac(
  "sha256",
  $_POST["data"]["transaction_id"] . $_POST["data"]["total_amount"],
  $secretKey
);

if (!hash_equals($expected, $_POST["signature"])) {
  http_response_code(401);
  exit;
}
import hmac, hashlib

expected = hmac.new(
  secret_key.encode(),
  (data["transaction_id"] + data["total_amount"]).encode(),
  hashlib.sha256
).hexdigest()

if hmac.compare_digest(expected, signature):
  pass  # créditez la commande, répondez 200
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));

byte[] raw = mac.doFinal((transactionId + totalAmount).getBytes());
String expected = HexFormat.of().formatHex(raw);

if (!MessageDigest.isEqual(expected.getBytes(), signature.getBytes())) {
  // return 401
}
mac := hmac.New(sha256.New, []byte(secretKey))
mac.Write([]byte(transactionID + totalAmount))
expected := hex.EncodeToString(mac.Sum(nil))

if !hmac.Equal([]byte(expected), []byte(signature)) {
  // return HTTP 401
}
using System.Security.Cryptography;
using System.Text;

var message = transactionId + totalAmount;
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey));
var expected = Convert.ToHexString(
  hmac.ComputeHash(Encoding.UTF8.GetBytes(message))
).ToLowerInvariant();

if (!CryptographicOperations.FixedTimeEquals(
  Encoding.UTF8.GetBytes(expected),
  Encoding.UTF8.GetBytes(signature)
)) {
  // return HTTP 401
}
require "openssl"

message = "#{transaction_id}#{total_amount}"
expected = OpenSSL::HMAC.hexdigest("SHA256", secret_key, message)

unless Rack::Utils.secure_compare(expected, signature)
  halt 401
end

Moyens de paiement disponibles

Récupérez les moyens réellement activés pour le marchand et le pays du client. Cette route évite d’afficher un opérateur mobile money qui n’est pas disponible dans le corridor demandé.

GET/api/merchant/payment-methods?country=BJ
curl "https://admin.fide-pay.com/api/merchant/payment-methods?country=BJ" \
  -H "Authorization: Bearer VOTRE_ACCESS_TOKEN" \
  -H "Accept: application/json"
Règle pays + devise : le filtrage mobile money utilise le pays du client et les devises disponibles dans les wallets du marchand. Les cartes et wallets internationaux restent proposés lorsqu’ils sont activés et compatibles avec la devise.

Mobile money et moyens de paiement

FidePay connecte les clients, marchands et agents aux moyens de paiement utiles entre l'Europe et l'Afrique : mobile money, carte, lien de paiement, QR et wallet.

Mobile moneyM-Pesa, Orange Money, Airtel Money, MTN selon pays.
CartesVisa, Mastercard et portefeuille virtuel lorsque le service est activé.
WalletSolde client, marchand ou agent avec suivi des transactions.

Pays, devise et opérateurs

Un wallet n'est pas seulement une devise. Pour les zones qui partagent une monnaie, FidePay sépare le pays afin d'afficher les bons opérateurs et d'éviter d'envoyer un client béninois vers un moyen de paiement ivoirien ou gabonais.

Bénincountry: BJ · XOF · MTN MoMo, Moov Money
Côte d'Ivoirecountry: CI · XOF · opérateurs activés localement
Gaboncountry: GA · XAF · opérateurs activés localement
Camerouncountry: CM · XAF · opérateurs camerounais uniquement
RDCcountry: CD · CDF ou USD · Airtel, Orange, Vodacom selon disponibilité
InternationalEUR, USD, cartes et wallet FidePay selon activation du marchand

Webhooks du compte

Depuis la v1.0.2, vous pouvez enregistrer une URL de notification une fois pour toutes depuis votre espace marchand, au lieu de transmettre ipn_url à chaque requête. L’ancien paramètre reste supporté et prioritaire lorsqu’il est fourni : vos intégrations existantes continuent de fonctionner sans modification.

Configurer

Espace marchand → Webhooks. L’URL doit être en HTTPS, car la notification transporte des données de paiement.

MéthodeEndpointRôle
GET/merchant/webhooks?environment=sandbox|liveConfiguration, statistiques et 50 dernières livraisons de l’environnement.
POST/merchant/webhooksEnregistre l’URL et les événements souscrits. Champ environment : live (défaut) ou sandbox.
POST/merchant/webhooks/testEnvoie une notification de test vers l’environnement choisi, sans créer de paiement réel.
POST/merchant/webhooks/{id}/retryRejoue une notification échouée, dans son environnement d’origine.

Sandbox et Production

L’intégration est identique dans les deux environnements. Seules la clé de signature et la configuration changent — votre code de réception, lui, ne change pas.

AspectSandboxProduction
Clé de signatureclé secrète sandbox (sandbox_…)clé secrète live
En-tête X-Webhook-Environmentsandboxlive
Champ environment du corps"sandbox""live"
ConfigurationEspace marchand → Webhooks → onglet SandboxEspace marchand → Webhooks → onglet Production

En-têtes de la requête

En-têteContenu
Content-Typeapplication/json
X-Webhook-EventLe type d’événement, par ex. payment.succeeded.
X-Webhook-Environmentsandbox ou live.
X-Webhook-TimestampHorodatage Unix de l’envoi.
X-Webhook-DeliveryIdentifiant unique de la livraison — utile pour l’idempotence.
X-Webhook-RetryNuméro de tentative (1 = premier envoi).
User-AgentFidePay-Webhook/1.0

Événements disponibles

Sans sélection, tous les événements sont envoyés.

ÉvénementDéclenchement
payment.succeededUn paiement est confirmé.
payment.failedUn paiement a échoué ou a été refusé.
payment.pendingUn paiement est en attente de confirmation.
payout.succeededUn retrait a été exécuté.
payout.failedUn retrait a échoué.
subscription.renewedUn abonnement a été reconduit.
subscription.cancelledUn abonnement a été résilié.

Corps de la notification

{
  "event": "payment.succeeded",
  "status": "success",
  "signature": "<hex hmac-sha256>",
  "environment": "live",
  "data": {
    "transaction_id": "ORD-001",
    "total_amount": "25.50",
    "currency": "EUR"
  },
  "sent_at": "2026-08-08T10:12:04+00:00"
}

Signature

Le schéma est inchangé depuis la v1.0 — vos vérifications existantes restent valables :

hmac_sha256(secret_key, transaction_id + total_amount)

En sandbox, la secret_key est votre clé secrète sandbox ; la formule est identique. Ne marquez jamais une commande comme payée sans avoir validé la signature.

Vérifier la signature — exemples

$payload = json_decode(file_get_contents('php://input'), true);
$secret  = $payload['environment'] === 'sandbox'
    ? getenv('FIDEPAY_SECRET_SANDBOX')   // sandbox_…
    : getenv('FIDEPAY_SECRET_LIVE');

$expected = hash_hmac(
    'sha256',
    $payload['data']['transaction_id'] . $payload['data']['total_amount'],
    $secret
);

if (! hash_equals($expected, $payload['signature'])) {
    http_response_code(401);
    exit;                 // signature invalide : ignorer la notification
}
// Traiter l'événement, puis répondre 200.
const crypto = require("crypto");

app.post("/fidepay/webhook", (req, res) => {
  const payload = req.body;
  const secret = payload.environment === "sandbox"
    ? process.env.FIDEPAY_SECRET_SANDBOX   // sandbox_…
    : process.env.FIDEPAY_SECRET_LIVE;

  const expected = crypto.createHmac("sha256", secret)
    .update(payload.data.transaction_id + payload.data.total_amount)
    .digest("hex");

  const valid = crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(payload.signature));
  if (!valid) return res.status(401).end();

  // Traiter l'événement, puis répondre 200.
  res.json({ received: true });
});
import hmac, hashlib, os

@app.post("/fidepay/webhook")
def fidepay_webhook():
    payload = request.get_json(force=True)
    secret = (os.environ["FIDEPAY_SECRET_SANDBOX"]   # sandbox_…
              if payload["environment"] == "sandbox"
              else os.environ["FIDEPAY_SECRET_LIVE"])

    expected = hmac.new(
        secret.encode(),
        (payload["data"]["transaction_id"] + payload["data"]["total_amount"]).encode(),
        hashlib.sha256,
    ).hexdigest()

    if not hmac.compare_digest(expected, payload["signature"]):
        return "", 401

    # Traiter l'événement, puis répondre 200.
    return {"received": True}

Bonnes pratiques

Répondez viteVotre endpoint a 8 secondes. Si le traitement est long, répondez 200 immédiatement et traitez en tâche de fond.
IdempotenceLa même notification peut arriver plusieurs fois (relance). Utilisez X-Webhook-Delivery pour ignorer les doublons déjà traités.
HTTPS obligatoireLa notification transporte des données de paiement : aucune URL non chiffrée n’est acceptée.
RelanceUn échec (code non-2xx, délai dépassé) est journalisé et relançable en un clic depuis votre espace, dans son environnement d’origine.

Comportement d’envoi

RègleDétail
PrioritéUn ipn_url transmis dans la requête prime sur l’URL du compte.
Délais4 s pour la connexion, 8 s pour la réponse. Un endpoint lent n’impacte jamais le traitement du paiement.
Réponse attendueUn code HTTP 2xx. Toute autre réponse est enregistrée comme un échec, relançable depuis votre espace.
TraçabilitéChaque tentative est journalisée : code HTTP, extrait de réponse, erreur et horodatage.

Abonnements

Facturez vos clients de façon récurrente : vous créez un plan (montant, devise, intervalle, essai gratuit), vos clients s’abonnent, et FidePay déclenche chaque échéance automatiquement. Trois niveaux d’intégration, du zéro code à l’API complète.

Prélèvement automatique : réel uniquement pour le solde FidePay (mandat explicite accepté par le payeur, révocable) et la carte bancaire (méthode tokenisée — aucun numéro de carte ne transite ni n’est stocké chez FidePay). Pour le mobile money, aucun débit sans action du payeur : à chaque échéance, votre client reçoit un e-mail avec un lien de paiement, et l’abonnement avance dès qu’il paie.

1. Sans code : le lien d’abonnement

Créez votre plan dans Dashboard → Abonnements, cliquez « Copier le lien d’abonnement » et placez-le sur votre site. Vos clients arrivent sur une page hébergée FidePay (logos des moyens de paiement, mandat, badge MODE TEST en sandbox) :

GEThttps://admin.fide-pay.com/subscribe/{plan_token}

2. Par API : souscrire depuis votre site

Affichez votre propre formulaire et envoyez la souscription à l’API publique. Le plan_token se trouve sur la carte du plan dans votre dashboard.

POST/api/billing/subscribe
curl -X POST https://admin.fide-pay.com/api/billing/subscribe \
  -H "Content-Type: application/json" \
  -d '{
    "plan_token": "plan_XXXXXXXXXXXXXXXXXXXXXXXX",
    "customer_name": "Awa Diop",
    "customer_email": "awa@example.com",
    "method": "mobile_money"
  }'
const response = await fetch(
  "https://admin.fide-pay.com/api/billing/subscribe",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      plan_token: "plan_XXXXXXXXXXXXXXXXXXXXXXXX",
      customer_name: "Awa Diop",
      customer_email: "awa@example.com",
      method: "mobile_money"
    })
  }
);

const { data } = await response.json();
if (data.subscription.payment_url) {
  // Premier cycle à régler : redirigez vers le lien de paiement.
  window.location.assign(data.subscription.payment_url);
}
<?php
// Laravel / PHP natif — aucune dépendance requise.
$payload = [
    'plan_token' => 'plan_XXXXXXXXXXXXXXXXXXXXXXXX',
    'customer_name' => 'Awa Diop',
    'customer_email' => 'awa@example.com',
    'method' => 'mobile_money',
];

$ch = curl_init('https://admin.fide-pay.com/api/billing/subscribe');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);

$subscription = $response['data']['subscription'];
if (! empty($subscription['payment_url'])) {
    // Premier cycle à régler : redirigez vers le lien de paiement.
    header('Location: ' . $subscription['payment_url']);
    exit;
}
# Django / Flask / FastAPI — avec la librairie requests.
import requests

response = requests.post(
    "https://admin.fide-pay.com/api/billing/subscribe",
    json={
        "plan_token": "plan_XXXXXXXXXXXXXXXXXXXXXXXX",
        "customer_name": "Awa Diop",
        "customer_email": "awa@example.com",
        "method": "mobile_money",
    },
    timeout=15,
)
response.raise_for_status()

subscription = response.json()["data"]["subscription"]
if subscription.get("payment_url"):
    # Premier cycle à régler : redirigez vers le lien de paiement.
    redirect_url = subscription["payment_url"]
// Flutter / Dart — package http.
import 'dart:convert';
import 'package:http/http.dart' as http;

final response = await http.post(
  Uri.parse('https://admin.fide-pay.com/api/billing/subscribe'),
  headers: {'Content-Type': 'application/json'},
  body: jsonEncode({
    'plan_token': 'plan_XXXXXXXXXXXXXXXXXXXXXXXX',
    'customer_name': 'Awa Diop',
    'customer_email': 'awa@example.com',
    'method': 'mobile_money',
  }),
);

final subscription =
    jsonDecode(response.body)['data']['subscription'];
if (subscription['payment_url'] != null) {
  // Premier cycle à régler : ouvrez le lien de paiement
  // (url_launcher ou WebView selon votre app).
  final paymentUrl = subscription['payment_url'];
}

Réponse

{
  "status": "success",
  "data": {
    "subscription": {
      "token": "sub_XXXXXXXXXXXXXXXXXXXXXXXX",
      "status": "pending_payment",
      "current_period_end": null,
      "payment_url": "https://admin.fide-pay.com/pay/TRX..."
    }
  }
}

Champs

ChampObligatoireRègle
plan_tokenOuiJeton public du plan (préfixe plan_), visible dans le dashboard.
customer_emailOuiReçoit la confirmation et les liens d’échéance.
methodOuiwallet, card ou mobile_money.
account_number / account_passwordSi walletIdentifiants du payeur FidePay, vérifiés à la souscription — jamais stockés. En sandbox : 12344567890 / 12345678.
mandate_acceptedSi wallettrue obligatoire : mandat de prélèvement explicite du payeur.
customer_name, customer_phoneNonInformations client optionnelles.
Abonnement par carte : à la souscription, le client est redirigé vers une page de paiement sécurisée (3D Secure) où sa carte est enregistrée de façon tokenisée — elle n'est jamais stockée chez FidePay. Les échéances suivantes sont prélevées automatiquement, avec relances automatiques en cas d'échec (J+1, J+3, J+7). En sandbox, utilisez la carte 4242 4242 4242 4242 (date future, CVC 123) ; 4000 0000 0000 9995 simule un refus et 4000 0000 0000 3220 un parcours 3D Secure.

Statuts d’un abonnement

StatutSignification
trialingEssai gratuit en cours, première facturation en fin d’essai.
activeÀ jour — la prochaine échéance est programmée.
pending_paymentUne échéance attend le paiement du lien (mobile money, premier cycle carte).
past_duePrélèvement échoué, nouvelle tentative sous 24 h (3 tentatives).
unpaid3 échecs consécutifs — l’abonnement est suspendu.
canceledRésilié par vous ou par le client.

3. Webhooks

Chaque événement d’abonnement est envoyé sur l’URL webhook de votre compte, signé comme les webhooks de paiement (voir Webhooks du compte) et séparé par environnement — un plan sandbox n’émet que des webhooks sandbox.

ÉvénementDéclencheur
subscription.renewedUne échéance vient d’être encaissée, la période avance.
subscription.payment_dueÉchéance mobile money : le lien de paiement a été envoyé au client.
subscription.payment_failedPrélèvement échoué (motif et numéro de tentative inclus).
subscription.canceledAbonnement suspendu après 3 échecs ou résilié.

Astuces

AstucePourquoi
Offrez un essai gratuit (trial_days)L'abonnement démarre immédiatement en trialing sans paiement — la première facturation part en fin d'essai. Idéal pour convertir.
Proposez un plan annuel moins cherCréez deux plans (mensuel + annuel avec remise) et placez les deux liens côte à côte : le prélèvement annuel réduit les échecs de paiement.
Écoutez subscription.payment_failedPrévenez votre client dès le premier échec (il reste 2 tentatives automatiques) — la plupart des impayés se règlent avec un simple rappel.
Archivez, ne supprimez pasArchiver un plan bloque les nouvelles souscriptions mais laisse vos abonnés existants continuer — aucun client coupé par erreur.
Privilégiez le solde FidePay en AfriqueC'est le seul prélèvement 100 % automatique sans carte : encouragez vos clients à alimenter leur compte FidePay pour ne jamais rater une échéance.
Un même client, plusieurs abonnementsChaque souscription a son jeton sub_… indépendant : un client peut cumuler plusieurs plans (ex. logiciel + support).
Tester en sandbox : passez votre compte en Mode test, créez un plan (il sera automatiquement sandbox), ouvrez son lien /subscribe/… et abonnez-vous avec le solde de démonstration 12344567890 / 12345678. Aucun argent réel ne circule, et vos webhooks sandbox reçoivent les événements.

Devises

CodeUsageNote
EUREuropeCompte marchand Europe.
USDInternationalWallet principal.
CDFRDCMobile money et agents.
XOFAfrique de l'OuestObligatoire avec country : BJ, CI, SN, etc.
XAFAfrique centraleObligatoire avec country : CM, GA, CG, etc.
KES, RWF, UGX, ZMWAfrique de l'EstSelon les opérateurs activés pour le marchand.
CAD, BRL, GBPInternationalSelon les moyens de paiement activés.

Devise du payeur et conversion automatique

FidePay détecte le pays du payeur à partir de son adresse IP, uniquement pour lui présenter le bon prix et les moyens de paiement disponibles chez lui. Cette détection ne sert à aucun autre usage et le résultat est mis en cache 24 h.

Choix de la devise proposée

La devise retenue est la première, par ordre de préférence du pays, que le marchand peut réellement encaisser — c'est-à-dire pour laquelle il possède déjà un portefeuille. Aucun portefeuille n'est créé automatiquement. À défaut, la devise d'origine du lien est conservée.

Pays du payeurDevises par ordre de préférence
Zone euro (BE, FR, DE, ES, IT, NL, PT, IE, LU, AT)EUR
US · GB · CA · AUUSD · GBP · CAD · AUD
CD — RDCUSD puis CDF
Afrique centrale (CG, CM, GA, TD, CF, GQ)XAF
Afrique de l'Ouest (CI, SN, BJ, BF, ML, NE, TG)XOF
KE · RW · UG · NG · GH · ZA · TZ · ZM · SL · MW · MZDevise nationale correspondante
Pays non listéDevise d'origine du lien

Activer la conversion sur un lien de paiement

La conversion est désactivée par défaut : un lien reste dans la devise choisie à sa création. Pour l'activer, envoyez currency_mode à la création du lien.

ValeurComportement
fixed (défaut)Le montant et la devise restent ceux fixés par le marchand.
automaticÀ l'ouverture du lien, le montant est converti dans la devise du payeur.

Garanties

GarantieDétail
Conversion uniqueElle n'a lieu qu'une seule fois, à la première ouverture. Un rechargement depuis un autre pays ne modifie plus le montant.
Montant d'origine conservéLa devise et le montant de base, le taux appliqué, le pays détecté et l'horodatage restent enregistrés sur la transaction.
Transaction en attente uniquementUn paiement déjà réglé, annulé ou échoué n'est jamais modifié.
Repli sûrSi un taux de change est indisponible, la devise d'origine est conservée plutôt que d'appliquer un montant incertain.
Montant libreUn lien sans montant prédéfini n'est pas converti : le payeur saisit lui-même le montant dans la devise proposée.

Exemple

Un abonnement facturé 10 USD par un marchand possédant les portefeuilles USD, EUR et CDF :

PayeurDevise proposéeMontant affiché
BelgiqueEUR8,70 €
RDCUSD10,00 $
Côte d'Ivoire (marchand sans XOF)USD10,00 $

Les montants dépendent des taux en vigueur au moment de l'ouverture du lien.

SDK officiels

Les kits officiels FidePay couvrent le checkout navigateur, les appels serveur et la vérification des signatures. Téléchargez le kit correspondant à votre environnement et conservez toujours les opérations secrètes côté serveur.

Téléchargeables

Astuce : chaque SDK lit la clé secrète depuis une variable d'environnement (FIDEPAY_SECRET_KEY). Ne la mettez jamais dans un fichier versionné ni côté navigateur — seul le serveur signe les requêtes.

Intégration HTTP native

Pas de SDK pour votre stack ? Le contrat REST ci-dessus suffit. Voici les recettes recommandées par langage.

JV Java java.net.http.HttpClient (JDK 11+) ou OkHttp + Spring Boot. Voir l'exemple →
GO Go net/http + crypto/hmac pour la vérification de signature. Voir l'exemple →
C# C# / .NET HttpClient + ASP.NET. HMACSHA256 natif pour l'IPN. Voir l'exemple →

Intégration navigateur

Le SDK navigateur crée une Checkout Session, ouvre le paiement dans une superposition ou dans un conteneur de votre page, puis suit le statut jusqu’à la fin. Le kit est autonome et ne demande aucune dépendance d’exécution.

import Fidepay from "./fidepay.js";

const fidepay = new Fidepay("votre_cle_publique");

const session = await fidepay.create({
  amount: 25,
  currency: "EUR",
  description: "Commande #001",
  allowedDomains: [window.location.origin],
  returnUrl: "https://shop.tld/merci"
});

fidepay.checkout({
  sessionToken: session.sessionToken,
  mode: "overlay",
  onSuccess: (payment) => console.log("Paiement confirmé", payment),
  onCancel: () => console.log("Paiement annulé"),
  onError: (error) => console.error(error)
});
ModeUsage
overlayOuvre le checkout au-dessus de votre page. C’est le mode recommandé pour démarrer.
inlineMonte le checkout dans un conteneur de votre interface. Indiquez le sélecteur dans container.
RedirectionUtilisez directement la valeur checkout_url si vous ne souhaitez pas charger de SDK.
Sécurité : vérifiez toujours que l’origine courante figure dans allowed_domains. Le SDK utilise uniquement la clé publique et le jeton de session ; ne placez jamais votre clé secrète dans le code livré au navigateur.

Erreurs courantes

CodeCauseAction
400Champ manquant ou invalideContrôlez montant, devise, URLs et référence unique.
401Token invalide ou expiréRegénérez l'access token côté serveur.
409Transaction déjà utiliséeCréez un nouveau transaction_id.
429Trop de requêtesAttendez avant de réessayer et appliquez un délai progressif.
500Erreur temporaireRéessayez avec backoff et contactez le support si besoin.

Support développeur

Pour une intégration marchande, envoyez le pays, les devises, les moyens de paiement souhaités, l'URL IPN et un exemple de transaction.

Supportsupport@fide-pay.com
Espace marchandmerchant.fide-pay.com
Statut servicesfide-pay.com/service-status
Cette page vous a-t-elle été utile ?
FidePayDocumentation développeur