Antwort #23 am: 19. August 2011, 15:52:40
@ostermann: Den Beitrag konntest du leider nicht lesen, da er nicht im öffentlichen Teil des Forums gepostet wurde - mein Fehler.
Meine Lösung funktioniert nur, wenn dein PHP mit SOAP kompiliert wurde!
(Das ist zwar von Webhoster zu Webhoster unterschiedlich, ist aber ab PHP5 standardmäßig dabei!)
Anbei das Coding, mit dem ich bisher meine UstIDs teste:
<?php //error_reporting(E_ALL); echo validate_vatid
('DE / 247680236', 'DE'); echo '<br>'; echo validate_vatid
('ATU 56292906', 'AT'); function validate_vatid
($vat_id, $country_id) { $results = array (0 => '0', 1 => '1', 8 => '8', 9 => '9'); //0 = 'false', 1 = 'true', 8 = 'unknown country', 9 = 'unknown algorithm' //Check VAT for EU countries only $country_id = strtoupper($country_id); switch ($country_id) { case 'AT': case 'BE': case 'BG': case 'CY': case 'CZ': case 'DE': case 'DK': case 'EE': case 'GR': case 'ES': case 'FI': case 'FR': case 'GB': case 'HU': case 'IE': case 'IT': case 'LT': case 'LU': case 'LV': case 'MT': case 'NL': case 'PL': case 'PT': case 'RO': case 'SE': case 'SI': case 'SK': //return $results[$this->checkVatID_EU($vat_id, $country_id)]; return $results[checkVatID_EU
($vat_id, $country_id)]; default: return $results[8]; //unknown country } } function checkVatID_EU
($vat_id, $country_id) { $wsdl_url = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'; // Leerzeichen und sonderzeichen entfernen $remove = array (' ', '-', '/', '\\', '.', ':', ','); $vat_id = trim(chop($vat_id)); $vat_id = str_replace($remove, '', $vat_id ); //$country = substr($vat_id, 0, 2); //erste 2 Stellen der VAT $vatNumber = (int
) substr($vat_id, 2); // alles ab 2 Stellen der VAT (ohne Land) $client = new SoapClient
($wsdl_url, array("connection_timeout" => 2)); $params = array('countryCode' => $country_id, 'vatNumber' => $vatNumber); try
{ $result = $client->checkVat($params); } catch
(SoapFault
$e) { //enhanced error reporting $result = $e->faultstring; $n = preg_match('/\{ \'([A-Z_]*)\' \}/', $result, $matches); $result = $matches[1]; $errors = array( 'INVALID_INPUT' => 'The provided CountryCode is invalid or the VAT number is empty', 'SERVICE_UNAVAILABLE' => 'The SOAP service is unavailable, try again later', 'MS_UNAVAILABLE' => 'The Member State service is unavailable, try again later or with another Member State', 'TIMEOUT' => 'The Member State service could not be reached in time, try again later or with another Member State', 'SERVER_BUSY' => 'The service cannot process your request. Try again later.' ); return $errors[$result]; } if (!$result->valid) { //var_dump($result); return 0; //invalid VAT } else { return 1; //valid VAT } return false; } // end checkVatID_EU ?> Das ganze gibt dann 1 (=gültige UstID) oder 0 (=ungültige UstID) zurück.
Du kannst obiges Coding zum testen in eine eigene Datei packen und z.B. über
validate_vatid('DE247680236', 'DE');
aufrufen.
Der erste Parameter ist die komplette UstId (Leerzeichen,Sonderzeichen werden rausgefiltert), der zweite Parameter das Land