Python实现欧盟VAT自动验证遇问题:SOAP请求返回WSDL而非预期响应
解决VIES VAT验证接口返回WSDL内容的问题
我帮你排查了下当前的问题,核心原因是你把SOAP请求发送到了WSDL描述文件的URL,而非实际处理请求的服务端点。WSDL文件只是用来定义服务结构的文档,并不会接收和处理你的验证请求,所以才会返回整个WSDL页面的内容。
关键修复点
- 修正请求URL:将原代码中的
http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl替换为实际的服务端点地址:http://ec.europa.eu/taxation_customs/vies/services/checkVatService - 修复拼写错误:原代码中
import reqests是拼写错误,应该改为import requests - (可选但推荐)添加SOAPAction头:虽然部分SOAP服务不强制要求,但添加这个头可以提升请求的兼容性
修正后的完整代码
import requests # 修复拼写错误 # 使用实际的SOAP服务端点,而非WSDL文档地址 url = 'http://ec.europa.eu/taxation_customs/vies/services/checkVatService' headers = { 'content-type': 'text/soap+xml', 'SOAPAction': 'urn:ec.europa.eu:taxud:vies:services:checkVat:types/checkVat' } # 你的SOAP请求体保持不变 body= """<?xml version="1.0" encoding="UTF-8" standalone="no"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" > <soapenv:Header/> <soapenv:Body> <urn:checkVat xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types"> <urn:countryCode>NL</urn:countryCode> <urn:vatNumber>800938495B01</urn:vatNumber> </urn:checkVat> </soapenv:Body> </soapenv:Envelope>""" # 发送请求并打印结果 response = requests.post(url, data=body, headers=headers) print(f"请求状态码: {response.status_code}") print("\n响应内容:") print(response.text)
额外注意事项
- 请求频率限制:VIES服务有严格的请求频率限制,如果你需要批量验证多个VAT号,记得在请求之间添加适当的延迟(比如1-2秒),避免被临时限流
- 测试用VAT号:你提供的测试号
DE 147799609、SK 2023661948、CZ 26697131需要去掉空格后再传入请求体,比如DE147799609 - HTTPS支持:如果遇到HTTP连接问题,可以尝试使用HTTPS版本的端点:
https://ec.europa.eu/taxation_customs/vies/services/checkVatService,现在官方更推荐使用HTTPS协议
内容的提问来源于stack exchange,提问作者Petru Tanas
相关产品推荐
相关产品推荐

