1

这是我遇到的服务器设置/问题:

  • SOAP 已安装并在服务器上运行
  • 使用 PHP SOAP 扩展 ( new SoapClient(self::VAT_VALIDATION_WSDL_URL)) 进行调用
  • 我使用的 WSDL URL 是:http: //ec.europa.eu/taxation_customs/vies/services/checkVatService ?wsdl
  • 相同的代码可以在大多数其他机器上运行,但不能在当前机器上运行
  • SOAP响应是request_success => bool(false),所以请求没有成功
  • 例如,尝试使用 telnet 连接到 url 会导致 503 内部服务器错误,而从其他计算机会导致 502 Permission Denied。
4

2 回答 2

8

这里的问题很难追踪,但很容易解决。

ec.europa.eu接受IPv6请求,并使用 IPv6 响应它们。问题是并非所有服务都可以在 IPv6 上正常工作。因此,如果您的服务器同时使用 IPv4 和 IPv6,它会更喜欢使用 IPv6,因此 SOAP 请求将失败。

例如:

WKT-03:~$ ping6 ec.europa.eu #not working
connect: Network is unreachable

WKT-03:~$ ping ec.europa.eu #working
PING ec.europa.eu (147.67.136.103) 56(84) bytes of data.

解决方案:

有两种解决方案,要么在服务器上禁用 ipv6 ,要么在其中添加新规则/etc/hosts

147.67.136.103 ec.europa.eu # when/if IP changes, this stops working

从而迫使它使用 IPv4。两者都不是很优雅,但这应该可以在 API 与 IPv6 完全兼容之前工作。

于 2013-03-25T13:59:56.170 回答
-2

SoapClient 有一个stream_context选项。

  1. 以您的 IPV4 接口为目标stream_context进行创建bindto
  2. 在 SoapClient 中使用此上下文。

例子:

$opts = array(
    'socket' => array(
        'bindto' => 'IP4_ADDRESS_OF_YOUR_SERVER:0'
    )
);
$context = stream_context_create($opts);
$client = new SoapClient(self::VAT_VALIDATION_WSDL_URL,
    array(
        'stream_context' => $context
    )
);
于 2014-06-12T13:10:55.973 回答