2012-02-06 14 views

Odpowiedz

6

Ta strona internetowa wysyła zwykły formularz HTML do serwera.

Najprostszym rozwiązaniem jest podanie parametrów w adresie URL i użycie file_get_contents, aby uzyskać odpowiedź.

Można następnie przeanalizować odpowiedź, aby uzyskać żądane informacje. Nie testowane, ale przedstawia pomysł:

$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; 
+0

Wielkie dzięki, użyłem funkcji preg_match na $ response, aby porównać, jeśli numer jest ważny. Teraz potrzebuję prawidłowej liczby, aby spróbować, jeśli to naprawdę działa. KOD: jeśli (preg_match ("/ Nie, nieprawidłowy numer VAT/i", "odpowiedź $")) { echo "Nieprawidłowa liczba."; } else { echo "Ważna liczba."; } – Minucioso

+1

To wygląda dość łatwo. Jednak jeśli ich strona internetowa kiedykolwiek się zmieni, to się zepsuje. Czy jest jakiś oficjalny interfejs API? – Johan

+10

@Johan W tym artykule opisano sposób korzystania z usługi internetowej VIES VAT SOAP: http://www.webmastersdiary.com/2011/12/php-vies-vat-number-validation-european.html –

78

Faktycznie, w bazie VIES można przeszukiwać poprzez ich API.
Obsługują tylko protokół SOAP, ale to powinno wystarczyć.

Oto prosty przykład:

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

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

Istnieje wiele dostawców API, które są oparte na oryginalnej, ale dostarczenie go za pomocą różnych protokołów. Mówiąc krótko, zachowują się jak tłumacze - używając json z aplikacją i łączą się przy użyciu SOAP z oryginalnym API. Mają poważny problem z przekroczeniem czasu połączenia.

Są sytuacje, w których baza danych VIES reaguje powoli, co wymaga więcej czasu na odpowiedź. Należy to wziąć pod uwagę przy projektowaniu aplikacji.

+0

I Szukałem oficjalnej dokumentacji na temat tego API, czy mam link do dokumentu? – Pablo

+0

Jeśli otworzysz łącze w przeglądarce, możesz sprawdzić zawartość węzła "xsd: documentation". –

+0

http://ec.europa.eu/taxation_customs/vies/faq.html#item_16 - Q16 zawiera informacje na temat interfejsu SOAP. – kasimir

2

Oto pełna walidacja stos javascript oparte skrypt sprawdzający z regex + modulo danym kraju:

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

Download Link: http://www.braemoor.co.uk/software/downloads/jsvat.zip

Korzystanie webservices nie jest gdzieś opcja.

zobaczyć także porty PHP walidacji VAT UE:

+1

Lepiej użyj https://github.com/se-panfilov/jsvat dla niego - jest to oparte na lib biblioteki Braemoora, ale przepisuj je nowymi standardami i testami, a także dodaj do altówki i npm –

+1

Twoja lib twierdzi, że robi magię matematyczną, aby określić który numer VAT jest ważny, a który nie. Oznacza to, że (a) opiera się na nieoficjalnych algorytmach podatku VAT, ponieważ nie są one oficjalnie publikowane (niektóre są poufne) i mogą stać się przestarzałe; oraz (b) fakt, że numer jest ważny, nie oznacza, że ​​jest on faktycznie asygnowany. Tylko ta oficjalna usługa VIES może to sprawdzić, ponieważ trafia do baz danych państw członkowskich. Nie mówię, że zrobiłeś złą robotę, ale powinieneś być jaśniejszy o ograniczeniach :) –

16

Jeśli z jakichś powodów nie można używać mydła na serwerze (brak, cokolwiek), a następnie file_get_contents jest twoim przyjacielem.

Implementacja poniżej nie zależy od na SOAP, Curl, XMLParser (proste lub nie). Jest to standardowy kod PHP, który powinien działać na dowolnej wersji PHP, którą możesz mieć.

Funkcja zwraca następujące pozycje:

  • CountryCode
  • VATNUMBER
  • requestDate
  • poprawną nazwą
  • adres

Cóż, mam nadzieję, że to pomaga :-)

<?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')); 
?> 
1

Potrzebowałem tego w Ruby, więc tutaj jest mój kod

  • gem install Savon
  • dodać tę metodę do kontrolera

    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 
    
0

Istnieje również API dla bazy danych VIES. https://vatlayer.com/documentation.

Poszukuję pracy związanej z podziałem informacji adresowych. Teraz możesz go zdobyć, ale jest to jeden ciąg.

1

Użyłem usługi REST pod numerem http://vatid.eu, ale ponieważ zostały zablokowane przez VIES (prawdopodobnie ze względu na dużą liczbę żądań), przełączyłem się na http://apilayer.net/.

Bezpłatny abonament to 100 żądań miesięcznie, dlatego zaimplementowałem małą pamięć podręczną i generuję własną tabelę z poprawnymi numerami VAT (z możliwością odnawiania co roku), więc nie wydaje się próśb o sprawdzanie tego samego numeru VAT więcej niż pewnego razu. Pasuje do moich potrzeb;)

+0

FYI jest zablokowana, ponieważ próbują monetyzować dane. Z ToS: "Każda retransmisja zawartości tej strony, czy to w celach komercyjnych, czy w inny sposób [...] jest wyraźnie zabroniona." –

+1

To dziwne ... vatid.eu był darmowy, a teraz są zablokowane. vatlayer.com obecnie zarabiają i działają. Dlaczego to możliwe? – Tarrakis

Powiązane problemy