php - vat - Validación del número de IVA VIES
vat europa (9)
Aquí hay un script de validación basado en javascript de validación de pila completa con regex + módulo por país :
http://www.braemoor.co.uk/software/vat.shtml
Enlace de descarga: http://www.braemoor.co.uk/software/downloads/jsvat.zip
El uso de servicios web en algún momento no es una opción.
También vea los puertos PHP para la validación del IVA de la UE:
¿Alguien sabe cómo incorporar un formulario en nuestro sitio web para validar el VIES? Encuentro información para validarla a través del sitio web de la Unión Europea.
http://ec.europa.eu/taxation_customs/vies/vieshome.do
Y lo que me interesa es validar directamente desde la forma de pago de datos de mi sitio web.
Gracias.
En realidad, la base de datos VIES se puede consultar a través de su API.
Solo admiten el protocolo SOAP, pero eso debería ser suficiente.
Aquí hay un ejemplo simple:
$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl");
var_dump($client->checkVat(array(
''countryCode'' => $countryCode,
''vatNumber'' => $vatNo
)));
Aquí está el WSDL: http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Existen múltiples proveedores de API que se basan en la original, pero la proporcionan utilizando diferentes protocolos. En pocas palabras, actúan como traductores: utilizan json con su aplicación y se conectan utilizando SOAP a la API original. Estos tienen un gran problema con el tiempo de espera de conexión.
Hay momentos en los que la base de datos de VIES está respondiendo lentamente, lo que requiere más tiempo para devolver una respuesta. Esto debe tenerse en cuenta al diseñar su aplicación.
Este es un paquete de compositores, que envuelve el Servicio Web VIES. Puede usar esto de forma rápida y fácil: https://github.com/drahosistvan/vatvalidation
Este sitio web envía un formulario HTML ordinario a un servidor.
La solución más sencilla es pasar los parámetros en la URL y usar file_get_contents para obtener la respuesta.
Luego se puede analizar la respuesta para extraer la información que desee. No probado, pero muestra la idea:
$country1 = ''PL'';
$country2 = ''PL'';
$vatnum1 = ''123456'';
$vatnum2 = ''789012'';
//Prepare the URL
$url = ''http://ec.europa.eu/taxation_customs/vies/viesquer.do?ms=''.$country1.''&iso=''.$country1.''&vat=''.$vatnum1.''&name=&companyType=&street1=&postcode=&city=&requesterMs=''.$country2.''&requesterIso=''.$country2.''&requesterVat=''.$vatnum2.''&BtnSubmitVat=Verify'';
$response = file_get_contents($url);
// Do sth with the response
echo $response;
Necesitaba esto en ruby, así que aquí está mi código
- gema instalar savon
agrega este método a tu controlador
def validateVAT # create a client for the service client = Savon.client(wsdl: ''http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'') response = client.call(:check_vat, message: {countryCode: params[:country_code], vatNumber: params[:vat]}) render json: { valid: response.body[:check_vat_response][:valid] }, status: :ok end
Puede utilizar ahora js lib para la validación del IVA europeo:
Basado en la http://www.braemoor.co.uk/software/vat.shtml , pero reescriba con los estándares de js modernos (braemoor, por ejemplo, use .eval()
) y agregue al registro de bower y npm . También con pruebas unitarias.
bower i jsvat --save
o
npm i jsvat --save
Si por alguna razón no puede usar SOAP en su servidor (no disponible, cualquiera), file_get_contents es su amigo.
La implementación a continuación no depende de SOAP, Curl, XMLParser (Simple o no). Es un código PHP estándar que debería funcionar en cualquier versión de PHP que pueda tener.
La función devuelve los siguientes elementos:
- código de país
- Número de valor agregado
- Fecha de solicitud
- válido
- nombre
- dirección
Bueno, espero que ayude :-)
<?php
DEFINE ( ''VIES_URL'', ''http://ec.europa.eu/taxation_customs/vies/services/checkVatService'' );
/**
* VIES VAT number validation
*
* @author Eugen Mihailescu
*
* @param string $countryCode
* @param string $vatNumber
* @param int $timeout
*/
function viesCheckVAT($countryCode, $vatNumber, $timeout = 30) {
$response = array ();
$pattern = ''/<(%s).*?>([/s/S]*)<///1/'';
$keys = array (
''countryCode'',
''vatNumber'',
''requestDate'',
''valid'',
''name'',
''address''
);
$content = "<s11:Envelope xmlns:s11=''http://schemas.xmlsoap.org/soap/envelope/''>
<s11:Body>
<tns1:checkVat xmlns:tns1=''urn:ec.europa.eu:taxud:vies:services:checkVat:types''>
<tns1:countryCode>%s</tns1:countryCode>
<tns1:vatNumber>%s</tns1:vatNumber>
</tns1:checkVat>
</s11:Body>
</s11:Envelope>";
$opts = array (
''http'' => array (
''method'' => ''POST'',
''header'' => "Content-Type: text/xml; charset=utf-8; SOAPAction: checkVatService",
''content'' => sprintf ( $content, $countryCode, $vatNumber ),
''timeout'' => $timeout
)
);
$ctx = stream_context_create ( $opts );
$result = file_get_contents ( VIES_URL, false, $ctx );
if (preg_match ( sprintf ( $pattern, ''checkVatResponse'' ), $result, $matches )) {
foreach ( $keys as $key )
preg_match ( sprintf ( $pattern, $key ), $matches [2], $value ) && $response [$key] = $value [2];
}
return $response;
}
print_r ( viesCheckVAT ( ''RO'', ''19386256'' ) );
?>
También hay una API para la base de datos VIES. https://vatlayer.com/documentation .
Estoy buscando una solución para dividir la información de la dirección. Ahora puedes conseguirlo pero es una cadena.
Utilicé el servicio REST en http://vatid.eu , pero como fueron bloqueados por VIES (supongo que debido al alto volumen de solicitudes), he cambiado a http://apilayer.net/ .
El plan gratuito es de 100 solicitudes por mes, así que implementé un pequeño caché y generé mi propia tabla de números de IVA válidos (renovables cada año), por lo que no invierto solicitudes para verificar el mismo número de IVA más de una vez. Se adapta a mis necesidades;)