VIES VAT api SOAP错误ipv6

时间:2013-03-25 13:59:56

标签: php soap ipv6

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

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

2 个答案:

答案 0 :(得分: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.

<强>解决方案:

disable ipv6 on the server有两种解决方案,或者在/etc/hosts中添加新规则:

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

因此迫使它使用IPv4。两者都不是很优雅,但这应该有效,直到API完全适用于IPv6。

答案 1 :(得分:-2)

SoapClient有一个stream_context选项。

  1. 使用针对您的IPV4界面的stream_context创建bindto
  2. 在SoapClient中使用此上下文。
  3. 示例:

    $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
        )
    );