IXR Library und SSL


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

Sprint

Erfahrenes Mitglied
#1
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:

Sprint

Erfahrenes Mitglied
#5
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.
 
#6
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?
 

Sprint

Erfahrenes Mitglied
#7
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. ;)
 

guenter024

Erfahrenes Mitglied
#8
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;
 
#9
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..
 
#11
Code:
extension=php_openssl.dll
allow_url_fopen = On
stehen beide in der PHP.ini

Muss das openssl in der phpinfo ein eigener Absatz sein, oder wo kann ich sehen ob das passt?
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#14
Ok, das hätte ich bei der Fehlermeldung auch sehen können...

Was macht er bei dir eigentlich an der angegebenen Stelle in der Fehlermeldung?
C:\Apache24\htdocs\domain\klassen\Kundenstamm.klasse.php on line 3891

War der Teil in der php.ini bereits drin, oder hast du den eingetragen? Hast bei zweiterem auch den Server neugestartet?

Grüsse,
BK
 
#15
In Zeile 3891 wird der Inhalt dieser Function ausgeführt:
Code:
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))));
}
Ich hab alles getrennt installiert. Apache 2.4, PHP 7.1.0 und MySQL.
Die zwei Zeilen standen in der PHP.ini schon drin. Ob sie zuvor auskommentiert waren weiß ich aber leider nicht mehr sicher.
Einen Neustart der Dienste hab ich immer durchgeführt.
 
#17
Danke für die Hilfe bis hier hin schon mal!

Asche auf mein Haupt....
In der php.ini hat für die extension der Pfad gefehlt. Den mußte ich noch ergänzen. Eine Fehlermeldung konnte ich keine erkennen, deshalb war mir das nicht gleich aufgefallen.
Jetzt wird auch der OpenSSL Absatz in der phpinfo angezeigt, und die oben genannten Fehlermeldungen sind auch verschwunden.

Jetzt kann ich mir von dem Code oben $antwort auf dem Bildschirm anzeigen lassen. Es ist aber ein String den ich noch zerlegen müsste:
UstId_1 DE12345678 ErrorCode 200 UstId_2 IT12345678 Druck nein Erg_PLZ A Ort San Miniato Basso Pisa Datum 12.04.2019 PLZ 55555 Erg_Ort A Uhrzeit 12:56:37 Erg_Name A Gueltig_ab Gueltig_bis Strasse Via Cascina Lari Firmenname Pizza Service S. r. l. Erg_Str
Gibt es dafür eine Möglichkeit? Ich nehme an das ist nicht so trivial?..

Gruß
Stefan
 
#18
Ist es richtig dass, wenn ich "file_get_contents" durch "file" ersetze ein Array erhalten anstatt eines Strings? Könnte ich dann dieses Array einfacher zerlegen als den String?
Ich bin gerade schon dabei das zu versuchen, aber es gelingt mir nicht.
Vor PHP 7.1.0 hatte ich mit xmlrpc_decode() gearbeitet, aber diese Funktion ist in PHP 7.1.0 offensichtlich nicht mehr bekannt!?
"Call to undefined function xmlrpc_decode()"
 
Zuletzt bearbeitet:
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge