Festlegen der PayPal-Rückgabe-URL und automatische Rückgabe?


127

Dies ist eine Folgefrage an: PHP: Einfacher Weg, um PayPal Checkout zu starten?

Mein Problem ist also, dass ich die Rückgabe-URL spezifiziere. Nachdem ich jedoch mit PayPal bezahlt habe, erhalte ich einen Bildschirm mit der Aufschrift:

Sie haben soeben Ihre Zahlung abgeschlossen. XXXX, Sie haben gerade Ihre Zahlung abgeschlossen. Ihre Transaktions-ID für diese Zahlung lautet: XXXXXXXXXXXXX.

Wir senden eine Bestätigungs-E-Mail an XX@XXXX.com. Diese Transaktion wird auf Ihrem Kontoauszug als PAYPAL angezeigt.

Go to PayPal account overview

Ich brauche es, um diesen Bildschirm nicht anzuzeigen und direkt zur Rückgabe-URL zu gehen. Ich habe:

  • Setzen Sie die Variable "return"
  • Setzen Sie die Variable "rm" auf: 2 (was laut Leitfaden = " der Browser des Käufers wird mithilfe der POST-Methode zur Rückgabe-URL umgeleitet, und alle Zahlungsvariablen sind enthalten ")

In der Tat ist hier meine ganze Form:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="onlinestore@thegreekmerchant.com" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

Irgendeine Idee, wie ich es dazu bringen kann, automatisch zurückzukehren? Wie kann ich alternativ das Ergebnis der Zahlung auf meine Website zurückholen, damit ich die Datenbank aktualisieren kann? Was ist IPN?


Bitte beachten Sie, dass der eingegebene Host in Ihrem benutzerdefinierten Rückgabeparameter mit dem in Ihrem Paypal-Konto konfigurierten identisch sein muss.
Andreas

Antworten:


199

Sie müssen die automatische Rückgabe in Ihrem PayPal-Konto aktivieren, andernfalls wird das returnFeld ignoriert .

Aus der Dokumentation (aktualisiert, um das neue Layout von Januar 2019 widerzuspiegeln):

Die automatische Rückgabe ist standardmäßig deaktiviert. So aktivieren Sie die automatische Rückgabe:

  1. Melden Sie sich bei Ihrem PayPal-Konto unter https://www.paypal.com oder https://www.sandbox.paypal.com an. Die Seite Übersicht über mein Konto wird angezeigt.
  2. Klicken Sie oben rechts auf das Zahnradsymbol. Die Seite Profilübersicht wird angezeigt.
  3. Klicken Sie in der linken Spalte auf den Link Meine Verkaufseinstellungen.
  4. Klicken Sie im Abschnitt Online verkaufen auf den Link Aktualisieren in der Zeile für Website-Einstellungen. Die Seite Website-Zahlungseinstellungen wird angezeigt
  5. Klicken Sie unter Automatische Rückgabe für Website-Zahlungen auf das Optionsfeld Ein, um die automatische Rückgabe zu aktivieren.
  6. Geben Sie im Feld Rückgabe-URL die URL ein, zu der Ihre Zahler nach Abschluss ihrer Zahlungen umgeleitet werden sollen. HINWEIS: PayPal überprüft die von Ihnen eingegebene Rückgabe-URL. Wenn die URL nicht richtig formatiert ist oder nicht validiert werden kann, aktiviert PayPal die automatische Rückgabe nicht.
  7. Scrollen Sie zum Ende der Seite und klicken Sie auf die Schaltfläche Speichern.

IPN dient zur sofortigen Zahlungsbenachrichtigung. Sie erhalten zuverlässigere / nützlichere Informationen als die automatische Rückgabe.

Die Dokumentation für IPN finden Sie hier: https://www.x.com/sites/default/files/ipnguide.pdf

Online-Dokumentation für IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

Das allgemeine Verfahren besteht darin, dass Sie einen notify_urlParameter mit der Anforderung übergeben und eine Seite einrichten, die IPN-Benachrichtigungen verarbeitet und validiert. PayPal sendet Anforderungen an diese Seite, um Sie zu benachrichtigen, wenn Zahlungen / Rückerstattungen / etc. durchgehen. Diese IPN-Handler-Seite ist dann der richtige Ort, um die Datenbank zu aktualisieren und Bestellungen als bezahlt zu markieren.



5
Mit dem neuen Website-Layout von Paypal ist dies nicht mehr genau. Schritt 3) Klicken Sie auf My Selling Tools Schritt 4) Klicken Sie Website PreferencesunterSelling Online
Webnet

