Hilfe für PayPal-Zahlung via IPN?

habe folgenden code zum abfangen der daten (vom paypal script generator)


Code:
<?php

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

$fp = fsockopen ('ssl://sandbox.paypal.com', 443, $errno, $errstr, 30);



if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment


// echo the response
echo "The response from IPN was: <b>" .$res ."</b><br><br>";

//loop through the $_POST array and print all vars to the screen.

foreach($_POST as $key => $value){

        echo $key." = ". $value."<br>";



}


}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation

// echo the response
echo "The response from IPN was: <b>" .$res ."</b>";

  }

}
fclose ($fp);
}
?>





bekomm da nur ein "The respons from IPN was: INVALID"
 
Zuletzt bearbeitet:
Der Prozess laeuft in der Regel so ab:
Du hast ein Formular welches den User mitsamt PayPal-Daten zu PayPal weiterleitet. Dort wird die Bestellung abgeschlossen und anschliessend verarbeitet.
Nach der Verarbeitung kontaktiert der PayPal-Server ein von Dir angegebenes Script auf Deinem Server welches dann die Daten mit PayPal abgleicht.

Fuer das Formular hab ich bereits eine Klasse, die Klasse fuer IPN ist noch nicht oeffentlich sondern bislang nur im SVN-Repository.

Die wichtigste Funktion aus dieser Klasse (also aus PayPalIPN) ist verify()
PHP:
	public function verify()
	{
		$parameters=array('cmd=_notify-validate');
		foreach($this->postdata as $key=>$value)
		{
			$parameters[]=$key.'='.$value;
		}
		$data=$this->post('/row/cgi-bin/webscr',$parameters);
		if ($data['body']=='VERIFIED')
		{
			return true;
		}
		else
		{
			return false;
		}
	}
 
Sonst versuchs mal hiermit:

paypal.php
PHP:
<?php

$amount = '100.00';

$file_array = file("paypal/invoice.txt");

$invoice = $file_array['0'];

$email_seller = 'somebody@gmail.com';

//$link_return = 'http://www.winesupporters.com/index.php?id=12';
$link_return = 'http://www.domain.com/paypal/paypal_check.php';

?>

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" name="frmPaypal" id="frmPaypal">

<!-- User Form -->
<font color="#000000">
Alternativ bieten wir einen Jahresaccount an für Vielbenutzer zum Vorteilspreis von: <b> <?php echo $amount ?> € </b>. 
<br>(<i>Bitte merken Sie sich Ihre Rechnungsnummer: <?php echo $invoice ?> für eventuelle Rückfragen</i>).<br>
</font>

<input type="submit" value="Weiter zu PayPal">

<!-- PayPal Logo -->

<div style="border: 1px solid black; width: 150px; height: 50px; margin-top: 20px;">
<a href="#" onclick="javascript:window.open('https://www.paypal.com/de/cgi-bin/webscr?cmd=xpt/cps/popup/OLCWhatIsPayPal-outside','olcwhatispaypal','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=400, height=350');">
	<img  src="https://www.paypal.com/de_DE/DE/i/logo/lockbox_150x50.gif" border="0" alt="PayPal-Logo">
</a>
</div>
<!-- PayPal Logo -->
<!-- PayPal Infos -->
<input type="hidden" name="business" value="<?php echo $email_seller; ?>">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="return" value="<?php echo $link_return; ?>">
<input type="hidden" name="cancel_return" value="<?php echo $link_return; ?>">
<input type="hidden" name="notify_url" value="<?php echo $link_return; ?>">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="lc" value="DE">
<input type="hidden" name="bn" value="toolkit-php">
<input type="hidden" name="cbt" value="Continue >>">
<input type="hidden" name="txn_id" value="">

<!-- Product Information -->
<input type="hidden" name="item_name" value="Jahreszugang">
<input type="hidden" name="amount" value="<?php echo $amount ?>">
<input type="hidden" name="invoice" value="<?php echo $invoice ?>">
<input type="hidden" name="quantity" value="">
<input type="hidden" name="item_number" value="">
<input type="hidden" name="undefined_quantity" value="">
<input type="hidden" name="on0" value="">
<input type="hidden" name="os0" value="">
<input type="hidden" name="on1" value="">
<input type="hidden" name="os1" value="">
</form>

paypal_check.php

PHP:
<?php

##########################################################################
# DB Functions
##########################################################################

//Var
$server = "localhost";
$user = "user";
$pass = "pass";
$datenbank = "db";

// MySQL Verbindung herstellen
$conn = @mysql_connect($server, $user, $pass);
 @mysql_select_db($datenbank, $conn);
 
// Bei Fehler Verbindung kappen, und Nachricht hinterlassen.
if ($conn!=TRUE)
{
    echo "Verbindungsfehler: ".mysql_error()." !! Versuchen Sie es zu einem sp&auml;teren Zeitpunkt nochmals. Danke.";
    die;
} else {
	//echo 'DB da';
}


################### 
#Functions

function simpleRandString ($len = 8, $list = '23456789ABCDEFGHJKMNPQRSTUVWXYZ') {
	$str = '';
	if (is_numeric ($len) && !empty ($list)) {
		mt_srand ((double) microtime () * 1000000);
		while (strlen ($str) < $len) {
			$str .= $list[mt_rand (0, strlen ($list)-1)];
		}
	}
	return $str;
}

function convert_date($timestamp) {
	$date = date("d.m.Y",$timestamp);
	$time = date("H:i",$timestamp);
	$rtrstr = $date . " - " . $time . " Uhr";
	return $rtrstr;
}

function insert_user_into_db ($username, $password, $auth, $email) {
	$time_now = time();
	$day = 60 * 60 * 24;
	$month = $day * 30;
	$year = $month * 12;
	$extra_time = 5 * 60;
	$time_tomorrow = $time_now + $year + extra_time;
	
	$anfrage = "INSERT INTO 
				`user_registered` 
					( `id` , `nickname` , `pw`, `sheet`, `zeit`, `auth`, `end_time`, `email`) 
				VALUES 
					('', '$username', '$password', 'Weine_ohne_mixed_lot_neu', '$time_now', '$auth', '$time_tomorrow', '$email')
				; ";
	$ergebnis=mysql_query($anfrage);
	return $ergebnis;
}

function make_log($logtext) {
	$file = "log_paypal.html";
	$fp = fopen($file,"a+");
	fwrite($fp,"$logtext\n");
	fclose($fp);
}

function log_private() {
	// Browser ermittlen
	$agent=$_SERVER['HTTP_USER_AGENT'];
	if (ereg("Opera",$agent)) $browser = 'Opera';
	elseif (eregi("Firefox",$agent)) $browser = 'Firefox';
	elseif (ereg("MSIE 6\.0",$agent)) $browser = 'MSIE 6.0';
	elseif (ereg("MSIE 5\.5",$agent)) $browser = 'MSIE 5.5';
	elseif (ereg("MSIE 5\.",$agent)) $browser = 'MSIE 5.0-4';
	elseif (ereg("MSIE 4\.",$agent)) $browser = 'MSIE 4.x';
	elseif (ereg("Netscape/7\.",$agent)) $browser = 'Netscape 7.x';
	elseif (ereg("Netscape6/6\.",$agent)) $browser = 'Netscape 6.x';
	else $browser = 'sonstiger Browser'; 

	//Betriebssystem ermitteln
	function os() {
	$agent=$_SERVER['HTTP_USER_AGENT'];
	$os   ="unknown";
	   if   (strstr($agent, "Windows 98"))      $os="Windows 98";
	   elseif (strstr($agent, "NT 4.0"))        $os="Windows NT ";
	   elseif (strstr($agent, "NT 5.1"))        $os="Windows XP";
	   elseif (strstr($agent, "Win"))           $os="Windows";
	   elseif (strstr($agent, "Mac"))           $os="Mac OS";
	   elseif (strstr($agent, "Linux"))         $os="Linux";
	   elseif (strstr($agent, "Unix"))          $os="Unix";
	return $os;
	}

	$domain = $_SERVER['REMOTE_ADDR'];
	$fp = fsockopen ("whois.ripe.net", 43) or die ("Fehler beim Öffnen der whois.ripe.net Anfrage !!");
	fputs($fp, "$domain\n");
		  // Der Domainname wird in die Socket - Verbindung zu ripe.net wie in eine
		  // Datei eingeschrieben.
	while (!feof($fp))
	{
	  $output[] = fgets($fp, 2048);
		  // Das Ergebnis wird wie aus einer Datei ausgelesen
	}
	fclose($fp);

	$private .= '<tr>';
	$private .= '<td><b>IP:</b></td><td> ' . $_SERVER['REMOTE_ADDR'] . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Provider:</b></td><td> ' . str_replace('descr:','',$output['13']) . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Host-Adresse:</b></td><td> ' . gethostbyaddr($_SERVER['REMOTE_ADDR']) . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Browser:</b></td><td> ' . $browser . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Betriebssystem:</b></td><td> ' . os() . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Kommt von:</b></td><td> ' . $_SERVER['HTTP_REFERER'] . '</td>';
	$private .= '</tr><tr>';
	$private .= '<td><b>Wohnt bei:</b></td><td> ' . str_replace('address:','',$output['30']) . '</td>';
	$private .= '</tr>';

	return $private;
}

###################




// VALIDATING
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
	$value = urlencode(stripslashes($value));
	$req .= "&$key=$value";
}

// post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

//echo $_POST['invoice'];

if (!$fp) {
	echo "http error";
} else {
	fputs ($fp, $header . $req);
	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		$resarray[] = $res;
	}
	
	fclose ($fp);

	if ($resarray['12'] == "VERIFIED")	{ 
		echo '<font color="#000000"><br><p>Vielen Dank f&uuml;r Ihren Auftrag. Sie erhalten in K&uuml;rze eine E-Mail an ' . $_POST['payer_email'] . ' mit Ihrem Zugang. </p><br></font>';
	echo '<head><meta http-equiv="refresh" content="5; URL=http://www.winesupporters.com/"></head>';

			//Log Schreiben
				$logtext = '<hr><p><p><b>Bezahlung erfolgreich ( ' . date("l dS of F Y h:i:s A") . ' ):</b></p><table>';
				foreach ($_POST as $key => $value) {
					$logtext .= '<tr><td><b>' . $key . '</b></td><td> ' . $value . '</td></tr>';
				}
				$logtext .= '<tr><td colspan="2"><hr></td></tr>';
				$logtext .= log_private();
				$logtext .= '</table><hr><p><hr color="#02fc02"></p>';

				make_log($logtext);
			// /Log Schreiben

			//Rechnungsnummer erhöhen
			$datei_handle=fopen("invoice.txt",w);
			fwrite($datei_handle,$_POST['invoice'] + 1);
			fclose($datei_handle);

			//Zugangsdaten an $_POST['payer_email'] senden
			# Kommt noch

			// Test
			if (gethostbyaddr($_SERVER['REMOTE_ADDR']) != 'notify.paypal.com') {
				$username = simpleRandString();
				$password = simpleRandString();
				$auth = $_POST['verify_sign'];
				insert_user_into_db ($username, $password, $auth, $_POST['payer_email']);
				
				$nachricht = '<html><head></head><body>Sehr geehrter Neukunde,<br><br>ihre Zugangsdaten lauten:<br><br><table><tr><td>
							<b>Benutzername:  </b></td><td>' . $username . '</td></tr><tr><td><b>Passwort:  </b></td><td>' . $password 
							. '</td></tr></table></body>';
							
				$header = "MIME-Version: 1.0\n";
				$header .= "Content-type: text/html; charset=iso-8859-1\n";
				$header .= "From: DoNotReply <donotreply@winesupporters.com>\n"; 
				
				mail($_POST['payer_email'],'Ihre Zugangsdaten',$nachricht, $header);
				
				$nachricht2 = '<html><head></head><body>'. $_POST['payer_email'] .',<br><br>Zugangsdaten lauten:<br><br><table><tr><td>		
							<b>Benutzername:  </b></td><td>' . $username . '</td></tr><tr><td><b>Passwort:  </b></td><td>' . $password 
							. '</td></tr></table></body>';
				
				mail('dannyfaak@gmail.com','Neuer Kunde',$nachricht2,$header);
				mail('duringo@gmail.com','Neuer Kunde',$nachricht2,$header);
			}

			//print_r($_POST);
			

	} else { 
		echo '<font color="#000000"><br><p>Es ist ein Fehler bei der Bezahlung aufgetreten.</p><br></font>';
		//print_r($resarray);
	}

	//print_r($resarray);
	//print_r($_POST);
}
?>

Die untere PHP Datei checkt ob alles korrekt lief und erstellt einen Useracount in einer Datenbank, und sendet diesen direkt an den Käufer (und zeigt ihn an).

Log Datei wird auch erstellt :)

Hoffe ich konnte dir helfen, viel Erfolg! (PS: Das Script habe ich schon ein knappes Jahr im Einsatz. Kannst es dir auf http://www.squaredancer.de auch direkt runterladen)
 
hmm aber wenn ich von dem vorgegebenen script schon ein invalid bekomme... dann muss doch der fehler woanders liegen oder?

wird nicht mit der foreach schleife geprüft, welche post daten mitgeschickt wurden? ich hab da auch keine inhalte
 
Wenn du nichts zurückbekommst konnte Paypal wahrscheinlich nichts mit deiner Anfrage anfangen.

Versuch doch mal obs mit meinem Script läuft, ist vielleicht besser als den Codeschnipsel von denen zu nehmen.

Kannst ja die Datenbanksachen rausnehmen, oder grad eine einrichten. Ist ja kein Aufwand. Oder schreib mal per ICQ 212321323
 
wird nicht mit der foreach schleife geprüft, welche post daten mitgeschickt wurden? ich hab da auch keine inhalte
$_POST ist leer wenn PayPal Dein Script kontaktiert?
Das sollte eigentlich nicht sein.

@Danny Faak: Ich glaub es duerfte fuer ihn einfacher sein meine existente Klasse fuer diese Formulare zu nutzen als Deinen Code umzustricken. ;)
Da wird das ganze Ding mit lediglich 3 oder 4 Zeilen Code erstellt.
 
Das wird doch auch bei Paypal nur durchgereicht oder? Man bekommt das post array und das res array zurück, und im res Array sollte ja stehen bezahlt oder nicht.
 
Von PayPal bekommt man per POST Daten uebermittelt. Diese Daten muss man wieder zu PayPal schicken und bekommt dann die Info ob die Zahlung echt ist.

Kurz gesagt, man arbeitet mit einem Array, $_POST. Dies enthaelt alle von PayPal gesandten Daten.

Und ich glaube auch nicht dass PayPal die Daten nur durchreicht. Es ist ein paar Monate her, aber ich glaube die Daten sind nicht identisch mit denen die man an PayPal schickt, auch wenn sicher einige auch wieder mit dabei sind.
 
Ich habs so in Errinerung das man die Sachen aber erst selbst sendet bevor es läuft wie du beschrieben hast. Ist über ein jahr her das ich das obige geschrieben habe ... (also mein script weiter oben meine ich)

Naja, mal hören was der threadersteller sagt. Ich schau mir noch mal den code von dem an ...
 
Ich habs so in Errinerung das man die Sachen aber erst selbst sendet bevor es läuft wie du beschrieben hast. Ist über ein jahr her das ich das obige geschrieben habe ... (also mein script weiter oben meine ich)
Richtig. Ein Formular wird an PayPal geschickt. Dort wird die Bestellung abgeschlossen und anschliessend kontaktiert der PayPal-Server das IPN-Script auf Deinem Server.

Edit: Bist Du sicher dass Du auf die richtige URL zugreifst wenn Du mit PayPal kommunizierst?
In meinen Klassen verwende ich https://www.sandbox.paypal.com/row/cgi-bin/webscr, Du nutzt https://sandbox.paypal.com/cgi-bin/webscr.
http://www.sandbox.paypal.com und sandbox.paypal.com haben z.B. schonmal unterschiedliche IPs.
 
Zurück