dragonbe/vies

使用欧盟委员会的VIES服务验证欧盟增值税号码

安装次数: 2,571,429

依赖: 12

建议者: 0

安全: 0

星标: 266

关注者: 19

分支: 59

开放问题: 8

类型:工具


README

此组件使用PHP和Composer通过欧洲委员会(EC)的增值税信息交换系统(VIES)验证和验证欧盟的增值税注册号码。

Vies类提供向VIES进行SOAP调用的功能,并返回一个包含以下信息的CheckVatResponse对象

  • 国家代码(字符串):国家代码的两位字符表示
  • 增值税注册号码(字符串):包含完整的注册号码,不带国家代码
  • 请求日期(DateTime):请求被提出的日期
  • 有效(布尔值):标志表示注册号码是否有效(TRUE)或无效(FALSE)
  • 名称(字符串):注册公司名称(如果由EC成员国提供)
  • 地址(字符串):注册公司地址(如果由EC成员国提供)

在欧洲委员会网站上声明

要无税进行社区内部供应,您必须确保您供应商品的个人是另一成员国的纳税人员,并且相关商品已离开或将离开您的成员国到另一成员国。发票上还应包含增值税号码。

更多信息请访问 http://ec.europa.eu/taxation_customs/vies/faqvies.do#item16

Actions Status Quality Gate Status

欧盟增值税的GDPR和隐私法规

2018年5月25日,通用数据保护条例(GDPR)在所有28个欧洲成员国生效。这个VIES服务包将符合GDPR要求吗?

简而言之:是的。

更详细的回答是,这个VIES包只与欧洲委员会提供的增值税ID验证服务进行交互。增值税验证在欧洲国家是强制性的,因此这项服务作为合法性和法律依据被允许。请参阅欧洲DPO-3816.1了解更多信息。此服务不存储任何数据,也不收集比法律严格要求的或由EC VIES服务提供的更多信息。

当您在自己的项目中实施此服务包时,请确保您仅存储增值税ID、验证的时间戳、验证的结果以及可选的由EC VIES服务提供的验证ID。

要求

  • 最低PHP版本:7.3
  • 推荐PHP版本:7.4
  • 扩展:soap
  • 扩展:pcntl
  • 扩展:ctype

请阅读发行说明以获取详细信息。

安装

该项目位于Packagist

要安装最新稳定版本,请使用composer require dragonbe/vies

要安装特定版本(例如2.2.0),只需将其添加到上述命令中,例如composer require dragonbe/vies:2.2.0

使用方法

以下是一个使用示例,您可以直接在命令行(或在cron、worker或其他地方)执行,因为这将是您最常用的用例。

1. 设置

<?php

use DragonBe\Vies\Vies;
use DragonBe\Vies\ViesException;
use DragonBe\Vies\ViesServiceException;

require_once dirname(__DIR__) . '/vendor/autoload.php';

$vies = new Vies();

2. 检查VIES服务是否可用

if (false === $vies->getHeartBeat()->isAlive()) {

    echo 'Service is not available at the moment, please try again later.' . PHP_EOL;
    exit(1);
}

如果使用代理,您现在可以使用以下方法

$vies = new Vies();
$options = [
    'proxy_host' => '127.0.0.1',
    'proxy_port' => '8888',
];
$vies->setOptions($options);

$heartBeat = new \DragonBe\Vies\HeartBeat('tcp://' . $options['proxy_host'], $options['proxy_port']);
$vies->setHeartBeat($heartBeat);

$isAlive = $vies->getHeartBeat()->isAlive();

3. 验证增值税

现在我们知道服务可用,我们可以开始验证增值税ID了

3.1. 简单使用

$vatResult = $vies->validateVat(
    'BE',           // Trader country code 
    '0203430576',   // Trader VAT ID
    'BE',           // Requester country code 
    '0811231190'    // Requester VAT ID
);

3.2. 高级使用

$vatResult = $vies->validateVat(
    'BE',                 // Trader country code 
    '0203430576',         // Trader VAT ID
    'BE',                 // Requester country code 
    '0811231190'          // Requester VAT ID
    'B-Rail',             // Trader name
    'NV',                 // Trader company type
    'Frankrijkstraat 65', // Trader street address
    '1060',               // Trader postcode
    'Sint-Gillis'         // Trader city
);

3.3. 结果方法

3.3.1. 增值税识别号是否有效?

最重要的功能是查看增值税识别号是否有效

echo ($vatResult->isValid() ? 'Valid' : 'Not valid') . PHP_EOL;

// Result: Valid
3.3.2. 获取增值税验证标识符
echo 'Identifier: ' . $vatResult->getIdentifier() . PHP_EOL;

// Result: Identifier: WAPIAAAAWaXGj4Ra
3.3.3. 获取验证日期

注意:VIES服务返回日期和时区,但不返回时间

echo 'Date and time: ' . $vatResult->getRequestDate()->format('r') . PHP_EOL;

// Result: Date and time: Sat, 31 Aug 2019 00:00:00 +0200
3.3.4. 获取官方交易者名称(不一定总是可用)
echo 'Company name: ' . $vatResult->getName() . PHP_EOL;

