dragonbe72 / vies72
使用欧盟委员会的VIES服务验证欧盟增值税号码
Requires (Dev)
- ext-pcntl: *
- enlightn/security-checker: ^1.2
- infection/infection: ^0.25
- pdepend/pdepend: ^2.5
- phing/phing: ^2.16
- phploc/phploc: ^7.0
- phpmd/phpmd: ^2.6
- phpunit/php-invoker: ^3.1
- phpunit/phpunit: ^9.4
- sebastian/phpcpd: ^6.0
- squizlabs/php_codesniffer: ^3.2
This package is not auto-updated.
Last update: 2024-09-26 22:26:49 UTC
README
使用PHP和Composer的组件,通过欧盟委员会(EC)的增值税信息交换系统(VIES)验证和验证欧盟增值税登记号码。
Vies
类提供了通过VIES进行SOAP调用的功能,并返回一个包含以下信息的 CheckVatResponse
对象:
- 国家代码(字符串):国家代码的2字符表示
- 增值税登记号码(字符串):包含完整的登记号码,不包含国家代码
- 请求日期(DateTime):请求进行的日期
- 有效(布尔值):表示登记号码是否有效(TRUE)或无效(FALSE)的标志
- 名称(字符串):注册公司名称(如果由EC成员国提供)
- 地址(字符串):注册公司地址(如果由EC成员国提供)
在欧洲委员会网站上声明
为了在不收取增值税的情况下进行社区内部供应,您应确保您供应货物的接收者是另一成员国的纳税者,并且相关货物已离开或将离开您的成员国前往另一个MS。发票上还应包含增值税号码。
更多信息请参阅 http://ec.europa.eu/taxation_customs/vies/faqvies.do#item16
欧盟增值税的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. 验证增值税号
既然我们知道服务是活跃的,我们可以开始验证增值税号
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包的产品或项目的列表
如果您有使用此包的产品或项目,并且希望对您的工作进行一些认可,请给我发送一封电子邮件或在Twitter或Facebook上联系我。
Docker容器
如果您喜欢使用Docker容器,您现在可以使用为该目的设计的容器。
docker run --rm -d -p 8000:18080 dragonbe/vies-web
将浏览器指向localhost:8000以使用验证增值税的Web界面。
网络引用
关于异常的说明
对于希腊,国际国家ISO代码是GR,但对于增值税IDN,它们使用前缀EL。感谢Johan Wilfer对此报告。
自2021年1月1日起,英国不再是欧盟的成员,因此欧盟委员会提供的VIES服务不再验证英国的增值税号。但有一个例外,即北爱尔兰(XI),可以使用此库和EC VIES服务验证增值税号。
许可
DragonBe\Vies在MIT许可证下发布。有关详细信息,请参阅捆绑的LICENCE文件。