Solución:
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.
He aquí un ejemplo sencillo:
$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
Hay varios proveedores de API que se basan en el original, pero lo proporcionan utilizando diferentes protocolos. En pocas palabras, actúan como traductores: usan json con su aplicación y se conectan usando SOAP a la API original. Estos tienen un problema importante con el tiempo de espera de la conexión.
Hay momentos en los que la base de datos VIES responde lentamente, por lo que requiere más tiempo para devolver una respuesta. Esto debe tenerse en cuenta al diseñar su aplicación.
Si por alguna razón no puede usar SOAP en su servidor (no disponible, lo que sea) entonces file_get_contents es tu amigo.
La implementación a continuación no depende en SOAP, Curl, XMLParser (simple o no). Es un código PHP estándar que debería funcionar en cualquier versión de PHP que tenga.
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).*?>([sS]*)</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' ) );
?>
Este sitio web envía un formulario HTML ordinario a un servidor.
La solución más simple es pasar los parámetros en la URL y usar file_get_contents para obtener la respuesta.
Luego, la respuesta se puede analizar 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;