// Result: Company name: NV OR NATIONALE MAATSCHAPPIJ DER BELGISCHE SPOORWEGEN
3.3.5. 获取官方交易者街道(不一定总是可用)
echo 'Company address: ' . $vatResult->getAddress() . PHP_EOL;

// Result: Company address: FRANKRIJKSTRAAT 56
           1060 SINT-GILLIS (BIJ-BRUSSEL)
3.3.6. 获取交易者名称匹配项(不一定总是可用)
echo 'Trader name match: ' . $vatResult->getNameMatch() . PHP_EOL;

// Result: Trader name match:
3.3.7. 获取交易者公司类型匹配项(不一定总是可用)
echo 'Trader company type match: ' . $vatResult->getCompanyTypeMatch() . PHP_EOL;

// Result: Trader company type match:
3.3.8. 获取交易者街道匹配项(不一定总是可用)
echo 'Trader street match: ' . $vatResult->getStreetMatch() . PHP_EOL;

// Result: Trader street match:
3.3.9. 获取交易者邮政编码匹配项(不一定总是可用)
echo 'Trader postcode match: ' . $vatResult->getPostcodeMatch() . PHP_EOL;

// Result: Trader postcode match:
3.3.10. 获取交易者城市匹配项(不一定总是可用)
echo 'Trader city match: ' . $vatResult->getCityMatch() . PHP_EOL;

// Result: Trader city match:

示例代码

<?php

use DragonBe\Vies\Vies;
use DragonBe\Vies\ViesException;
use DragonBe\Vies\ViesServiceException;

require_once dirname(__DIR__) . '/vendor/autoload.php';

$vies = new Vies();

$company = [
   'country_code' => 'BE',
   'vat_id' => '0203430576',
   'trader_name' => 'B-Rail',
   'trader_company_type' => 'NV',
   'trader_street' => 'Frankrijkstraat 65',
   'trader_postcode' => '1060',
   'trader_city' => 'Sint-Gillis',
];

try {
    $vatResult = $vies->validateVat(
        $company['country_code'],        // Trader country code
        $company['vat_id'],              // Trader VAT ID
        'BE',                            // Requester country code (your country code)
        '0811231190',                    // Requester VAT ID (your VAT ID)
        $company['trader_name'],         // Trader name
        $company['trader_company_type'], // Trader company type
        $company['trader_street'],       // Trader street address
        $company['trader_postcode'],     // Trader postcode
        $company['trader_city']          // Trader city
    );
} catch (ViesException $viesException) {
    echo 'Cannot process VAT validation: ' . $viesException->getMessage();
    exit (2);
} catch (ViesServiceException $viesServiceException) {
    echo 'Cannot process VAT validation: ' . $viesServiceException->getMessage();
    exit (2);
}

echo ($vatResult->isValid() ? 'Valid' : 'Not valid') . PHP_EOL;
echo 'Identifier: ' . $vatResult->getIdentifier() . PHP_EOL;
echo 'Date and time: ' . $vatResult->getRequestDate()->format('d/m/Y H:i') . PHP_EOL;
echo 'Company name: ' . $vatResult->getName() . PHP_EOL;
echo 'Company address: ' . $vatResult->getAddress() . PHP_EOL;

echo 'Trader name match: ' . $vatResult->getNameMatch() . PHP_EOL;
echo 'Trader company type match: ' . $vatResult->getCompanyTypeMatch() . PHP_EOL;
echo 'Trader street match: ' . $vatResult->getStreetMatch() . PHP_EOL;
echo 'Trader postcode match: ' . $vatResult->getPostcodeMatch() . PHP_EOL;
echo 'Trader city match: ' . $vatResult->getCityMatch() . PHP_EOL;
echo PHP_EOL;

运行此代码后,您将得到以下结果

Valid
Identifier: WAPIAAAAWaYR0O8D
Date and time: 21/10/2018 02:00
Company name: NV OR NATIONALE MAATSCHAPPIJ DER BELGISCHE SPOORWEGEN
Company address: FRANKRIJKSTRAAT 56
1060 SINT-GILLIS (BIJ-BRUSSEL)
Trader name match:
Trader company type match:
Trader street match:
Trader postcode match:
Trader city match:

社区参与

以下是一些包含此VIES包的产品或项目的列表

如果您有使用此包的产品或项目,并且希望对您的工作进行归功,请发送电子邮件或在我的TwitterFacebook上联系我。

Docker容器

如果您喜欢使用Docker容器,现在可以使用专为该目的设计的容器。

docker run --rm -d -p 8000:18080 dragonbe/vies-web

将浏览器指向localhost:8000以使用验证增值税的Web界面。

A screenshot of VIES web application

在网络上引用

对异常的说明

对于希腊,国际国家ISO代码GR,但对于增值税识别号,他们使用前缀EL。感谢Johan Wilfer报告

自2021年1月1日起,英国不再是欧盟的成员国,因此欧盟委员会提供的VIES服务不再验证英国增值税识别号。但有一个例外,那就是北爱尔兰(XI),可以使用此库和EC VIES服务验证增值税识别号。

许可证

DragonBe\Vies在MIT许可证下发布。有关详细信息,请参阅捆绑的LICENCE文件。