我们有一个支付网关集成,可以将数据发布到第三方网址。然后,用户完成其付款流程,当交易完成时,网关会回发到我们服务器上的URL。
该帖子失败,网关报告以下错误:
错误13326:无法与ServerResultURL [对话。
完整错误详细信息:基础连接已关闭:发送时发生意外错误。
响应对象为空
当我直接发布到# 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;
}
时,我会得到200响应,因此我不确定它会在哪里掉落。
这是在运行nginx的Ubuntu盒子上。
可能导致该问题的原因是什么?如何找到有关该问题的详细信息以及解决问题的方法?
为简洁起见,上面的示例位于{{1}}的网址上,但实际情况是我有重写(见下文)。实际发布到的网址是{{1}},因此我不确定下面的重写是否会导致问题。
我仍然认为不是因为我在通过POSTMAN发布时得到200回复。
{{1}}
答案 0 :(得分:1)
此类错误的典型原因
我敢打赌你的服务器正在使用网关(PaymentSense,对吗?)不期望的东西响应POST到/ bar。这可能是因为:
我会留下前两个项目给你排除故障,因为我认为这不是你在这个问题上所要求的。
对NGINX响应进行疑难解答
我建议将其配置为使用body_filter_by_lua
将其响应转储到nginx变量中,以便您可以看到响应的结果。有一个如何设置它的好例子here。我认为这会让你理解为什么/吧不表现。
对NGINX请求进行疑难解答
如果没有说明原因,请尝试记录请求数据。你可以用以下的东西来做到这一点:
location = /bar {
log_format postdata $request_body;
access_log /var/log/nginx/postdata.log postdata;
fastcgi_pass php_cgi;
}
查看此POST的请求标头和正文,如果错误不明显,请尝试重播完全相同的请求(使用可以完全控制的HTTP客户端,例如curl
)和使用/ bar调试正在发生的事情。当您对/ bar进行相同的POST时,nginx是否正在运行您认为应该运行的脚本/控制器?将日志记录添加到/ bar脚本/控制器进程。
如有必要,请使用交互式调试。 (如果您正在使用PHP,这可能需要远程Xdebug,但无论您在服务器上使用什么,大多数Web应用程序工具都提供某种形式的交互式调试。)
网络疑难解答
如果这些都不起作用,则网关可能无法到达您正在运行此主机和端口,或者您遇到其他类型的网络连接问题。我会在你的Ubuntu盒子上运行tcpdump
来捕获网络流量。如果您可以在安静(网络)系统上重新创建它,那将对您有利。它仍然是TLS(https),所以除了连接打开和数据包到达之外,不要指望看到太多。如果您发现需要查看TLS流量内部以进行故障排除,则可以考虑使用mitmproxy
来执行此操作。