IXR Library und SSL

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
Hallo zusammen,

da wir sehr viel mit ausländischen Firmen zu tun haben, wurden deren UID Nummern immer über die XML-RPC Schnittstelle vom BZSt. abgefragt. Das geht aber seit heute nicht mehr. In einem Hinweis auf der Seite heißt es lapidar "Bitte stellen Sie Ihre Abfragen ab dem genannten Zeitpunkt nur noch über HTTPS (TLS1.2)".

Unsere Seite ist aber schon seit Jahren abgesichert und auch die Schnittstelle wurde über https:// Aufrufe angesprochen!?

In der SSL-bezogenen Funktion in der Lib kann man zwar separate Cert, CA und Key Files angeben und die bekäme ich auch, allerdings widerstrebt es mir, das Keyfile selbst auf den Server zu legen. Dann kann auch noch ein Kennwort zum Entsperren des privateKey angegeben werden. Nur wo kriege ich das her??? Und könnte das wirklich helfen?

Hat jemand damit schon Erfahrungen und kann mir sagen, wie ich die wieder zum Laufen kriege?

Vielen Dank schon mal im Voraus,
Sprint

Edit: Bei der Schnittstellenbeschreibung ist ein Beispiel für eine Abfrage über HTTP:

HTML:
https://evatr.bff-online.de/evatrRPC?UstId_1=DE123456789&UstId_2=AB1234567890 
&Firmenname=Firmenname einschl. Rechtsform&Ort=Ort der Firma&PLZ=12345&Strasse=Strasse der Firma 
&Druck=nein

Wenn ich das über den Browser abschicke, bekomme ich korrekt einen XML String als Antwort.

Wenn ich das ganze über PHP laufen lasse:
PHP:
$client = new IXR_Client('https://evatr.bff-online.de/');
if (!$client->query('evatrRPC',
                    $duid['uid'],
                    $uiddaten['uid'],
                    $sende_firmenname,
                    $uiddaten['ort'],
                    $uiddaten['plz'],
                    $uiddaten['strasse'],
                    'nein'))
    $antwort = $client->getErrorCode().":".$client->getErrorMessage();
else
    $antwort = $client->getResponse();

bekomme ich die Meldung "-32300:transport error - could not open socket".

Wenn es über HTTP geht, sollte das Problem doch eher in der Library zu finden sein, oder? Damit könnte ich mir den o.g. Weg über die Zertifikatdateien usw. wohl sparen, denn die sind ja bei einem Aufruf über den Browser ja definitiv nicht da.

Gibt es denn eine Möglichkeit, ohne die IXR Library den Aufruf zu erstellen und die Antwort abzufangen?
 
Zuletzt bearbeitet:
Kein Problem.
PHP:
$data = array(
    'UstId_1'=>$duid['uid'],
    'UstId_2'=>$uiddaten['uid'],
    'Firmenname'=>$sende_firmenname,
    'Ort'=>$uiddaten['ort'],
    'PLZ'=>$uiddaten['plz'],
    'Strasse'=>$uiddaten['strasse'],
    'Druck'=>'nein'
);

$string = http_build_query($data, '&');

$antwort = urlRequest('https://evatr.bff-online.de/evatrRPC', 'Mozilla/5.0 (X11; Ubuntu; Linux x86; rv:28.0) Gecko/20100101 Firefox/28.0', true, '', $string);

function urlRequest($url, $setUserAgent=false, $usePost=false, $additionalHeaders='', $content='') {
    return file_get_contents($url, false, stream_context_create(array('http' => array('method' => (($usePost) ? 'POST' : 'GET'), 'header' => "User-Agent: ".(($setUserAgent) ? $setUserAgent : $_SERVER['HTTP_USER_AGENT'])."\r\n"."Content-Type: application/x-www-form-urlencoded;charset=UTF-8\r\n".$additionalHeaders, 'content' => $content))));
}
So läuft es bei mir genauso wie vor der Umstellung. Wenn es bei dir auch um das BZSt. geht, paß bei den Statuscodes auf. die haben sich vor einigen Monaten nämlich etwas geändert.
 
Kein Problem.

So läuft es bei mir genauso wie vor der Umstellung. Wenn es bei dir auch um das BZSt. geht, paß bei den Statuscodes auf. die haben sich vor einigen Monaten nämlich etwas geändert.

Super, vielen Dank. So funktioniert es. Nur leider bekommt man als Antwort den ganzen String zurück. Wie hast Du denn da den ErrorCode einzeln ausgelesen?
 
Wenn du die Abfragen als qualifizierte Abfragen aufheben willst, mußt du sowieso den ganzen String speichern. Aber das ist ja nur ein ganz einfacher XML Text. Der muß nur noch geparst werden und schon hast du ein Array mit alles Werten.

