Nous avons une intégration de passerelle de paiement qui publie des données sur une URL tierce. L’utilisateur termine ensuite son processus de paiement et à la fin de la transaction, la passerelle renvoie une URL sur notre serveur.
Cette publication échoue et la passerelle signale l’erreur suivante:
ERREUR 13326: Impossible de parler à ServerResultURL [ https://foo.com/bar] .
Détails d’erreur complets: la connexion sous-jacente a été fermée: une erreur inattendue s’est produite lors d’un envoi.
- conserver les logs nginx des 30 derniers jours
- Rails / Nginx / Capistrano / Puma: (111: connexion refusée) en se connectant en amont
- Options d’intégration et de déploiement de PingFederate et NGinx
- Comment configurer logrotate de php5-fpm.log?
- Comment exécuter un script après authentification de connexion utilisateur sous Linux
L’object de réponse est null
Lorsque je publie directement sur https://foo.com/bar
je reçois une réponse 200, comme je l’attends, donc je ne suis pas sûr de savoir où cela tombe.
Ceci est sur une boîte Ubuntu exécutant nginx.
Qu’est-ce qui pourrait causer ce problème et comment puis-je trouver plus de détails à ce sujet et comment le résoudre?
Pour des raisons de concision, l’exemple ci-dessus est sur une URL de /bar
mais la réalité est que j’ai une réécriture en place (voir ci-dessous). L’URL qui est réellement publiée est /themes/third_party/cartthrob/lib/extload.php/cardsave_server/result
donc je ne sais pas si la réécriture ci-dessous est ce qui cause un problème.
Je suppose que non, car je reçois une réponse 200 lors de la publication via POSTMAN.
# http://expressionengine.stackexchange.com/questions/19296/404-when-sagepay-attempts-to-contact-cartthrob-notification-url-in-nginx location /themes/third_party/cartthrob/lib/extload.php { rewrite ^(.*) /themes/third_party/cartthrob/lib/extload.php?$1 last; }
Causes typiques de ce type d’erreur
Je parie que votre serveur répond au POST à / bar avec quelque chose que la passerelle (PaymentSense, non?) Ne s’attend pas à. Cela pourrait être parce que:
Je vais laisser les deux premiers éléments pour vous dépanner, car je ne pense pas que ce soit ce que vous demandez dans cette question.
Dépannage des réponses NGINX
Je vous recommande de le configurer pour qu’il vide sa réponse dans une variable nginx à l’aide de body_filter_by_lua
afin que vous puissiez voir quelle réponse sortira. Un bon exemple de la façon de configurer cela est disponible ici . Je pense que cela vous mènera à comprendre pourquoi / bar ne se comporte pas.
Dépannage des requêtes NGINX
Si cela ne révèle pas la cause, essayez de consigner les données de la demande. Vous pouvez le faire avec quelque chose comme:
location = /bar { log_format postdata $request_body; access_log /var/log/nginx/postdata.log postdata; fastcgi_pass php_cgi; }
Examinez les en-têtes et le corps de la requête de ce POST, et si l’erreur n’est pas immédiatement apparente, essayez de relire exactement la même demande (en utilisant un client HTTP qui vous donne un contrôle complet, par exemple curl
) et déboguez ce qui se passe avec / bar . Est-ce que nginx exécute le script / contrôleur que vous pensez qu’il devrait fonctionner lorsque vous créez un POST identique à / bar? Ajoutez la journalisation au script / au processus de contrôleur / bar.
Utilisez le débogage interactif si nécessaire. (Cela peut nécessiter Xdebug à distance si vous travaillez avec PHP, mais peu importe ce que vous utilisez sur votre serveur, la plupart des outils d’application Web proposent une forme de débogage interactif.)
Dépannage réseau
Si rien ne fonctionne, il est possible que la passerelle ne puisse tout simplement pas atteindre l’hôte et le port sur lesquels vous l’exécutez, ou que vous renconsortingez d’autres problèmes de connectivité réseau. Je voudrais lancer tcpdump
sur votre box Ubuntu pour capturer le trafic réseau. Si vous pouvez recréer ceci sur un système silencieux (réseau), ce sera à votre avantage. Cependant, il s’agit de TLS (https), donc ne vous attendez pas à voir autre chose que l’ouverture de la connexion et l’arrivée des paquets. Si vous trouvez que vous devez voir à l’intérieur du trafic TLS pour résoudre le problème, vous pouvez utiliser mitmproxy
pour le faire.