Sascha: fsocketopen fuer https request...

Tach zusammen...

ich versuche schon seit ein paar stunden mir was zusammen zu basteln was es mir ermoeglicht in PHP einen https POST request zu senden und anschliessend die ausgabe des servers zu empfangen und zu verarbeiten. Ich bin dabei ueber folgendes script gestolpert:

//-----------------------------------------------------------------------
$host = "somehost.somedomain.com";
$port = 443;
$path = "/the/url/path/file.php"; //or .dll, etc. for authnet, etc.

//you will need to setup an array of fields to post with
//then create the post string
$formdata = array ( "x_field" => "somevalue");
//build the post string
  foreach($formdata AS $key => $val){
   $poststring .= urlencode($key) . "=" . urlencode($val) . "&";
  }
// strip off trailing ampersand
$poststring = substr($poststring, 0, -1);

$fp = fsockopen("ssl://".$host, $port, $errno, $errstr, $timeout = 30);

if(!$fp){
 //error tell us
 echo "$errstr ($errno)\n";
  
}else{

//send the server request
  fputs($fp, "POST $path HTTP/1.1\r\n");
  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
  fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $poststring . "\r\n\r\n");

//loop through the response from the server
  while(!feof($fp)) {
   echo fgets($fp, 4096);
  }
  //close fp - we are done with it
  fclose($fp);
}
//-----------------------------------------------------------------------

Leider ist alles was ich bekomme ein unexpected T_FOREACH error in zeile 12 den ich mir aber nicht erklaeren kann. :(

Kann mir hier jemand weiter helfen oder mir vielleicht einen anderen loesungsweg zeigen?

Danke fuer eure Hilfe,
Sascha

  1. Hmmm..

    naja dachte es waeren ein paar mehr antworten drin als keine, aber vielleicht ist diese frage ja auch zu kompliziert gewesen. :(

    bummer

  2. Tach,

    //you will need to setup an array of fields to post with
    //then create the post string
    $formdata = array ( "x_field" => "somevalue");

    $formdata sind die Daten, die als Postdaten verwendet werden sollen.

    Im Steuerfluß (betrifft die mit * gekennzeichnete Zeile) in eine

    HTTP-gerechte Form zum versenden gebracht. foreach() erwartet dabei

    ein Datenfled.

    Ich kann wohl davon ausgehen, daß Du hier nur den Code aus einem Bei-

    spiel herauskopiert hast, jedoch die Fehlermeldung bei einem auf die-

    sem Beispielcode aufbauenden, eigenen Script erhalten hast. Um es

    kurz zu machen: Wie soll Dir geholfen werden, wenn Du hier nicht alle

    Daten zur Verfügung stellst?

    //build the post string
      foreach($formdata AS $key => $val){

    *)    $poststring .= urlencode($key) . "=" . urlencode($val) . "&";

    }

    - Welches OS?
     - Welcher Server?
     - Welches PHP?
     - Dein Script?

    Gruß aus Berlin!
    eddi

    --
    at, wie er leibt und lebt auf ein Posting
    > > Nein, ich denke nicht.
    gepromptet
    > Das empfiehlt sich aber.
    :))))
    1. Hallo Eddie,

      erstmal danke das Du Dir die Zeit nimmst mir damit weiterzuhelfen.
      Habe das Script nochmal neu in den Quelltext kopiert und komischerweise war die Fehlermeldung danach auch verschwunden. ;)
      Was es auch immer gewesen ist?!?!...

      Naja, ich hab mit diesem Script nochmal ein wenig rumgespielt und bin auch schon fast durch. Jedoch bekomme ich immer noch eine Fehlermeldung die ich nicht so ganz verstehe.

      Hier erstmal der von mir modifizierte Code:

      //------------------------------
      $host = "secure.ibill.com";
      $port = 443;
      $path = "/cgi-win/ccard/tpcard.exe"; //or .dll, etc. for authnet, etc.

      //you will need to setup an array of fields to post with
      //then create the post string
      $formdata = array ("reqtype" => "authorize","account" => "89598114","password" => "1web4u","saletype" => "sale","cardnum" => "4128000011112222","cardexp" => "0304","noc" => "john doe","address1" => "99anystreet","zipcode" => "12345","amount" => "1.00","crefnum" => "12345test");

      //build the post string
      foreach($formdata AS $key => $val){
          $poststring.=urlencode($key)."=".urlencode($val)."&";
      }

      // strip off trailing ampersand
      $poststring = substr($poststring, 0, -1);

      $fp = fsockopen("ssl://".$host, $port, $errno, $errstr, $timeout = 600);

      if(!$fp) {
      //error tell us
      echo "$errstr ($errno)\n";

      } else {
      //send the server request
      fputs($fp, "POST $path HTTP/1.0\r\n");
      fputs($fp, "Host: $host\r\n");
      fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
      fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
      fputs($fp, "Connection: close\r\n\r\n");
      fputs($fp, $poststring."\r\n\r\n");

      //loop through the response from the server
      while(!feof($fp)) {
      $string = @fgets($fp);

      $string = strstr($string,"declined");
      $string = ereg_replace(""","",$string);

      }
      //close fp - we are done with it
      fclose($fp);
      }

      $arr = explode(",",$string);

      foreach($arr as $elem) {
      echo $elem."<br>";
      }
      //------------------------------

      Ok..  also wie schon gesagt, das script funzt soweit, schmeisst mir aber immer folgenden error aus:

      Notice: Undefined variable: poststring in /test.php on line 13
      ==>( $poststring.=urlencode($key)."=".urlencode($val)."&"; )

      Verstehen kann ich das allerdings nicht, da $poststring ja Daten enthaelt, ansonsten wuerde das Script ja nichts zurueckliefern?

      Danke fuer Deine Hilfe
      Sascha

      1. Hallo Sascha,

        Ok..  also wie schon gesagt, das script funzt soweit, schmeisst mir aber immer folgenden error aus:

        Notice: Undefined variable: poststring in /test.php on line 13
        ==>( $poststring.=urlencode($key)."=".urlencode($val)."&"; )

        Wie Du siest ist es eine Notice. Der undefinierten Variable wird durch .= etwas subsummiert; dieser Notice kannst Du durch eine leere Inizialisierung der Variablen entgegenwirken:

        <?php
        $poststring='';

        usw.

        Gruß aus Berlin!
        eddi

        --
        at, wie er leibt und lebt auf ein Posting
        > > Nein, ich denke nicht.
        gepromptet
        > Das empfiehlt sich aber.
        :))))
        1. Hi Eddie...

          danke fuer Deine schnelle Hilfe. <freu>Es funktioniert!</freu> :]

          Kleine Randbemerkung dazu, fuer alle die es vielleicht spaeter mal interressiert.
          Um fsockopen() fuer einen https request unter Apache zu nutzen muss mindestens OpenSSL installiert sein!

          Zu finden unter www.openssl.org :] ;)

          Gruss
          Sascha

          1. Moj'ns Sascha,

            Kleine Randbemerkung dazu, fuer alle die es vielleicht spaeter mal interressiert.
            Um fsockopen() fuer einen https request unter Apache zu nutzen muss mindestens OpenSSL installiert sein!

            es sollte ausreichen, wenn openSSL vorhanden ist (muß nicht im Apache sein), wenn PHP mit cURL un --with-curlwrappers übersetzt wurde.

            Gruß aus Berlin!
            eddi

            --
            at, wie er leibt und lebt auf ein Posting
            > > Nein, ich denke nicht.
            gepromptet
            > Das empfiehlt sich aber.
            :))))