Hallo Leute,
Sorry für dieses nochmalige Nachfragen, aber ich hab jetzt seit 3 Tagen herumgebastelt, und gegoogled wie ein blöder.
So oft ich mir auch diverse Foreneinträge durchlese, ich komme nicht auf das
KERN-PROBLEM.
Fakten:
Ich will auf meiner Seite eine Paypal Bezahllösung anbieten.
Paypal Konto hatte ich schon, dann einiges zum Thema durchgelesen OK.
Es gibt die Möglichkeit via
1.) IPN (Instant Payment Notification) wird von allen als bevorzugte Methode empfolen
2.) PDT (Payment Data Transfer)
3.) Ich denke es gibt auch noch eine "manuelle" Methode ? (wird nicht empfohlen)
So ich hab wie gesagt kurz alles überdacht und bin zum Entschluss gekommen, dass ich es mit IPN einbinden will.
Umgebung:
Meine Seite ist auf SSL Basis mit einem Class1 SSL Zertifikat.
In meinem Paypal Konto habe ich auch die Option nur erlauben von SSL gesicherten Seiten akzeptieren angehakt (Button input Daten werden dann bei Paypal gehostet) = hosted_button_id -> Stimmt soweit oder?
Ich habe einen zweiten Paypal Account wo ich meinen Testartikel für 0,01 € kaufe.
Die Scripts habe ich von Paypaltech.com (nützen scheinbar eh einige User auch).
Übermittlung erfolgt ins Paypal Live System mit SSL (habs aber auch schon ohne SSL versucht selbes Ergebnis.
Unklarheiten:
Bei IPN Methode sind input
return und
rm notwendig?
Was ist die
success.php (kommt beim Button erstellen vor) ist das gleich wie notify_url?
Muss ich unbedingt an Paypal input Daten senden, weil ich bekommen im
$POST nichts retour? -> Gibt es initiale Daten die man schicken
MUSS?
Was geschieht danach, muss ich dafür sorgen (PDT/IPN) dass die
Transaktionsnummer bei mir in der Datenbank gespeichert wird, Falls der User den Link mit den "GET Parametern" kopiert und nochmals in den Browser eingibt, oder sollte dass dann Paypal schon abfangen, bzw. liegt da vielleicht der Unterschied zu PDT/IPN?
Leider steht dass nirgendwo GUT beschrieben.
Eigentliches Problem:
Ich bekomme vom Paypal System via IPN Methode diese Meldung retour.
The response from IPN was: INVALID (paypaltech.com script mit html als ausgabe).
ICH ERHALTE JEDOCH DAS GELD****? Manche User haben scheinbar ein ähnliches Problem geschildert diese erhielten jedoch KEIN GELD...
Hier noch im Detail wenn ich $res ausgeben lasse:
Code:
HTTP/1.1 200 OK Date: Tue, 21 Feb 2012 20:41:16 GMT Server: Apache X-Frame-Options: SAMEORIGIN Set-Cookie: cwrClyrK4LoCV1fydGbAxiNL6iG=Fc4RU2_uQox0xS5CFC5NDKjJbo9Y2KJfTwnKERK7D5JvGjup2qsqm4ZKY3dGDYXxR1V6BSnMZ8mHoFwQwNjjnd3AZsUS4LsjS9LTi0nVxliowow1gbj890soDLu%7cOjmI5KQ_sIhIPjIomR-iLAQk53qQE5Crltx2yiSnYg7oq5rs-z7H7CDoTSjV2RcqmI6560%7c19MepPah4w_eUebyETEyHhoXvGG_gK0Bv80lBRupCCPtYBmf5FqwuWubve_UK5-TS5xtQ0%7c1329856876;
domain=.paypal.com; path=/; Secure; HttpOnly Set-Cookie: cookie_check=yes; expires=Fri, 18-Feb-2022 20:41:16 GMT;
domain=.paypal.com; path=/; Secure; HttpOnly Set-Cookie: navcmd=_notify-validate;
domain=.paypal.com; path=/; Secure; HttpOnly Set-Cookie: navlns=0.0; expires=Mon, 16-Feb-2032 20:41:16 GMT;
domain=.paypal.com; path=/; Secure; HttpOnly Set-Cookie: Apache=10.73.8.52.1329856876414885;
path=/; expires=Thu, 13-Feb-42 20:41:16 GMT Vary: Accept-Encoding Strict-Transport-Security: max-age=14400 Connection: close
Content-Type: text/html; charset=UTF-8 INVALID
The response from IPN was: INVALID
Weiter unten habe ich meine beiden INPUT und OUTPUT Files gepostet.
Workaround:
Wenn ich die PDT Methode verwende, dann funktioniert es prächtig, aber ich habe immer das ungute Gefühl das PDT vielleicht nicht so sicher oder veraltet ist...
Und ausserdem würd ich das IPN Problem doch ganz gerne verstehen und lösen.
Danke schon mal im Voraus fürs
LESEN und vielleicht hat ja jemand eine Idee warum dass bei mir nicht funkt.
PHP Code Eingabe (paypal.php):
PHP:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="X9FM744LC4K3S">
<input type="hidden" name="return" value="https://mysite.com/ipn.php?userid=<?php echo $vv_uid; ?>">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="notify_url" value="https://mysite.com/ipn.php">
<input type="image" src="https://www.paypalobjects.com/de_DE/AT/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="Jetzt einfach, schnell und sicher online bezahlen – mit PayPal.">
<img alt="" border="0" src="https://www.paypalobjects.com/de_DE/i/scr/pixel.gif" width="1" height="1">
</form>
PHP Code Ausgabe (ipn.php)
PHP:
<?php
// Revision Notes
// 11/04/11 - changed post back url from https://www.paypal.com/cgi-bin/webscr to https://ipnpb.paypal.com/cgi-bin/webscr
// For more info see below:
// https://www.x.com/content/bulletin-ip-address-expansion-paypal-services
// "ACTION REQUIRED: if you are using IPN (Instant Payment Notification) for Order Management and your IPN listener script is behind a firewall that uses ACL (Access Control List) rules which restrict outbound traffic to a limited number of IP addresses, then you may need to do one of the following:
// To continue posting back to https://www.paypal.com to perform IPN validation you will need to update your firewall ACL to allow outbound access to *any* IP address for the servers that host your IPN script
// OR Alternatively, you will need to modify your IPN script to post back IPNs to the newly created URL https://ipnpb.paypal.com using HTTPS (port 443) and update firewall ACL rules to allow outbound access to the ipnpb.paypal.com IP ranges (see end of message)."
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
print_r($_POST);
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";
//If testing on Sandbox use:
//$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$fp = fsockopen ('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
//$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
echo $res;
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);
}
?>