web-dev-qa-db-fra.com

Validation du numéro de TVA VIES

quelqu'un connaît un moyen d'incorporer un formulaire sur notre site Web pour valider le VIES? Je trouve des informations pour le valider sur le site de l'Union européenne.

http://ec.europa.eu/taxation_customs/vies/vieshome.do

Et ce qui m'intéresse c'est de valider directement à partir du formulaire de données de paiement de mon site internet.

Merci.

25
Minucioso

Ce site Web envoie un formulaire HTML ordinaire à un serveur.

La solution la plus simple est de passer les paramètres dans l'URL et d'utiliser file_get_contents pour obtenir la réponse.

La réponse peut ensuite être analysée pour extraire les informations souhaitées. Non testé, mais montre l'idée:

$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;
5
Mariusz Jamro

En fait, la base de données VIES peut être interrogée via leur API.
Ils ne prennent en charge que le protocole SOAP, mais cela devrait être suffisant.

Voici un exemple simple:

$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl");
var_dump($client->checkVat(array(
  'countryCode' => $countryCode,
  'vatNumber' => $vatNo
)));

Voici le WSDL: http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Il existe plusieurs fournisseurs d'API qui sont basés sur celui d'origine, mais le fournissent à l'aide de protocoles différents. En termes simples, ils agissent comme des traducteurs - en utilisant json avec votre application et en vous connectant en utilisant SOAP à l'API d'origine. Ceux-ci ont un problème majeur avec le délai de connexion.

Il y a des moments où la base de données VIES répond lentement, nécessitant ainsi plus de temps pour renvoyer une réponse. Cela doit être pris en compte lors de la conception de votre application.

91
Nikola Petkanski

Si pour certaines raisons vous ne pouvez pas utiliser SOAP sur votre serveur (non disponible, peu importe)), alors file_get_contents est votre ami.

L'implémentation ci-dessous ne dépend pas de SOAP, Curl, XMLParser (Simple ou non). Il s'agit du code standard PHP qui devrait fonctionner sur toutes les versions PHP que vous pourriez avoir).

La fonction renvoie les éléments suivants:

  • code postal
  • numéro de TVA
  • date de la demande
  • valide
  • nom
  • adresse

Eh bien, j'espère que ça aide :-)

<?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' ) );
?>
23
Eugen Mihailescu

Voici un script de validation basé sur javascript de validation complète de la pile avec regex + modulo par pays :

http://www.braemoor.co.uk/software/vat.shtml

Lien de téléchargement: http://www.braemoor.co.uk/software/downloads/jsvat.Zip

L'utilisation de services Web n'est parfois pas une option.

Voir également PHP ports pour la validation de la TVA UE:

3
lubosdz

Vous pouvez maintenant utiliser js lib pour la validation de la TVA européenne:

jsvat - petite bibliothèque pour vérifier la validité du numéro de TVA de l'UE

Basé sur lib de cuve de braemoor , mais réécrivez avec les standards js modernes (braemoor, pour exapmpe, utilisez .eval()) et ajouté à bower et npm registre. Également avec des tests unitaires.

bower i jsvat --save

ou

npm i jsvat --save

2
Sergei Panfilov

J'en avais besoin dans Ruby, alors voici mon code

  • gem install savon
  • ajoutez cette méthode à votre contrôleur

    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
    
1
Ivan Stojkovic

Il s'agit d'un package composer, qui enveloppe le service Web VIES. Vous pouvez l'utiliser rapidement et facilement: https://github.com/drahosistvan/vatvalidation

1
ISTI

J'ai utilisé le service REST sur http://vatid.e , mais comme ils ont été bloqués par VIES (je suppose en raison du volume élevé de demandes), j'ai basculé sur http://apilayer.net/ .

Le plan gratuit est de 100 demandes par mois, j'ai donc mis en place un petit cache et je génère ma propre table de numéros de TVA valides (renouvelable chaque année), donc je ne passe pas de demandes à vérifier le même numéro de TVA plus d'une fois. Convient à mes besoins;)

1
Tarrakis

Il existe également une API pour la base de données VIES. https://vatlayer.com/documentation .

Je recherche un moyen de diviser les informations d'adresse. Maintenant, vous pouvez l'obtenir, mais c'est une chaîne.

0
Wouter Schoofs