it-swarm.com.de

Erhalten Sie nach einer Transaktion Informationen von Paypal

Ich möchte eine einfache Transaktion auf meiner Website erstellen. Nach Abschluss der Transaktion möchte ich, dass Paypal den Benutzer an einen Ort auf meiner Website weiterleitet, und ich möchte, dass Paypal mir Details zur Verfügung stellt, sodass ich PHP, um es zu analysieren und ihnen den Link zum Kauf per E-Mail zu senden. Ich bin nicht sicher, was notify_url macht? Vielen Dank

24
jmasterx

Paypal funktioniert so:

Sie haben ein Formular mit der Schaltfläche "Kaufen". Wenn Sie darauf klicken, werden Informationen (Produkt, Preis, Name Ihres Kontos usw.) an Paypal gesendet.

Der Käufer erklärt sich damit einverstanden, Sie zu bezahlen. Wenn die Transaktion abgeschlossen ist, sendet Paypal eine "IPN" (Instant Payment Notification) an Ihre Benachrichtigungs-URL - es sendet POST -Daten an diese URL, die Ihr Server verarbeiten kann. Sie antworten an Paypal, um zu fragen, ob sie die POST -Daten gesendet haben (anstatt einen Betrüger) und wenn sie dann antworten, dass es sich um eine echte Transaktion handelt, können Sie das Produkt dem Kunden freigeben. Beachten Sie, dass dies alles im Hintergrund geschieht, während sich Ihr Käufer noch auf der Paypal-Website befindet.

Es gibt eine abschließende optionale Phase, in der Paypal den Käufer auf Ihre Website zurückbringt. In diesem Fall senden sie den Käufer an Ihre "return" -URL zurück, und sie können (optional) die Transaktionsdaten erneut zurückgeben (sie nennen diese PDT). Und Sie können noch einmal mit Paypal prüfen, ob dies eine gültige Transaktion ist, und an dieser Stelle einen Download bereitstellen.

Das Schwierigste, das niemand erklärt, ist, dass der Käufer nicht an Ihre Benachrichtigungs-URL weitergeleitet wird. Das heißt, der "Besucher" für die Benachrichtigungs-URL Ihrer Website ist Paypal, nicht der Käufer . Dies geschieht also nicht im Rahmen der Sitzung Ihres Käufers. Wenn Sie eine Sitzung in allen drei Teilen dieses Prozesses beibehalten möchten, müssen Sie ein Mittel zur Nachverfolgung des Käufers in Ihrem Formular erstellen und dieses in einem Feld des Formulars "custom" an Paypal übergeben. Diese Daten werden in den IPN- und PDT-Daten an Sie zurückgegeben, und Sie können diese verwenden, um eine Verbindung mit der ursprünglichen Benutzersitzung herzustellen.

Sie müssen wirklich sowohl IPN als auch PDT implementieren. Wenn die IPN-E-Mail fehlschlägt, haben Sie PDT als Sicherung. Wenn der Benutzer seinen Webbrowser schließt, bevor er zu Ihrer PDT-Seite zurückgeleitet wird, haben Sie eine IPN-E-Mail als Sicherungskopie gesendet.

Suchen Sie nach IPN und PDT und Sie finden eine Menge Informationen. Paypal hat auch eine vollständige Dokumentation und Beispielskripte.

57
Jason Williams

Die Benachrichtigungs-URL sollte zu dem Skript führen, in dem die von Paypal zurückgegebenen Daten gespeichert werden, beispielsweise:

   /** Fetch order from Paypal (IPN reply)
    * @return int received ID of inserted row if received correctly, 0 otherwise
    */
   function FetchOrder()
   {
   $transactionID=$_POST["txn_id"];
   $item=$_POST["item_name"];
   $amount=$_POST["mc_gross"];
   $currency=$_POST["mc_currency"];
   $datefields=explode(" ",$_POST["payment_date"]);
   $time=$datefields[0];
   $date=str_replace(",","",$datefields[2])." ".$datefields[1]." ".$datefields[3];
   $timestamp=strtotime($date." ".$time);
   $status=$_POST["payment_status"];
   $firstname=$_POST["first_name"];
   $lastname=$_POST["last_name"];
   $email=$_POST["payer_email"];
   $custom=$_POST["option_selection1"];
   if ($transactionID AND $amount)
      {
      // query to save data
      return $this->insertID;
      }
   else
      {
      return 0;
      }
   }

Sie können eine Bestellung auch später bestätigen:

/** Verify Paypal order (IPN)
    * Paypal returns VERIFIED or INVALID on request
    * @return bool verified 1 if verified, 0 if invalid
    */
   function VerifyOrder()
   {
   $_POST["cmd"]="_notify-validate";
   $ch=curl_init();
   curl_setopt($ch,CURLOPT_HEADER,0);
   curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch,CURLOPT_USERAGENT,"your agent - replace");
   curl_setopt($ch,CURLOPT_URL,"https://www.Paypal.com/cgi-bin/webscr");
   curl_setopt($ch,CURLOPT_POST, 1);
   foreach ($_POST as $key=>$value)
      {
      $string.="&".$key."=".urlencode(stripslashes($value));
      }
   curl_setopt($ch, CURLOPT_POSTFIELDS, $string);
   $result=curl_exec($ch);
   if ($result=="VERIFIED") return 1;
   else return 0;
   }
6
dusoft
$tx=$_REQUEST['tx'];

$Paypal_url='https://www.Paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx='.$tx.'&at=token here';

$curl = curl_init($Paypal_url);

$data = array(

"cmd" => "_notify-synch",

"tx" => $tx,

"at" => "token here"


);                                                                    

$data_string = json_encode($data); 

curl_setopt ($curl, CURLOPT_HEADER, 0);

curl_setopt ($curl, CURLOPT_POST, 1);

curl_setopt ($curl, CURLOPT_POSTFIELDS, $data_string);

curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1);

$headers = array (

'Content-Type: application/x-www-form-urlencoded',

'Host: www.Paypal.com',

'Connection: close'

);

curl_setopt ($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);

$lines = explode("\n", $response);

$keyarray = array();

if (strcmp ($lines[0], "SUCCESS") == 0) {

for ($i=1; $i<count($lines);$i++){

list($key,$val) = explode("=", $lines[$i]);

$keyarray[urldecode($key)] = urldecode($val);

}


$first_name=$keyarray['first_name'];

$last_name=$keyarray['last_name'];

$payment_status=$keyarray['payment_status'];

$business=$keyarray['business'];

$payer_email=$keyarray['payer_email'];

$payment_gross=$keyarray['payment_gross'];

$mc_currency=$keyarray['mc_currency']; 

}
2
krishana singh

Beim Parsen der PDT-Antwort verwende ich parse_str . Da der Hauptteil der Antwort url-codiert ist, müssen Sie nur die Zeilenumbrüche durch Ampersand-Zeichen ersetzen

$result = curl_exec($ch);    
//replace the breaks with '&'
$r_string = str_replace("\n", "&", $result);
//parse the response into a key->value array
                    parse_str($r_string, $this->details);
                    if(!isset($this->details['SUCCESS'])){
                 //the "SUCCESS" or "FAIL" response is the first key   
    return FALSE;
                    }
                    else{
//the values of the response are now in an array
                        return TRUE;

                    }

je nach Anwendung können Sie sogar den zweiten Parameter weglassen ( $ this-> details ) und die Werte werden als globale Variablen festgelegt. 

0
Ethan