dragonbe / vies
使用欧盟委员会的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
- dev-master
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.0
- 2.1.x-dev
- 2.1.14
- 2.1.13
- 2.1.12
- 2.1.11
- 2.1.10
- 2.1.9
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.x-dev
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.0.x-dev
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-Brexit/throwing-exception-for-brexit-validation
- dev-rewrite-3.0.0
- dev-cli-client
- dev-issue-64/using-vies-test-service
- dev-issue-99/optional-arguments-fail-if-non-latin
- dev-issue-78/allow-heartbeat-check-over-proxy
- dev-michelangelo/issue-60-warning-for-not-defined-soap-version
This package is auto-updated.
Last update: 2024-09-05 18:41:24 UTC
README
此组件使用PHP和Composer通过欧洲委员会(EC)的增值税信息交换系统(VIES)验证和验证欧盟的增值税注册号码。
Vies
类提供向VIES进行SOAP调用的功能,并返回一个包含以下信息的CheckVatResponse
对象
- 国家代码(字符串):国家代码的两位字符表示
- 增值税注册号码(字符串):包含完整的注册号码,不带国家代码
- 请求日期(DateTime):请求被提出的日期
- 有效(布尔值):标志表示注册号码是否有效(TRUE)或无效(FALSE)
- 名称(字符串):注册公司名称(如果由EC成员国提供)
- 地址(字符串):注册公司地址(如果由EC成员国提供)
在欧洲委员会网站上声明
要无税进行社区内部供应,您必须确保您供应商品的个人是另一成员国的纳税人员,并且相关商品已离开或将离开您的成员国到另一成员国。发票上还应包含增值税号码。
更多信息请访问 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. 验证增值税
现在我们知道服务可用,我们可以开始验证增值税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包的产品或项目的列表
如果您有使用此包的产品或项目,并且希望对您的工作进行归功,请发送电子邮件或在我的Twitter或Facebook上联系我。
Docker容器
如果您喜欢使用Docker容器,现在可以使用专为该目的设计的容器。
docker run --rm -d -p 8000:18080 dragonbe/vies-web
将浏览器指向localhost:8000以使用验证增值税的Web界面。
在网络上引用
对异常的说明
对于希腊,国际国家ISO代码为GR,但对于增值税识别号,他们使用前缀EL。感谢Johan Wilfer的报告。
自2021年1月1日起,英国不再是欧盟的成员国,因此欧盟委员会提供的VIES服务不再验证英国增值税识别号。但有一个例外,那就是北爱尔兰(XI),可以使用此库和EC VIES服务验证增值税识别号。
许可证
DragonBe\Vies在MIT许可证下发布。有关详细信息,请参阅捆绑的LICENCE文件。