Guide
Commande « En attente de paiement » après un paiement Up2pay
Réponse courte
Avec Up2pay e‑Transactions, une commande ne doit passer en « payée » que lorsque la plateforme envoie à votre site une notification serveur à serveur, appelée IPN, et que cette notification est vérifiée. Si la commande reste « En attente de paiement » alors que le client a payé, l’IPN est presque toujours en cause. Soit elle n’est pas arrivée. Soit votre site a répondu par une erreur ou une redirection. Soit un contrôle l’a refusée (signature, référence, montant). Le retour du client sur votre boutique ne suffit pas, et ne doit pas suffire.
Pourquoi le retour du client ne valide pas la commande
Up2pay e‑Transactions est la marque Crédit Agricole de la plateforme Paybox, exploitée par Verifone. Le parcours d’un paiement comprend deux chemins distincts.
- Le navigateur du client. Après le paiement, la plateforme renvoie le client vers l’une des URL de retour transmises dans la demande :
PBX_EFFECTUE(payé),PBX_REFUSE,PBX_ANNULEouPBX_ATTENTE. - La notification serveur à serveur (IPN). La plateforme appelle directement l’URL indiquée dans
PBX_REPONDRE_A, sans passer par le navigateur. Cette URL est prioritaire sur celle enregistrée dans le back-office Vision.
Le manuel d’intégration Paybox System (Verifone, v8.3) précise que l’URL PBX_EFFECTUE « n’est pas sécurisée » et « n’est pas garantie ». Un client peut fermer son onglet avant la redirection. Une personne malveillante peut aussi appeler cette URL à la main. C’est pourquoi une intégration fiable ne change jamais le statut depuis la page de retour : seule l’IPN, dont la signature a été vérifiée, fait foi.
Conséquence directe : si l’IPN manque, la commande reste en attente, même si le client a vu une page « paiement accepté ».
Ce que la plateforme attend de votre site
D’après le manuel Paybox System :
- l’IPN est appelée à chaque tentative de paiement, acceptée ou refusée ;
- elle arrive par défaut en GET ;
- les ports admis côté marchand sont 80, 443 et 8080 à 8085 ;
- votre site doit répondre par une page vide, sans redirection, avec un code HTTP 2xx ;
- tout autre code est considéré comme un échec, et Verifone envoie alors au marchand un e‑mail intitulé « PAYBOX: WARNING!! ».
Ce que votre site doit vérifier
Une IPN n’est prise en compte qu’après plusieurs contrôles :
- la signature RSA : l’IPN est signée par Verifone. Votre site la vérifie avec la clé publique Verifone. Une signature absente ou invalide doit conduire à ignorer l’appel ;
- la référence : la valeur renvoyée doit correspondre à une référence de paiement réellement émise pour cette commande ;
- le montant : le montant renvoyé doit correspondre au montant attendu.
Si l’un de ces contrôles échoue, le statut de la commande ne change pas. C’est voulu : il vaut mieux une commande en attente qu’une commande validée à tort. Une signature invalide ne doit laisser aucune trace dans la commande. Un écart de montant peut y ajouter une note.
Ce que signifie le code réponse
Le code réponse de l’IPN compte aussi :
00000avec un numéro d’autorisation : paiement accepté ;99999: opération en attente de validation par l’émetteur. Une IPN définitive doit suivre. Selon l’extension, la commande peut alors passer au statut « En attente » (on-hold), différent de « En attente de paiement » (pending) ;001xx: refus de la banque (xxest le code banque) ;00006: accès refusé, ou site, rang ou identifiant incorrect.
Un 00000 sans numéro d’autorisation est incohérent selon le manuel : il ne doit pas valider la commande.
Diagnostic pas à pas
- Vérifiez le statut exact. « En attente de paiement » (
pending) signifie qu’aucune IPN valide n’a été traitée. « En attente » (on-hold) peut correspondre à un code99999: attendez l’IPN définitive. - Lisez les notes de la commande. Une note sur un montant incohérent, un refus ou un code inconnu indique que l’IPN est bien arrivée mais a été refusée ou n’a pas validé le paiement.
- Ouvrez les journaux WooCommerce (WooCommerce → État → Journaux) et cherchez l’ID de la commande. Aucune trace d’IPN : la notification n’a pas atteint votre site. Une trace de signature invalide : l’appel a été reçu mais rejeté.
- Cherchez un e‑mail « PAYBOX: WARNING!! ». Il signale que votre site a répondu autre chose qu’un code 2xx à une IPN : erreur serveur, page protégée, redirection, pare-feu.
- Testez l’accessibilité de l’URL IPN depuis Internet. Un site en maintenance, protégé par mot de passe, ou filtré par un pare-feu ou une règle de sécurité ne peut pas recevoir l’appel. Une redirection (par exemple de
httpvershttps, ou vers une autre version du domaine) suffit aussi à faire échouer la notification, puisque la plateforme attend une réponse sans redirection. - Vérifiez l’URL de notification transmise. L’URL envoyée dans
PBX_REPONDRE_Adoit pointer vers le bon domaine. Elle ne doit pas dépasser 150 caractères. - En mode test, vérifiez que votre site est public. Un site de développement sur votre ordinateur n’est pas joignable par la plateforme. Le paiement de test fonctionne, le client revient sur la boutique, mais l’IPN ne peut pas arriver. Il faut un site accessible depuis Internet, ou un tunnel public.
- Regardez si le client a réessayé. Chaque demande de paiement doit porter une référence unique. Après un refus, une nouvelle tentative crée une nouvelle référence. Si les journaux indiquent que la référence reçue n’est pas reconnue, votre extension ne retrouve pas la tentative qui a été payée.
Solution
- L’IPN n’arrive pas : corrigez l’accessibilité de l’URL (maintenance, protection, pare-feu, redirection). Les paiements suivants pourront de nouveau être confirmés par l’IPN. Pour une commande déjà en attente, voir le point « Commande déjà bloquée en attente ».
- L’IPN arrive mais la signature est refusée : vérifiez que votre extension lit la chaîne de requête brute (
$_SERVER['QUERY_STRING']) et non$_GET, dont les valeurs sont décodées. Tout décodage altère les données signées. WordPress ajoute aussi des antislashs à$_SERVER: il faut les retirer avecwp_unslash(), et rien d’autre. Sinon, une IPN correctement signée peut être refusée, par exemple quand une valeur contient une apostrophe, un guillemet ou un antislash non encodés. - Le montant ou la référence ne correspond pas : vérifiez si la commande a été modifiée après la redirection vers la page de paiement. Contrôlez le paiement du côté de la plateforme avant toute action.
- Commande déjà bloquée en attente : une fois le paiement confirmé du côté de la plateforme, vous pouvez changer le statut manuellement dans l’administration WooCommerce, en ajoutant une note qui explique pourquoi.
Prévention
- Testez le parcours complet en mode test, sur un site joignable depuis Internet, et vérifiez que la commande change de statut sans que le client revienne sur la boutique.
- Excluez l’URL de notification des règles de maintenance, de protection par mot de passe et de redirection.
- Surveillez les e‑mails « PAYBOX: WARNING!! » : ils signalent un problème de notification avant que les clients ne s’en plaignent.
- Retestez après chaque changement d’hébergement, de domaine, de certificat ou de pare-feu.
Ce que fait Relqor
Le plugin « Relqor — Gateway for Up2pay e‑Transactions » est indépendant, non affilié à Verifone, Up2pay ou Crédit Agricole. Il suit ces règles :
- l’URL IPN (
?wc-api=relqor_ipn) est transmise dansPBX_REPONDRE_Aà chaque paiement ; - la signature RSA est vérifiée sur la chaîne brute avec les clés publiques Verifone embarquées ; une signature invalide donne une réponse 403 et aucune modification ;
- la référence et le montant sont revérifiés. Une référence inconnue ne change rien et est journalisée en erreur. Un écart de montant ajoute la note « vérification manuelle requise », sans changer le statut ;
- un code
99999fait passer la commande au statut « En attente » (on-hold) en attendant l’IPN définitive ; - une IPN rejouée ne produit rien de plus ;
- sur une commande déjà payée, une IPN de refus, d’annulation ou d’attente ne change pas le statut. Elle est seulement journalisée, avec une note ;
- la page de retour ne change jamais le statut. Tant que l’IPN n’est pas arrivée, elle affiche « Paiement en cours de confirmation ».
Pour aller plus loin : la page Up2pay e‑Transactions pour WooCommerce et la documentation Mode test et production. Voir aussi la fiche d’erreur Commande restée « En attente de paiement ».