Skip to main content

Vue d’ensemble

Les paiements peuvent échouer pour diverses raisons. Ce guide vous aide à comprendre les erreurs courantes et comment les gérer dans votre application.

Statuts de paiement

Important : Seules les demandes de paiement (payment_requests) ont un statut. Les liens de paiement (payment_links) n’ont pas de statut. Les demandes de paiement peuvent avoir les statuts suivants :
  • pending : Le paiement est en attente de confirmation
  • success : Le paiement a été effectué avec succès
  • error : Le paiement a échoué
Pour les liens de paiement, utilisez le champ canReceivePayments (booléen) pour vérifier si le lien peut accepter de nouveaux paiements.

Erreurs communes

Lien expiré

Erreur : link_expired ou payment_link_expired Message : “Payment link has expired” Cause : Le lien de paiement a expiré et ne peut plus accepter de paiements. Solution :
  • Vérifiez toujours canReceivePayments avant de diriger un client vers un lien
  • Créez un nouveau lien de paiement si le lien a expiré
  • Informez le client que le lien a expiré et proposez de créer un nouveau lien
Exemple de gestion :

Lien déjà utilisé

Erreur : link_used ou payment_link_already_used Message : “Payment link has already been used” Cause : Le lien de paiement est à usage unique (allowMultiplePayments: false) et a déjà été utilisé pour un paiement réussi. Solution :
  • Vérifiez canReceivePayments avant de diriger un client vers un lien
  • Pour les liens à usage unique, créez un nouveau lien pour chaque paiement
  • Informez le client que le lien a déjà été utilisé
Exemple de gestion :

Demande de paiement non trouvée (404 Not Found)

Erreur : payment_request_not_found Message : “Payment request not found” Cause : La demande de paiement n’existe pas ou n’appartient pas à votre entreprise. Solution :
  • Vérifiez que l’ID de la demande de paiement est correct
  • Vérifiez que la demande appartient à votre entreprise
  • Vérifiez que la demande n’a pas été supprimée

Magasin non trouvé (404 Not Found)

Erreur : store_not_found Message : “Store not found” Cause : Le storeId fourni n’existe pas ou n’appartient pas à votre entreprise. Solution :
  • Vérifiez que le storeId est correct
  • Utilisez l’endpoint /partner_api/stores pour lister vos magasins
  • Assurez-vous que le magasin existe et est actif

Dispositif non trouvé (422 Validation Error)

Erreur : validation_error Message : “The paymentDetails.data.deviceId field is required when paymentDetails.type is soundbox” Cause : Pour les paiements soundbox, le deviceId est requis mais manquant ou invalide. Solution :
  • Vérifiez que le deviceId est fourni pour les paiements soundbox
  • Vérifiez que le deviceId existe via l’endpoint /partner_api/devices
  • Assurez-vous que le dispositif est actif et associé au bon magasin

Erreur de validation (422 Unprocessable Entity)

Erreur : validation_error Message : “Validation error” Cause : Les données fournies ne respectent pas les règles de validation. Problèmes courants :
  • Montant inférieur au minimum (100 centimes pour payment_requests, 10000 centimes pour payment_links)
  • Code devise invalide (doit être ISO 4217, 3 caractères)
  • Référence manquante ou invalide (1-100 caractères)
  • Titre manquant ou invalide pour payment_links (10-255 caractères)
  • URLs de callback invalides (doivent être HTTPS valides)
  • Méthode de paiement invalide
Solution :
  • Vérifiez que tous les champs requis sont présents
  • Vérifiez que les valeurs respectent les contraintes (montant minimum, longueur, format)
  • Vérifiez que les URLs sont valides et utilisent HTTPS

Paiement échoué

Erreur : payment_failed ou transaction_failed Message : “Payment failed” Cause : Le paiement a échoué côté opérateur (Mobile Money ou banque). Solution :
  • Vérifiez que le client a suffisamment de fonds
  • Vérifiez que le compte du client est actif
  • Proposez au client de réessayer
  • Contactez le support si le problème persiste

Clé API invalide (401 Unauthorized)

Erreur : unauthorized Message : “Unauthorized” Cause : Les clés API sont invalides, manquantes ou expirées. Solution :
  • Vérifiez que les en-têtes X-API-KEY et X-API-KEY-ID sont présents
  • Vérifiez que les clés API sont correctes
  • Régénérez vos clés API depuis le Jeko Cockpit si nécessaire

Accès interdit (403 Forbidden)

Erreur : forbidden ou forbidden_action Message : “Forbidden” ou “Action interdite” Cause : La clé API n’a pas la permission d’accéder à cette ressource ou d’effectuer cette action. Solution :
  • Vérifiez les permissions de votre clé API
  • Contactez le support pour vérifier les permissions de votre compte

Conflit de référence (409 Conflict)

Erreur : payment_request_exists_with_reference Message : “Une demande de paiement avec cette référence existe déjà” Cause : Une demande de paiement avec la même référence existe déjà.
Une référence reste consommée même si la transaction associée a échoué, expiré ou été annulée. Si vous réutilisez la référence d’origine pour proposer une nouvelle tentative de paiement à votre client, la création échoue en 409 et le client ne peut plus payer.
Solution :
  • Utilisez des références uniques pour chaque demande de paiement
  • Incluez un identifiant unique (timestamp, UUID, orderId) dans la référence
  • Pour une nouvelle tentative sur une commande existante, ajoutez un suffixe à la référence plutôt que de la réutiliser telle quelle — par exemple CMD-12345-1, puis CMD-12345-2

Gestion des erreurs dans votre application

Vérification préventive

Avant de créer un paiement, effectuez ces vérifications :
  1. Vérifier l’existence du magasin :
  1. Pour les paiements soundbox, vérifier le dispositif :
  1. Pour les liens de paiement, vérifier la disponibilité :

Gestion des erreurs dans le code

Utilisation des webhooks pour le suivi

Configurez des webhooks pour être notifié automatiquement des changements de statut des paiements. Cela vous permet de :
  • Suivre les paiements en temps réel
  • Gérer les échecs automatiquement
  • Mettre à jour votre système lorsque le statut change
Consultez la documentation Webhooks pour plus d’informations.

Bonnes pratiques

  1. Vérifications préventives : Toujours vérifier les prérequis avant de créer un paiement
  2. Gestion d’erreurs robuste : Implémentez une gestion d’erreurs complète pour tous les cas d’échec
  3. Logging : Enregistrez toutes les erreurs pour le débogage et l’analyse
  4. Messages utilisateur : Informez l’utilisateur des erreurs de manière claire et actionnable
  5. Retry logic : Pour les erreurs temporaires, implémentez une logique de réessai avec backoff exponentiel
  6. Monitoring : Surveillez les taux d’échec pour identifier les problèmes récurrents
  7. Vérification des liens : Toujours vérifier canReceivePayments avant de diriger un client vers un lien

Support

Si vous rencontrez des erreurs persistantes ou des problèmes non documentés, contactez le support JEKO à hello@jeko.africa.