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 :
- Vérifier l’existence du magasin :
- Pour les paiements soundbox, vérifier le dispositif :
- 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
- Vérifications préventives : Toujours vérifier les prérequis avant de créer un paiement
- Gestion d’erreurs robuste : Implémentez une gestion d’erreurs complète pour tous les cas d’échec
- Logging : Enregistrez toutes les erreurs pour le débogage et l’analyse
- Messages utilisateur : Informez l’utilisateur des erreurs de manière claire et actionnable
- Retry logic : Pour les erreurs temporaires, implémentez une logique de réessai avec backoff exponentiel
- Monitoring : Surveillez les taux d’échec pour identifier les problèmes récurrents
- 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.