2
IPN sollte verwendet werden, um zu überprüfen, ob die Bestellung von PayPal korrekt bearbeitet wurde. Sie benötigen jedoch weiterhin die Rücksende-URL, um dem Benutzer anzuzeigen, dass Sie über den Erfolg informiert sind. So oft erhalten Benutzer die von Ihnen gesendete E-Mail nicht, daher ist es schön, wenn sie sofort auf das Produkt zugreifen können (Download usw.).
pcunite

1
@ Kevin Stricker Wie können wir die Rückgabe-URL für 2 verschiedene Websites einrichten? Zum Beispiel, wenn ich ein Paypal-Konto für 2 Websites verwende, aber mit Ihren Schritten nur eine URL als Rückgabe-URL hinzufügen kann. Wie kann ich das für 2 Websites verwenden?
Gaurav

4
Es ist nicht ganz richtig, dass "Sie die automatische Rückgabe in Ihrem PayPal-Konto aktivieren müssen, sonst wird das returnFeld ignoriert ." Jeder returnURL-Parameter, den Sie an die Kasse übergeben, wird berücksichtigt und überschreibt jede Auto Pay-URL (oder deren Fehlen), die im PayPal-Kontoprofil des Verkäufers konfiguriert ist. Wenn dort jedoch die automatische Rückgabe nicht aktiviert ist, muss der Käufer manuell auf die URL klicken Ende der Kaufabwicklung, um zu dieser URL umgeleitet zu werden, anstatt automatisch umgeleitet zu werden.
SubGothius

42

Musterformular mit PHP für Direktzahlungen.

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="you@youremail.com">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

Bitte gehen Sie die Felder notify_url, return, cancel_return durch

Beispielcode für die Verarbeitung von ipn (my_ipn.php), der von Paypal nach erfolgter Zahlung angefordert wird.

Weitere Informationen zum Erstellen eines IPN finden Sie unter diesem Link.

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from PayPal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to PayPal's server using curl, and validate everything with PayPal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$url = "https://www.paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("you@youremail.com", "IPN interaction not verified", "$req", "From: you@youremail.com");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "you@youremail.com") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("you@youremail.com", "NORMAL IPN RESULT YAY MONEY!", $req, "From: you@youremail.com");
?>

Das folgende Bild hilft Ihnen beim Verständnis des Paypal-Prozesses. Paypal-Prozessablauf

Weitere Informationen finden Sie unter den folgenden Links.

hoffe das hilft dir .. :)


1
Weiß jemand, ob dies mit den heutigen Paypal-APIs noch gültig ist? Ich sehe, dass die Frage 2 Jahre alt ist.
Matt Welander

1
Die URLs 'return' und 'cancel_return' werden verwendet, um dem Käufer sofortiges Transaktionsfeedback zu geben, und können dafür PDT-Variablen verwenden. PP versucht es jedoch nur einmal mit ihnen, sodass sie sich nicht auf die kritische Auftragserfüllung verlassen können (sagen wir, der Käufer schließt den Browser nach der Zahlung, aber immer noch bei PP). Zu diesem Zweck möchten Sie es möglicherweise auch mit dem zuverlässigen IPN-Prozess über 'notify_url' sichern und mindestens den Status 'Abgeschlossen' verarbeiten (vorausgesetzt, alles andere ist fehlgeschlagen und erfordert möglicherweise eine manuelle Aushandlung). Ihre PDT- und IPN-Serververarbeitung muss sicherstellen, dass die Bestellung nur einmal ausgeführt wird.
Patanjali

Ich glaube, die Dinge haben sich geändert und Paypal success.php funktioniert jetzt nur noch mit GET-Variablen. Siehe hier: stackoverflow.com/questions/45671366/…
Sol

23

Ein Weg, den ich gefunden habe:

Versuchen Sie, dieses Feld in Ihren generierten Formularcode einzufügen:

<input type='hidden' name='rm' value='2'>

rm bedeutet Rückgabemethode ;

2 bedeutet (Post)

Nach dem Kauf und der Rückkehr des Benutzers zu Ihrer Website-URL erhält diese URL auch die POST-Parameter

ps Wenn Sie PHP verwenden, versuchen Sie, diese var_dump($_POST);in Ihre Rückgabe-URL (Skript) einzufügen , und tätigen Sie dann einen Testkauf. Wenn Sie zu Ihrer Site zurückkehren, sehen Sie, welche Variablen in Ihrer URL enthalten sind.


Hast du das tatsächlich benutzt?
Simon Gibbs

