Aller au contenu principal

Gestion des erreurs

L'API utilise les codes HTTP standard. Le paiement direct renvoie en plus un code d'erreur stable, à tester dans votre programme plutôt que le message :

{"error": {"code": "invalid_amount", "message": "Le montant doit être compris entre 100 et 2000000.", "minimum": 100, "maximum": 2000000}}

Les autres points d'accès renvoient {"detail": "…"}, ou une liste d'erreurs par champ :

{"fixed_amount": ["Obligatoire quand le montant est fixe (is_amount_fixed=true)."]}

Codes de réponse​

HTTPCodeCauseQue faire
200 201SuccèsLire la réponse
202Paiement en attente de confirmationAttendre le webhook
400invalid_requestChamp manquant ou mal formé (détail dans details)Corriger la requête
400invalid_amountMontant hors limitesRespecter minimum et maximum
400invalid_phoneNuméro invalide pour le paysVérifier le numéro et dial_code
400invalid_providerMoyen de paiement inconnu ou inactifUtiliser un moyen actif de votre projet
400otp_requiredCode OTP absent (Orange, Sank)Demander le code au client
401authentication_failedClé absente, invalide ou désactivéeVérifier X-Api-Key
402Paiement refusé par l'opérateurAfficher message au client
403Adresse IP non autorisée, ou action réservée à votre espaceVérifier vos adresses IP autorisées
404Ressource introuvable ou d'un autre projetVérifier l'identifiant
409idempotency_conflictRequête avec la même Idempotency-Key encore en coursRéessayer quelques secondes plus tard
422idempotency_key_reusedMême Idempotency-Key, autre contenuNouvelle clé pour un nouveau paiement
429Trop de requêtesAttendre Retry-After secondes
500payment_unrecordedPaiement transmis à l'opérateur mais non enregistréNe pas renvoyer : contacter le support
502provider_errorOpérateur injoignable, aucun débitRenvoyer avec la même Idempotency-Key

Exemple de traitement​

errors.py
class IntegralPayError(Exception):
def __init__(self, status, code, message):
super().__init__(message)
self.status, self.code, self.message = status, code, message


def call(method, path, **kwargs):
resp = session.request(method, f"{API_BASE}{path}", timeout=30, **kwargs)
if resp.status_code < 400 or resp.status_code == 402:
return resp.status_code, resp.json() # 402 : paiement refusé, réponse normale à afficher
data = resp.json() if resp.headers.get("Content-Type", "").startswith("application/json") else {}
error = data.get("error") or {}
raise IntegralPayError(resp.status_code, error.get("code", ""), error.get("message") or data.get("detail") or str(data))