fsocketopen fuer https request...
Sascha
- php
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
Hmmm..
naja dachte es waeren ein paar mehr antworten drin als keine, aber vielleicht ist diese frage ja auch zu kompliziert gewesen. :(
bummer
Tach,
//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) . "&";
}
- Welches OS?
- Welcher Server?
- Welches PHP?
- Dein Script?
Gruß aus Berlin!
eddi
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
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='';
Gruß aus Berlin!
eddi
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
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