rocketfellows / vies-vat-validation-php-sdk-soap
Requires
- php: >=7.4
- rocketfellows/soap-client-factory: 1.0.0
- rocketfellows/vies-vat-validation-php-sdk-interface: ~1.2.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^8.5
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: 3.6.2
README
实现了一个接口 https://github.com/rocketfellows/vies-vat-validation-php-sdk-interface,用于通过SOAP协议检查增值税号码的有效性。该实现旨在通过SOAP协议向增值税验证服务发送请求并处理响应。
有关通过SOAP协议的VIES增值税号码验证服务的更多信息,请参阅 https://ec.europa.eu/taxation_customs/vies/#/technical-information。
安装。
composer require rocketfellows/vies-vat-validation-php-sdk-soap
依赖。
当前实现依赖
- https://github.com/rocketfellows/soap-client-factory v1.0.0;
- https://github.com/rocketfellows/vies-vat-validation-php-sdk-interface.
VIES增值税号码验证SOAP服务描述。
有关VIES增值税号码验证SOAP服务的更多信息,请参阅: https://ec.europa.eu/taxation_customs/vies/#/technical-information。
对于SOAP服务,有三个WSDL可用
- https://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl 用于验证增值税号码的有效性;
- https://ec.europa.eu/taxation_customs/vies/checkVatTestService.wsdl 通过使用以下值(适用于所有成员国/国家代码)验证与原始服务的集成:
vatNumber值=100,响应= VALID;vatNumber值=200,响应 = INVALID。
VIES增值税号码验证PHP sdk SOAP组件描述。
AbstractVatNumberValidationSoapService - 是一个实现接口 https://github.com/rocketfellows/vies-vat-validation-php-sdk-interface 的抽象类,旨在通过SOAP协议发送增值税验证请求,处理响应/故障,并返回验证结果的对象。
VatNumberValidationSoapService - 是 AbstractVatNumberValidationSoapService 类的继承者,配置为根据wsdl https://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl 发送请求。
VatNumberValidationSoapTestService - 是 AbstractVatNumberValidationSoapService 类的继承者,配置为根据wsdl https://ec.europa.eu/taxation_customs/vies/checkVatTestService.wsdl 发送请求。
VatNumberValidationSoapExpansibleService - 是 AbstractVatNumberValidationSoapService 类的继承者,配置为根据wsdl发送请求,通过类构造函数传递(可定制服务)。
为了创建增值税号码验证结果,此组件使用来自接口包 https://github.com/rocketfellows/vies-vat-validation-php-sdk-interface 的工厂 rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory。根据工厂,如果所需的任何响应属性缺失,则验证过程将抛出特殊异常
CountryCodeAttributeNotFoundException- 在创建VatNumberValidationResult实例时找不到国家代码属性时抛出的异常。RequestDateAttributeNotFoundException- 在创建VatNumberValidationResult实例时找不到请求日期属性时抛出的异常。ValidationFlagAttributeNotFoundException- 在创建VatNumberValidationResult实例时,如果找不到验证标志属性,则会抛出异常。VatNumberAttributeNotFoundException- 在创建VatNumberValidationResult实例时,如果找不到增值税号属性,则会抛出异常。VatOwnerAddressAttributeNotFoundException- 在创建VatNumberValidationResult实例时,如果找不到增值税号所有者地址属性,则会抛出异常。VatOwnerNameAttributeNotFoundException- 在创建VatNumberValidationResult实例时,如果找不到增值税号所有者名称属性,则会抛出异常。
使用示例。
VatNumberValidationSoapService的使用。
增值税号验证结果(增值税号有效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '206223519')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE
VAT number: 206223519
Request date: 2023-12-31+01:00
Is VAT valid: true
VAT holder name: ---
VAT holder address: ---
增值税号验证结果(增值税号无效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '206223511')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE
VAT number: 206223511
Request date: 2023-12-31+01:00
Is VAT valid: false
VAT holder name: ---
VAT holder address: ---
VatNumberValidationSoapTestService的使用。
根据https://ec.europa.eu/taxation_customs/vies/checkVatTestService.wsdl,以下是用于接收每种答案的增值税号列表
- 100 = 有效的请求和有效的增值税号
- 200 = 有效的请求和无效的增值税号
- 201 = 错误:INVALID_INPUT
- 202 = 错误:INVALID_REQUESTER_INFO
- 300 = 错误:SERVICE_UNAVAILABLE
- 301 = 错误:MS_UNAVAILABLE
- 302 = 错误:TIMEOUT
- 400 = 错误:VAT_BLOCKED
- 401 = 错误:IP_BLOCKED
- 500 = 错误:GLOBAL_MAX_CONCURRENT_REQ
- 501 = 错误:GLOBAL_MAX_CONCURRENT_REQ_TIME
- 600 = 错误:MS_MAX_CONCURRENT_REQ
- 601 = 错误:MS_MAX_CONCURRENT_REQ_TIME
对于所有其他情况,该Web服务将以“SERVICE_UNAVAILABLE”错误响应。
以下是一些使用示例。
增值税号验证结果(增值税号有效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapTestService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapTestService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '100')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE VAT number: 100 Request date: 2023-12-31+01:00 Is VAT valid: true VAT holder name: John Doe VAT holder address: 123 Main St, Anytown, UK
增值税号验证结果(增值税号无效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapTestService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapTestService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '200')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE VAT number: 200 Request date: 2023-12-31+01:00 Is VAT valid: false VAT holder name: --- VAT holder address: ---
增值税号验证结果为INVALID_INPUT错误
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapTestService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapTestService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); try { $validationResult = $service->validateVat(VatNumber::create('DE', '201')); } catch (Exception $exception) { var_dump(get_class($exception)); var_dump($exception->getMessage()); }
rocketfellows\ViesVatValidationInterface\exceptions\service\InvalidInputServiceException INVALID_INPUT
增值税号验证结果为IP_BLOCKED错误
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapTestService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapTestService( (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); try { $validationResult = $service->validateVat(VatNumber::create('DE', '401')); } catch (Exception $exception) { var_dump(get_class($exception)); var_dump($exception->getMessage()); }
rocketfellows\ViesVatValidationInterface\exceptions\service\IPBlockedServiceException IP_BLOCKED
VatNumberValidationSoapExpansibleService的使用。
VatNumberValidationSoapExpansibleService - 是 AbstractVatNumberValidationSoapService 类的继承者,配置为根据wsdl发送请求,通过类构造函数传递(可定制服务)。
例如,使用wsdl初始化服务 - https://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl。
增值税号验证结果(增值税号有效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapExpansibleService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapExpansibleService( 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl', (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '206223519')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE VAT number: 206223519 Request date: 2023-12-11+01:00 Is VAT valid: true VAT holder name: --- VAT holder address: ---
增值税号验证结果(增值税号无效)
use rocketfellows\ViesVatValidationInterface\FaultCodeExceptionFactory; use rocketfellows\SoapClientFactory\SoapClientFactory; use rocketfellows\ViesVatValidationInterface\VatNumber; use rocketfellows\ViesVatValidationInterface\VatNumberValidationResultFactory; use rocketfellows\ViesVatValidationSoap\services\VatNumberValidationSoapExpansibleService; require_once __DIR__ . '/vendor/autoload.php'; // Service initialization $service = new VatNumberValidationSoapExpansibleService( 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService.wsdl', (new FaultCodeExceptionFactory()), (new SoapClientFactory()), (new VatNumberValidationResultFactory()) ); $validationResult = $service->validateVat(VatNumber::create('DE', '206223511')); var_dump(sprintf('VAT country code: %s', $validationResult->getCountryCode())); var_dump(sprintf('VAT number: %s', $validationResult->getVatNumber())); var_dump(sprintf('Request date: %s', $validationResult->getRequestDateString())); var_dump(sprintf('Is VAT valid: %s', $validationResult->isValid() ? 'true' : 'false')); var_dump(sprintf('VAT holder name: %s', $validationResult->getName())); var_dump(sprintf('VAT holder address: %s', $validationResult->getAddress()));
VAT country code: DE VAT number: 206223511 Request date: 2023-12-11+01:00 Is VAT valid: false VAT holder name: --- VAT holder address: ---
贡献。
欢迎使用Pull Request。如果有重大更改,请先打开一个问题进行讨论。
请确保适当地更新测试。