Code-Schnipsel erklären

Spakkn

Mitglied
Hallo Leute.

Ich habe hier einen PHP-Code, den ich nicht so ganz raffe. Vielleicht kann mir das Teil kurz jemand erklären Und zwar geht es um eine Paypal geschichte. Wenn man Paypal als Partner für Zahlungen nutzt, werden Daten zur Überprüfung an die eigene Homepage gesendet. Paypal erwartet dann eine Bestätigung der Daten. Hier das Beispielscript von denen:

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 ('www.paypal.com', 80, $errno, $errstr, 30);

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

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
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
?>

Was genau passiert da? Vielen Dank schon einmal!
 
Es wird der String cmd=_notify-validate und die Information $key=$value ($key und $value sind Variablen und werden zur Laufzeit in den String gepackt) an paypal.com uebertragen, und zwar per POST an das CGI webscr. Und das ganze ueber HTTP 1.0.
Die ganzen Daten die aus $_POST geholt werden werden nicht uebertragen.

Naeheres zu HTTP gibt es hier.
Naeheres zu HTTP mit PHP gibt es hier
 
Vielen Dank für die schnelle Antwort.

Folgende Zeilen sind also für das Senden der Daten an Paypal zuständig:
Code:
// 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);

Soweit richtig? Und der Überprüfungs-Part ist nur für die eigene, interne Verarbeitung:
Code:
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
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}

Stimmt meine Annahme?
 
fsockopen() baut lediglich die Verbindung zum Server auf.
Die Anfrage wird hier mit fputs() gesendet und die Antwort mit fgets() ausgelesen.
Die Antwort wird waehrend dem Auslesen verarbeitet. Das wuerde aber auch nach Beendigung des Auslesens der Antwort gehen.
 
Ok, da bin ich wieder :)
Eigentlich sollte das Beispielscript von Paypal schon von Haus aus funktionieren, denke ich. Das sieht derzeit noch fast original aus:

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 ('www.eliteweaver.co.uk', 80, $errno, $errstr, 30);

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

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
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
?>

Das Ganze kann man im Web auch testen. Und zwar hier:
http://www.eliteweaver.co.uk/testing/ipntest.php

Und dieses ist die Adresse meines Scriptes:
http://www.broken-angels.de/ipntest.php

Die Adresse muss man bei IPN Handler eingeben, um das Teil zu testen. Leider gibt der Test aus, dass das Script nicht antwortet. Hab ich etwas falsch verstanden oder wieso will das Teil so nicht?
 
Zurück