在欧盟内部使用电子支付时,商业客户需要验证增值税号(VAT)。这是因为欧盟的税收法规提供了一种称为反向收费制度的规定,如果客户位于另一个欧盟国家并且能够提供一个有效的增值税号,意味着他是一个商业客户,那么增值税率可能会转嫁给客户。更多信息可以在这里找到。
增值税号的验证是必要的,因为欧盟的税收法规提供了一种称为反向收费制度的规定,如果客户位于另一个欧盟国家并且能够提供一个有效的增值税号,意味着他是一个商业客户,那么增值税率可能会转嫁给客户。更多信息可以在这里找到。
欧洲委员会的税务和海关联盟总司提供了一个Web服务,可以在以下网址找到:http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl。
首先,打开Visual Studio命令提示符。可以在开始菜单下的Microsoft Visual Studio 2010/Visual Studio Tools条目中找到它。浏览到想要创建代理类的目录,并在命令提示符中输入以下命令:
wsdl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
现在应该看到了以下屏幕:
这将创建一个名为checkVatServices.cs的文件,使用欧盟发布的.wsdl文件实现了Web服务代理。现在已经完成了Web服务代理类的创建。快速开发,对吧?
要使用这个类,只需将其导入项目,并添加对System.Web.Services.dll库的引用,这是.NET SDK的一部分。现在可以创建一个checkVatService类的实例并调用它的checkVat(...)方法。
创建的文件实现了一个类对象,其中定义了.wsdl XML定义文件中的方法。此外,还会找到在应用程序中异步实现Web服务的方法。有关Web服务异步使用的更多信息,可以阅读这篇有趣的CodeProject文章。
为了轻松使用这个Web服务,实现了一个包装类以及一个演示项目,以示例展示如何使用。
在本文附加的zip文件中,可以找到一个名为ViesVatCheck的小包装类,当调用其CheckVat()方法时,它会为奥地利增值税号添加一个前导字符。
ViesVatCheck类实现了两个输入和四个输出属性,如下表所示:
属性 | 描述 | 方向 |
---|---|---|
CountryCode | 增值税号的国家代码 | 输入 |
VATNumber | 要检查的增值税号 | 输入 |
Name | 增值税号所属公司的名称 | 输出 |
Address | 公司的地址 | 输出 |
IsValid | 如果增值税号可以验证,则为true,否则为false | 输出 |
RetDate | Web服务返回的请求日期 | 输出 |
第一个输入属性是要检查的增值税号的国家代码。这个属性可以是下面的国家代码之一:
国家 | 国家代码 |
---|---|
奥地利 | AT |
比利时 | BE |
保加利亚 | BG |
如果仔细查看欧盟发布的增值税服务FAQ,会发现其中一些国家并不总是可以像FAQ中Q11所描述的那样检查增值税号。因此,这个服务可以用来预先检查增值税号,但可能仍然需要手动检查无效的增值税号。
要使用包装类,只需下载zip文件并构建VATChecker项目。这将创建一个可以在项目中使用的程序集。此外,演示项目包含一个小型WPF项目,使用ViesVatChecker类。
可以在以下图表中看到演示应用程序的屏幕:
private void button1_Click(object sender, RoutedEventArgs e)
{
if (comboBoxCountries.SelectedItem == null)
{
comboBoxCountries.Focus();
return;
}
if (string.IsNullOrEmpty(textBoxVatNumber.Text))
{
textBoxVatNumber.Focus();
return;
}
ViesVatCheck check = new ViesVatCheck();
check.VATNumber = textBoxVatNumber.Text;
check.CountryCode = ((ComboBoxItem)comboBoxCountries.SelectedItem).Tag.ToString();
bool bValid = check.CheckVat();
if (bValid)
{
imageValid.Visibility = System.Windows.Visibility.Visible;
imageInvalid.Visibility = System.Windows.Visibility.Hidden;
labelAddress.Visibility = System.Windows.Visibility.Visible;
labelCompanyName.Visibility = System.Windows.Visibility.Visible;
labelRequestDate.Visibility = System.Windows.Visibility.Visible;
labelAddress.Content = check.Address;
labelCompanyName.Content = check.Name;
labelRequestDate.Content = check.RetDate.ToShortDateString();
textBoxVatNumber.Text = check.VATNumber;
}
else
{
imageValid.Visibility = System.Windows.Visibility.Hidden;
imageInvalid.Visibility = System.Windows.Visibility.Visible;
labelAddress.Visibility = System.Windows.Visibility.Hidden;
labelCompanyName.Visibility = System.Windows.Visibility.Hidden;
labelRequestDate.Visibility = System.Windows.Visibility.Hidden;
}
}