Das war großartig. Solange die Zahlungsdatenübertragung in Paypal deaktiviert ist, werden alle Post-Einstellungen an die Rückgabe-URL gesendet.
JulianJ

4

Teilen Sie dies, da ich kürzlich auf ähnliche Probleme wie diesen Thread gestoßen bin

Mein Skript hat lange Zeit gut funktioniert (Basiszahlungsformular) und die POST-Variablen auf meiner success.php-Seite und die IPN-Daten auch als POST-Variablen zurückgegeben. In letzter Zeit bemerkte ich jedoch, dass die Rückgabeseite (success.php) keine POST-Variablen mehr erhielt. Ich habe in Sandbox getestet und lebe und ich bin mir ziemlich sicher, dass PayPal etwas geändert hat!

Die notify_url empfängt weiterhin die richtigen IPN-Daten, mit denen ich die Datenbank aktualisieren kann, aber ich konnte auf meiner Rückgabe-URL-Seite (success.php) keine Erfolgsmeldung anzeigen.

Obwohl ich viele Kombinationen ausprobiert habe, um Optionen in den Zahlungseinstellungen und im IPN der PayPal-Website ein- und auszuschalten, musste ich einige Änderungen an meinem Skript vornehmen, um sicherzustellen, dass ich eine Nachricht weiterhin verarbeiten kann. Ich habe dies erreicht, indem ich PDT und Auto Return aktiviert habe, nachdem ich dieser hervorragenden Anleitung gefolgt bin .

Jetzt funktioniert alles gut, aber das einzige Problem ist, dass die Rückgabe-URL alle PDT-Variablen enthält, was hässlich ist!

Dies kann auch hilfreich sein


3

Ich denke, dass die Idee, die Auto Return-Werte wie oben von Kevin beschrieben einzustellen, etwas seltsam ist!

Angenommen, Sie haben eine Reihe von Websites, die dasselbe PayPal-Konto für die Abwicklung Ihrer Zahlungen verwenden, oder Sie haben mehrere Abschnitte auf einer Website, die unterschiedliche Einkaufsaufgaben ausführen und bei der Zahlung unterschiedliche Absenderadressen benötigen abgeschlossen. Wenn ich auf meiner Seite eine Schaltfläche einfüge, wie oben im Abschnitt "Beispielformular mit PHP für Direktzahlungen" beschrieben, sehen Sie, dass dort eine Zeile vorhanden ist:

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

Hier legen Sie den individuellen Rückgabewert fest. Warum muss es generell auch im Profilbereich eingestellt werden?!?!

Da Sie im Profilabschnitt nur einen Wert festlegen können, bedeutet dies (AFAIK), dass Sie die automatische Rückgabe nicht für eine Site mit mehreren Aktionen verwenden können.

Kommentare bitte ??


3
Der Rückgabeparameter kann für jedes Formular übergeben werden, das das Setup der URL für die automatische Rückgabe in der Paypal-Konfiguration
überschreibt

1
Ja, was DropHit gesagt hat, das ist nur der Standardwert für die automatische Rückgabe, falls Sie vergessen, ihn als Parameter zu übergeben. Wenn Sie es als Parameter übergeben, wird Ihre Rückgabe-URL für jede Ihrer Websites verwendet.
Hamish


@DropHit Funktioniert PDT dann immer noch mit Überschreibungswerten pro Schaltfläche return? Ich kann also verschiedene Rückgabeseiten haben, auf denen immer noch alle PDT-Daten empfangen werden.
Dai

Entschuldigung für die späte Antwort - ich bin nicht sicher, ob es funktionieren wird, ABER meine aktuellen Integrationen funktionieren immer noch wie erwartet, obwohl dies nicht garantiert, dass Ihr Anwendungsfall so funktioniert wie meiner
DropHit

1

Suchen Sie auf der Checkout-Seite nach dem versteckten Formularelement 'cancel_return':

Setzen Sie den Wert des Formularelements cancel_return auf die URL, zu der Sie zurückkehren möchten:


Tatsächlich wird "Rückgabe abbrechen" nur verwendet, wenn die Transaktion fehlschlägt. Sie MÜSSEN auch eine 'Return'-URL angeben, um erfolgreich abgeschlossene Transaktionen abzuwickeln. Andernfalls wird die Standard-URL für diese Transaktionen verwendet.
Patanjali

Nicht wenn die Transaktion fehlschlägt, sondern wenn der Käufer während der Kaufabwicklung auf den Link "Abbrechen und zurück zum [Händlernamen]" klickt, um den Abschluss seiner Bestellung abzubrechen.
SubGothius
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.