PayPal IPN

proloser

Erfahrenes Mitglied
PayPal IPN (funktioniert nur mit Sandbox)

Hallo,

ich habe mich inzwischen in die IPN von PayPal eingearbeitet und stehe derzeit vor folgendem Problem:

Das Script funktioniert einwandfrei. Sobald ich von der Sandbox auf "echt"-Modus umschalte funktioniert das Script nicht mehr.


Im Script ändert sich nur folgendes, wenn ich den "Test-Mode" auf "false" stelle:

Config
PHP:
$test_mode = true;


Weiterleitung
PHP:
$var= "cmd=_xclick&business=" . urlencode($ppemail) . "&no_shipping=0&no_note=1";
........
........
........

if($test_mode == true) {
    header("Location: https://www.sandbox.paypal.com/cgi-bin/webscr?" . $var);
} else {
    header("Location: https://www.paypal.com/cgi-bin/webscr?" . $var);
}

........
........
........

IPN
PHP:
........
........
........

if($test_mode == true) {
    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
} else {
    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
}

.........
.........
.........

if (strcmp ($res, 'VERIFIED') == 0) {
    mail($_POST['payer_email'], "Test", "Text...", "From: Test User <test@example.com>");
}

........
........
........


Hat jemand eine Idee an was das liegen könnte?

Gruß proloser
 
Zuletzt bearbeitet:
Was bedeutet "Funktioniert nicht mehr"? Kommt eine weiße Seite, geht die Zahlung nicht, geht die Weiterleitung nicht? Sorry, meine Glaskugel ist alles andere als in der Lage dein Problem vorherzusagen.
 
Die Zahlung läuft bei $test_mode => True genau gleich ab wie bei $test_mode => False.

Der einzige Unterschied ist, damit bei $test_mode => False, der Teil in "VERIFIED" nicht ausgeführt wird. Es wird also keine Mail versendet.
 
Zuletzt bearbeitet:
Und wo genau wird $res mit Werten versorgt? Was steht in $res denn drin? Bau mal ein paar Loggings ein. Diese Klasse hilft die dabei. Du kannst es natürlich auch mittels trigger_error() oder einfachen echos machen.

Außerdem:

PHP:
/* Entwicklermodus: Muss in die ersten Zeilen des Scripts um möchlichst alle Fehler aufzuzeigen. */
error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 1);
 
Das Problem ist, damit ich das selbst nicht testen kann, weil ich nur ein PayPal-Account habe.

Mit dem Sandbox-Account funktioniert alles einwandfrei.


Da ich bei der "Sofortige Zahlungsbestätigung (IPN)" -> Option 2 verwende...

"Geben Sie die Adresse des Skriptes zur Auswertung der Sofortige Zahlungsbestätigung (IPN) in der Variablen notify_url bei den entsprechenden Transaktionstypen an. Wenn Sie auf diese Weise die Adresse des Skriptes übergeben, wird diese statt der in Ihrem Profil hinterlegten Adresse verwendet."

... muss ich meiner Meinug nach auch keine weiteren Einstellungen im PayPal-Account vornehmen.


Ich Frag mich, für was PayPal eine Testumgebung hat, wenn diese nicht mit der "echten" übereinstimmt!?


Gruß Markus
 
Zuletzt bearbeitet:
Und was steht da drin? Eigentlich sollte laut Dokumentation in etwa so was drin stehen:

Code:
TIMESTAMP=2007%2d04%2d04T03%3a35%3a10Z&
CORRELATIONID=a7cbf2d4d83dc&
ACK=Failure&
L_ERRORCODE0=10555&
L_SHORTMESSAGE0=Filter%20Decline&
L_LONGMESSAGE0=This%20transaction%20cannot%20be%20processed%2e&
L_SEVERITYCODE0=Error&
L_ERRORCODE1=10755&
L_SHORTMESSAGE1=Unsupported%20Currency%2e&
L_LONGMESSAGE1=This%20transaction%20cannot%20be%20processed%20due%20to%20an
%20unsupported%20currency%2e&
L_SEVERITYCODE1=Error&
VERSION=2%2e400000&
BUILD=1%2e0006
 
Wie kann ich das auslesen? Muss ich dazu jemand finden der mir eine echte Transaktion durchführt, oder?
 
Ich hab dir bereits 3 Möglichkeiten genannt. Entweder, du machst es per Logger-Klasse oder du benutzt trigger_error(). Und ja, dafür musst du eine Transaktion durchführen. Kannst ja einen Cent-Betrag benutzen.

Du kannst es ja auch in der Sandbox mal loggen, was da eigentlich ankommt. Werden sonst irgendwelche Operationen mit $res gemacht außer das es auf "VERIFIED" geprüft wird? Vermutlich kommt aber eher sowas wie oben, also ein FAILURE.

Du sollest es eigentlich so implementieren:

PHP:
parse_str($res, $response_vars);
trigger_error("Error code was " . $response['L_ERRORCODE1']);
trigger_error("Error message was " . $response['L_LONGMESSAGE1']);

Dann schaust du in das Error.log des Apachen.
 
Zurück