VIES 增值税号验证

2022-08-30 13:44:26

如何在我们的网站上加入表格以验证VIES?我通过欧盟网站找到验证它的信息。

http://ec.europa.eu/taxation_customs/vies/vieshome.do

我感兴趣的是直接从我网站上的支付数据形式进行验证。


答案 1

实际上,VIES数据库可以通过其API进行查询。
它们仅支持 SOAP 协议,但这应该足够了。

下面是一个简单的示例:

$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl");
var_dump($client->checkVat(array(
  'countryCode' => $countryCode,
  'vatNumber' => $vatNo
)));

下面是 WSDL:http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

有多个 API 提供程序基于原始提供程序,但使用不同的协议提供它。简单地说,他们就像翻译人员 - 将json与您的应用程序一起使用,并使用SOAP连接到原始API。这些在连接超时方面存在重大问题。

有时,VIES 数据库的响应速度很慢,因此需要更多时间才能返回响应。在设计应用程序时应考虑这一点。


答案 2

如果由于某些原因您无法在服务器上使用 SOAP(没有可用的 SOAP,随便什么),那么file_get_contents就是您的朋友。

下面的实现不依赖于 SOAP、Curl、XMLParser(简单与否)。它是标准的PHP代码,应该适用于您可能拥有的任何PHP版本。

该函数返回以下项:

  • 国家代码
  • 增值税号
  • 请求日期
  • 有效
  • 名字
  • 地址

好吧,我希望它有帮助:-)

<?php
DEFINE ( 'VIES_URL', 'http://ec.europa.eu/taxation_customs/vies/services/checkVatService' );

/**
 * VIES VAT number validation
 *
 * @author Eugen Mihailescu
 *        
 * @param string $countryCode           
 * @param string $vatNumber         
 * @param int $timeout          
 */
function viesCheckVAT($countryCode, $vatNumber, $timeout = 30) {
    $response = array ();
    $pattern = '/<(%s).*?>([\s\S]*)<\/\1/';
    $keys = array (
            'countryCode',
            'vatNumber',
            'requestDate',
            'valid',
            'name',
            'address' 
    );

    $content = "<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
  <s11:Body>
    <tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>
      <tns1:countryCode>%s</tns1:countryCode>
      <tns1:vatNumber>%s</tns1:vatNumber>
    </tns1:checkVat>
  </s11:Body>
</s11:Envelope>";

    $opts = array (
            'http' => array (
                    'method' => 'POST',
                    'header' => "Content-Type: text/xml; charset=utf-8; SOAPAction: checkVatService",
                    'content' => sprintf ( $content, $countryCode, $vatNumber ),
                    'timeout' => $timeout 
            ) 
    );

    $ctx = stream_context_create ( $opts );
    $result = file_get_contents ( VIES_URL, false, $ctx );

    if (preg_match ( sprintf ( $pattern, 'checkVatResponse' ), $result, $matches )) {
        foreach ( $keys as $key )
            preg_match ( sprintf ( $pattern, $key ), $matches [2], $value ) && $response [$key] = $value [2];
    }
    return $response;
}

print_r ( viesCheckVAT ( 'RO', '19386256' ) );
?>