Den Status allein wirst du vermutlich nicht bekommen. Wird dir aber auch nicht viel helfen, da meines Wissens nach nur die komplette qualifizierte Abfrage mit ALLEN Daten auch von den Finanzbehörden anerkannt wird. Wir erleben hier von unseren Kunden diesbezüglich Sachen, die massive Zweifel an dem generellen Vorhandensein von Intelligenz auf diesem Planeten aufkommen lassen. ;)
 
So löse ich die XML sowie die Fehlercodes:

PHP:
$msg = '';
if(!($res = curl_exec($ch))) {

    echo 'Fehler bei der Auswertung der Daten in Curl'; // siehe curl_error($ch)

    curl_close($ch);

    die();

}

curl_close($ch);


// Lade XML-Daten

if(!$xml = simplexml_load_string($res))

{

    foreach (libxml_get_errors() as $error) {

        $xml_errors .= $error."\r\n";

    }


    libxml_clear_errors();

    die('Fehler beim Lesen der XML');


}

else

{

    $data = array();

    $i = 1;

    foreach($xml as $param)

    {

        foreach($param->value->array->data as $value) {

            $key = '';

            $val = '';

            foreach($value as $val)

            {

                if(is_int($i/2)) {

                    switch($i) {

                        case 2:

                        $data['UstId_1'] = $val->string;

                        break;


                        case 4:

                        $data['ErrorCode'] = $val->string;

                        break;


                        case 6:

                        $data['UstId_2'] = $val->string;

                        break;


                        case 12:

                        $data['Ort'] = $val->string;

                        break;


                        case 14:

                        $data['Datum'] = $val->string;

                        break;


                        case 16:

                        $data['PLZ'] = $val->string;

                        break;


                        case 20:

                        $data['Uhrzeit'] = $val->string;

                        break;


                        case 24:

                        $data['Gueltig_ab'] = $val->string;

                        break;


                        case 26:

                        $data['Gueltig_bis'] = $val->string;

                        break;


                        case 28:

                        $data['Strasse'] = $val->string;

                        break;


                        case 30:

                        $data['Firmenname'] = $val->string;

                        break;


                    }

                }


                $i++;

            }

        }

    }


    if(isset($data['UstId_2']) && $data['UstId_2'] != '') $msg .= 'Ergebnis der Prüfung für USt-IdNr. '.htmlspecialchars($data['UstId_2']).':<br>';


    if(isset($data['ErrorCode']) && $data['ErrorCode'] != '')

    {

        define('ERROR_CODE_200', 'Die angefragte USt-IdNr. ist gültig.');

        define('ERROR_CODE_201', 'Die angefragte USt-IdNr. ist ungültig. ');

        define('ERROR_CODE_202', 'Die angefragte USt-IdNr. ist ungültig. Sie ist nicht in der Unternehmerdatei des betreffenden EU-Mitgliedstaates registriert. Hinweis: Ihr Geschäftspartner kann seine gültige USt-IdNr. bei der für ihn zuständigen Finanzbehörde in Erfahrung bringen. Möglicherweise muss er einen Antrag stellen, damit seine USt-IdNr. in die Datenbank aufgenommen wird. ');

        define('ERROR_CODE_203', 'Die angefragte USt-IdNr. ist ungültig. Sie ist erst ab dem '.htmlspecialchars($data['Gueltig_ab']).' gültig. ');

        define('ERROR_CODE_204', 'Die angefragte USt-IdNr. ist ungültig. Sie war im Zeitraum von '.htmlspecialchars($data['Gueltig_ab']).' bis '.htmlspecialchars($data['Gueltig_bis']).' gültig. ');

        define('ERROR_CODE_205', 'Ihre Anfrage kann derzeit durch den angefragten EU-Mitgliedstaat oder aus anderen Gründen nicht beantwortet werden. Bitte versuchen Sie es später noch einmal. Bei wiederholten Problemen wenden Sie sich bitte an das Bundeszentralamt für Steuern - Dienstsitz Saarlouis. ');

        define('ERROR_CODE_206', 'Ihre deutsche USt-IdNr. ist ungültig. Eine Bestätigungsanfrage ist daher nicht möglich. Den Grund hierfür können Sie beim Bundeszentralamt für Steuern - Dienstsitz Saarlouis - erfragen. ');

        define('ERROR_CODE_207', 'Ihnen wurde die deutsche USt-IdNr. ausschliesslich zu Zwecken der Besteuerung des innergemeinschaftlichen Erwerbs erteilt. Sie sind somit nicht berechtigt, Bestätigungsanfragen zu stellen. ');

        define('ERROR_CODE_208', 'Für die von Ihnen angefragte USt-IdNr. läuft gerade eine Anfrage von einem anderen Nutzer. Eine Bearbeitung ist daher nicht möglich. Bitte versuchen Sie es später noch einmal. ');

        define('ERROR_CODE_209', 'Die angefragte USt-IdNr. ist ungültig. Sie entspricht nicht dem Aufbau der für diesen EU-Mitgliedstaat gilt.');

        define('ERROR_CODE_210', 'Die angefragte USt-IdNr. ist ungültig. Sie entspricht nicht den Prüfziffernregeln die für diesen EU-Mitgliedstaat gelten. ');

        define('ERROR_CODE_211', 'Die angefragte USt-IdNr. ist ungültig. Sie enthält unzulässige Zeichen.');

        define('ERROR_CODE_212', 'Die angefragte USt-IdNr. ist ungültig. Sie enthält ein unzulässiges Länderkennzeichen. ');

        define('ERROR_CODE_213', 'Die Abfrage einer deutschen USt-IdNr. ist nicht möglich. ');

        define('ERROR_CODE_214', 'Ihre deutsche USt-IdNr. ist fehlerhaft. Sie beginnt mit DE gefolgt von 9 Ziffern. ');

        define('ERROR_CODE_215', 'Ihre Anfrage enthält nicht alle notwendigen Angaben für eine einfache Bestätigungsanfrage (Ihre deutsche USt-IdNr. und die ausl. USt-IdNr.). Ihre Anfrage kann deshalb nicht bearbeitet werden. ');

        define('ERROR_CODE_216', 'Ihre Anfrage enthält nicht alle notwendigen Angaben für eine qualifizierte Bestätigungsanfrage (Ihre deutsche USt-IdNr., die ausl. USt-IdNr., Firmenname einschl. Rechtsform und Ort). Es wurde eine einfache Bestätigungsanfrage durchgeführt mit folgenden Ergebnis: Die angefragte USt-IdNr. ist gültig. ');

        define('ERROR_CODE_217', 'Bei der Verarbeitung der Daten aus dem angefragten EU-Mitgliedstaat ist ein Fehler aufgetreten. Ihre Anfrage kann deshalb nicht bearbeitet werden.');

        define('ERROR_CODE_218', 'Eine qualifizierte Bestätigung ist zur Zeit nicht möglich. Es wurde eine einfache Bestätigungsanfrage mit folgendem Ergebnis durchgeführt: Die angefragte USt-IdNr. ist gültig. ');

        define('ERROR_CODE_219', 'Bei der Durchführung der qualifizierten Bestätigungsanfrage ist ein Fehler aufgetreten. Es wurde eine einfache Bestätigungsanfrage mit folgendem Ergebnis durchgeführt: Die angefragte USt-IdNr. ist gültig. ');

        define('ERROR_CODE_220', 'Bei der Anforderung der amtlichen Bestätigungsmitteilung ist ein Fehler aufgetreten. Sie werden kein Schreiben erhalten. ');

        define('ERROR_CODE_999', 'Eine Bearbeitung Ihrer Anfrage ist zurzeit nicht möglich. Bitte versuchen Sie es später noch einmal. ');


        switch ($data['ErrorCode']) {

            case '200':

            $msg .= ERROR_CODE_200;

            break;

            case '201':

            $msg .= ERROR_CODE_201;

            break;

            case '202':

            $msg .= ERROR_CODE_202;

            break;

            case '203':

            $msg .= ERROR_CODE_203;

            break;

            case '204':

            $msg .= ERROR_CODE_204;

            break;

            case '205':

            $msg .= ERROR_CODE_205;

            break;

            case '206':

            $msg .= ERROR_CODE_206;

            break;

            case '207':

            $msg .= ERROR_CODE_207;

            break;

            case '208':

            $msg .= ERROR_CODE_208;

            break;

            case '209':

            $msg .= ERROR_CODE_209;

            break;

            case '210':

            $msg .= ERROR_CODE_210;

            break;

            case '211':

            $msg .= ERROR_CODE_211;

            break;

            case '212':

            $msg .= ERROR_CODE_212;

            break;

            case '213':

            $msg .= ERROR_CODE_213;

            break;

            case '214':

            $msg .= ERROR_CODE_214;

            break;

            case '215':

            $msg .= ERROR_CODE_215;

            break;

            case '216':

            $msg .= ERROR_CODE_216;

            break;

            case '217':

            $msg .= ERROR_CODE_217;

            break;

            case '218':

            $msg .= ERROR_CODE_218;

            break;

            case '219':

            $msg .= ERROR_CODE_219;

            break;

            case '220':

            $msg .= ERROR_CODE_220;

            break;

            case '999':

            $msg .= ERROR_CODE_999;

            break;

        }

    }


    $msg .= '<br><br>Prüfung durchgeführt am '.htmlspecialchars($data['Datum']). ' um '.htmlspecialchars($data['Uhrzeit']). '<br>';

}


