rocketfellows/vies-vat-validation-php-sdk-soap

v2.0.0 2023-12-31 08:58 UTC

This package is auto-updated.

Last update: 2024-08-30 01:50:02 UTC


README

Software License PHPStan Badge Code Coverage Badge

实现了一个接口 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

依赖。

当前实现依赖

VIES增值税号码验证SOAP服务描述。

有关VIES增值税号码验证SOAP服务的更多信息,请参阅: https://ec.europa.eu/taxation_customs/vies/#/technical-information

对于SOAP服务,有三个WSDL可用

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。如果有重大更改,请先打开一个问题进行讨论。

请确保适当地更新测试。