dragonbe72/vies72

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

安装: 0

依赖项: 0

建议者: 0

安全: 0

星星: 0

分支: 0

类型:工具

1 2022-06-08 13:34 UTC

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

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. 验证增值税号

既然我们知道服务是活跃的,我们可以开始验证增值税号

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,但对于增值税IDN,它们使用前缀EL。感谢Johan Wilfer对此报告

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

许可

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