echo $msg;
 
Hallo zusammen,
ich habe auch ein Problem mit der Abfrage der Umsatzsteueridentnummer. Ich hoffe ich kann hier noch posten, auch wenn das Thema als gelöst markiert ist..

Letztes Jahr hat alles noch wunderbar funktioniert mit diesem Code:
Code:
    $client     = new IXR_Client('https://evatr.bff-online.de/');

    $UstId_1    = 'DE12345678';
    $UstId_2    = $data->RUstIDNr;
    $Firmenname = $data->RFirma1VAT;
    $Ort        = $data->RStadtVAT;
    $PLZ        = $data->RPLZVAT;
    $Strasse    = $data->RStrasseVAT;
    $Druck      = 'nein';

    if (!$client->query('evatrRPC',
                        $UstId_1,
                        $UstId_2,
                        $Firmenname,
                        $Ort,
                        $PLZ,
                        $Strasse,
                        $Druck))
      {
        die('Ein Fehler ist aufgetreten -
        '.$client->getErrorCode().":".$client->getErrorMessage());
      }

    $outString=$client->getResponse();

    $phpvars = xmlrpc_decode ($outString);

Inzwischen haben wir auf einen anderen Server umgestellt, und arbeiten jetzt auch mit PHP 7.1.0 nach zuvor PHP 5.4.16.
Apache: 2.4.25 (Win64) OpenSSL/1.0.2j PHP/7.1.10
Und das Amt hat seinerseits ja auch eine Umstellung vorgenommen.

Wir sind nur ein kleiner Betrieb mit zehn Mann, und haben uns ohne besondere Programmierkenntnisse ein eigenes Auftragsabwicklungsprogramm mit PHP/MySQL geschrieben. Das läuft auch sehr gut, aber bei solchen Problemen wie wir sie jetzt haben stoßen wir dann doch an unsere Grenzen. Daher wäre es klasse wenn uns hier jemand unter die Arme greifen könnte!

Ich hatte den Code aus dem vorherigen Post übernommen:
Code:
$data = array(
    'UstId_1'=>'DE12345678',
    'UstId_2'=>$data->RUstIDNr,
    'Firmenname'=>$data->RFirma1VAT,
    'Ort'=>$data->RStadtVAT,
    'PLZ'=>$data->RPLZVAT,
    'Strasse'=>$data->RStrasseVAT,
    'Druck'=>'nein'
);

$string = http_build_query($data, '&');

$antwort = $this->urlRequest('https://evatr.bff-online.de/evatrRPC', 'Mozilla/5.0 (X11; Ubuntu; Linux x86; rv:28.0) Gecko/20100101 Firefox/28.0', true, '', $string);
 
private function urlRequest($url, $setUserAgent=false, $usePost=false, $additionalHeaders='', $content='') {
    return file_get_contents($url, false, stream_context_create(array('http' => array('method' => (($usePost) ? 'POST' : 'GET'), 'header' => "User-Agent: ".(($setUserAgent) ? $setUserAgent : $_SERVER['HTTP_USER_AGENT'])."\r\n"."Content-Type: application/x-www-form-urlencoded;charset=UTF-8\r\n".$additionalHeaders, 'content' => $content))));
}

Damit bekomme ich folgende Fehlermeldungen, die sich auf die Function beziehen (return file_get_contents....):
Warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in C:\Apache24\htdocs\domain\klassen\Kundenstamm.klasse.php on line 3891

Warning: file_get_contents(https://evatr.bff-online.de/evatrRPC): failed to open stream: No such file or directory in C:\Apache24\htdocs\domain\klassen\Kundenstamm.klasse.php on line 3891

Da unsere Anwendung nur intern auf unserem Rechner läuft wird diese mit HTTP und nicht mit HTTPS aufgerufen. Ist das hier der erste Ansatz um weiter zu kommen? Ich hatte mir das gestern schon einmal angeschaut was hier zu tun wäre, komme aber nicht so recht voran. Die letzten zehn Jahre war das kein Thema, entsprechend unbeholfen bin ich daher hier auch. Falls das der erste Schritt wäre, vielleicht könnt Ihr mir ein Handwerkszeug in die Hand geben mit dem ich den nächsten Schritt machen kann?
In der httpd.conf habe ich folgendes schon "eingefügt":
Code:
<IfModule mod_ssl.so>
    Listen 443
</IfModule>
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-default.conf
Mit den .key und .crt Files bin ich noch nicht weiter gekommen..
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück