PayPal IPN oder PDT

DoRiMaN

Erfahrenes Mitglied
Halli Hallo an Alle!

Ich habe da ein Problem beim Integrieren des PayPal IPN in meinen Shop...

Ich habe alle Anleitungen, Foren und Seiten durchsucht, aber werde einfach nicht schlau...

Ich habe in der PayPal Sandbox ein Developer-Konto, mit 2 Testkonten (ein Käufer und ein Business-Konto) eröffnet. Beide Testkonten sind verifiziert...

In den Zahlungsoptionen des Business-Kontos habe ich IPN aktiviert, und verweise auch auf die korrekte Script-Datei.

Die sieht so aus:

PHP:
<?php
@mail('MEINE@E-MAIL.COM', 'IPN-Test', 'this is an IPN Test: '.date('d.m.Y H:i:s', time()), 'From: MEINE@E-MAIL.COM');

include('includes/headervars.inc.php');		// Stellt Funktionen und Variabeln zur Verfügung

$log = fopen('logs/log_'.time().'.txt', 'w+');		// Testlog erstellen

if($dbVerbindung===true && $functions->shopOnline && isset($_POST['mc_currency'])){
	fwrite($log, 'Shop ONLINE
	');

	$req = 'cmd=_notify-validate';
	foreach($_POST as $key => $value){
		$value = urlencode(stripslashes($value));
		$req .= "&$key=$value";
	}
	
	fwrite($log, 'Request to send: '.$req.'
	');
	
	// Validierungs-POST zurückschicken
	$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";
	$header .= "Host: www.sandbox.paypal.com\r\n";
	//$fp = fsockopen('www.paypal.com', 80, $errno, $errstr, 30);
	$fp = fsockopen('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
	//$fp = fsockopen('www.eliteweaver.co.uk', 80, $errno, $errstr, 30);
	
	fwrite($log, 'Header: '.$header.'
	');
	
	$txn_id = $_POST['txn_id'];
	$payment_status = $_POST['payment_status'];
	$payment_amount = $_POST['mc_gross'];
	$receiver_email = $_POST['receiver_email'];
	$payer_email = $_POST['payer_email'];
	$payment_date = date('Y-m-d H:i:s');
	$bestellung_id = $_POST['custom'];
	
	$first_name = $_POST['first_name'];
	$last_name = $_POST['last_name'];
	$address_street = $_POST['address_street'];
	$adress_city = $_POST['adress_city'];
	$address_zip = $_POST['address_zip'];
	$address_country = $_POST['address_country'];
	
	if(!$fp){
		// HTTP ERROR
		fwrite($log, 'HTTP-Error: '.$errno.': '.$errstr.'
		');
	} else {
		fwrite($log, 'Connection estabilished
		');
		
		fputs($fp, $header.$req);
		
		$counter = 0;
		while(!feof($fp)){
			$counter++;
			
			$res = fgets($fp, 1024);
			
			fwrite($log, 'Result: '.$res.'
			');

			if(strcmp($res, "VERIFIED")==0 && ($payment_status=="Completed" || $payment_status=="Pending")){
				fwrite($log, 'Result: VERIFIED
				');
			} elseif(strcmp($res, "INVALID")==0){
				fwrite($log, 'Result: INVALID
				');
				$cls_mailer->mailSenden('MEINE@E-MAIL.COM', 'Invalid PayPal Payment', $bestellung_id.': '.date('d.m.Y H:i:s', time()), true);
			}
		}
		fclose($fp);
	}
} else {
	fwrite($log, 'Shop OFFLINE or POST NOT PRESENT');
}

fclose($log);
?>
ist eigentlich ziemlich gleich wie das von PayPal angebotene Beispiel... Meine Änderungen:
- Mail und Log-Funktionen
- Sandbox.paypal.com
- Custom-Variable laden

Wenn ich dieses Script mit dem IPN-Test-Script auf http://www.eliteweaver.co.uk/testing teste, funktioniert alles einwandfrei. Ich erhalte das Testmail, und im Log-File wird alles als OK beschrieben. Auch meine Query (hier übersichtshalber nicht dabei) wird ausgeführt.
Wenn ich das Script aber in der Sandbox teste, geschieht folgendes:
- Das Testmail erhalte ich
- Verbindung wird hergestellt
- Resultat des $fp: Ich erhalte vom PayPal-Server einen 500er Internal Server Error. Hier der Auszug aus dem Log für die Variable $result:

Code:
Result: HTTP/1.1 500 Internal Server Error

Result: Date: Wed, 28 Mar 2007 13:53:05 GMT

Result: Server: Apache/1.3.27 (Unix) mod_ssl/2.8.12 OpenSSL/0.9.7a mod_fastcgi/2.4.2 PHP/4.3.2

Result: Connection: close

Result: Content-Type: text/html; charset=iso-8859-1

Result: 

Result: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

Result: <HTML><HEAD>

Result: <TITLE>500 Internal Server Error</TITLE>

Result: </HEAD><BODY>

Result: <H1>Internal Server Error</H1>

Result: The server encountered an internal error or

Result: misconfiguration and was unable to complete

Result: your request.<P>

Result: Please contact the server administrator,

Result:  webmaster@paypal.com and inform them of the time the error occurred,

Result: and anything you might have done that may have

Result: caused the error.<P>

Result: More information about this error may be available

Result: in the server error log.<P>

Result: <P>Additionally, a 404 Not Found

Result: error was encountered while trying to use an ErrorDocument to handle the request.

Result: <HR>

Result: <ADDRESS>Apache/1.3.27 Server at <A HREF="mailto:webmaster@paypal.com">www.sandbox.paypal.com</A> Port 80</ADDRESS>

Result: </BODY></HTML>

Weiss irgend jemand, ob dies ein Problem mit meinem Script, oder mit der PayPal-Sandbox ist? Wie bereits geschrieben, konnte ich nichts finden was mir weiterhelfen konnte...


Um dieses Problem zu umgehen, habe ich gedacht, ich verwende PDT und nicht IPN. Das Script habe ich von PayPal übernommen, alles korrekt konfiguriert. Nur wird beim Zurückleiten des Benutzers die GET-Variable tx nicht gesetzt, also kann ich die Transaktion nicht prüfen im Script... Ist dieses Problem bekannt?


Danke im Voraus und Gruss

DoRiMaN
 
So, nun hab ich es auch im Live-System von PayPal getestet, und auch dort erhalte ich einen 500er Fehler zurück... Also muss irgend etwas an meinem Script nicht stimmen :(

Leider komme ich nicht dahinter... Und das Test-Script validiert mein IPN-Script ja... :(
 
So, habs endlich zum laufen gebracht...

nach vielen verschiedenen Versuchen habe ich die Zeile

PHP:
$header .= "Host: www.sandbox.paypal.com\r\n";

entfernt... Nun funktionierts, sowohl in der Sandbox wie auch im Live-System!
 
Zurück