IPN von Paypal integrieren

Was ist IPN und wie kann ich es integrieren?

Wenn du einen Button erstellen willst, kannst du das ganz einfach über PayPal machen. Du musst also kein kompliziertes Programm schreiben. Willst du allerdings die Transaktion prüfen und in deiner Datenbank speichern, so musst du IPN nutzen. Es dient also der Automatisierung von Käufen auf deiner Webseite, so dass du nicht jede Stunde in deinen Account schauen musst, ob Geld eingegangen ist. Falls du Sachen verschicken musst, so bekommst du viele Daten über IPN, unter anderem auch die Versandadresse. Sobald jemand auf deiner Seite etwas kauft, so kannst du einstellen, dass an eine bestimmte Adresse (also an deine Seite) eine IPN-Nachricht geschickt wird. Diese Nachricht ist eine Bestätigung des Kaufs und du kannst diese Benachrichtigung nutzen, um Kaufdaten zu erhalten, z.B. die Versandadresse, an die du das gekaufte Produkt senden kannst. IPN steht für Instant Payment Notification, das bedeutet sofortige Benachrichtigung über eine Zahlung. Da das Internet manchmal Probleme hat, werden IPN-Nachrichten solange versendet, bis du antwortest. Du hast auf deiner Seite also ein Programm, dass diese Nachrichten erwartet und empfängt. Das nennt man einen Listener (Übersetzt: Zuhörer). Der Code wird von Paypal bereitgestellt. Der folgende Link verweist auf eine Erklärung auf Enlisch.

Einen Button erstellen

Du klickst auf Tools/alle Tools und dann scrollst du runter bis zu Paypal-Buttons. Du klickst dann auf Paypal-Buttons.


Paypal Buttons auswählen im Paypal Konto

Hier klickst du auf neuen Button erstellen.


button erstellen im Paypal konto

Du kannst wählen zwischen Warenkorb, Spenden-Button oder jetzt kaufen.


Button aussuchen

Oben gibst du den Namen ein.


Name

In Schritt 2 kannst du dein Lager verwalten. Falls du nicht mehr genug Produkte auf Lager hast, bekommst du eine E-Mail.

Lagerverwaltung

In Schritt 3 Musst du die Url eingeben, zu der die IPN gesendet werden soll (notify-synch).

Weiterleitungs-URL nicht vergessen

Sobald du den Button-Code in deine Seite eingefügt hast, musst du deinen IPN-Handler erstellen. Du kannst diesen hier einfach überarbeiten oder übernehmen. Im Prinzip brauchst du ihn auch nicht, denn du kannst alle Angaben auch im Dashboard sehen, sobald jemand etwas gekauft hat, du musst dich dann aber immer einloggen, um zu gucken, ob jemand etwas gekauft hat. Um den Ablauf zu automatisieren, kannst du dich z.B. per Mail über den Kauf informieren lassen, oder automatisch eine Rechnung verschicken und die Daten direkt speichern. Das musst du ja als Unternehmer, auch wenn du nur Kleinunternehmer bist.

ipn-Adresse eingeben

Im Dashboard, also im PayPal-Konto selbst, hat man auch die Möglichkeit, dem Kunden eine Trackingnummer des versandten Artikels zu schicken. Du versendest das Produkt und musst selber die Nummr eingeben. Der Kunde bekommt dann folgende Mail.

Mail mit Trackingnummer von PayPal

IPN-handler.php


<?php

// Schritt 1: den Post-Stream auslesen
// Wenn du die $_POST Variable benutzt, anstatt den gesamten Stream auszulesen
// könnten Probleme auftauchen.
// Nehme also lieber die Post-Daten aus dem eingehenden Post-Stream

$raw_post_data = file_get_contents('php://input');

// die einzelnen Daten sind mit dem & separiert
// wir nutzen das, um die Daten schön säuberlich
// in einem Array zu speichern
$raw_post_array = explode('&', $raw_post_data);






// das Array $myPost wird erzeugt
// und ihm werden die Post-Daten zugewiesen
// Die einzelnen Daten werden in 
// Name-Wert-Paare gespeichert
// Es werden nichtnumerische 
// Schlüssel verwendet, um die enthaltenen 
// Elemente zu adressieren (Assoziatives-Array).
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
    $myPost[$keyval[0]] = urldecode($keyval[1]);
}




// eine Zeichenkette namens $req wird erzeugt. 
// Diese Kette wird an Paypal 
// mit Curl zurückgesendet.
// Der erste Bestandteil ist cmd=_notify-validate
// Das dient der Validierung der Daten.
// Der komplette Text muss, wie erhalten, 
// zurückgesendet werden

$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc')) {
  $get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
  if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
    $value = urlencode(stripslashes($value));
  } else {
    $value = urlencode($value);
  }
  $req .= "&$key=$value"; // $req wird erzeugt.
}




// Adresse für curl angeben
// hier muss die richtige Adresse eingetragen werden. 
// Für die Sandbox muss vorne sandbox in der URL stehen.

$ch = curl_init('https://ipnpb.sandbox.paypal.com/cgi-bin/webscr');




// curl-Objekt initialisieren
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// In wamp-like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "https://curl.haxx.se/docs/caextract.html" and set
// the directory path of the certificate as shown below:
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');



// Falls ein Fehler passiert, wird der Vorgang abgebrochen.
// Falls nicht, wird nur die Verbindung zu Paypal geschlossen,
// nachdem in $res die Antwort gespeichert wurde.
// Die Antwort ist entweder VERIFIED  oder INVALID.
// Ausführen von Curl mit curl_exec($ch)
if ( !($res = curl_exec($ch)) ) {
  // error_log("Got " . curl_error($ch) . " when processing IPN data");
  curl_close($ch);
  exit;
}
curl_close($ch);






// dieser Teil ist nicht komplett, den musst du selber implementieren.
// Zuallererst prüfst du, ob VERIFIED zurückgegeben wurde
// Diese Prüfung ist hier implementiert.
// Außerdem werden die Post-Daten an
// bestimmte Variablen zugewiesen,
// aber das musst du so machen, wie es 
// dir in den Kram passt.
//
//
// Du musst noch (WICHTIG):
//--------------------------
//
// 1. prüfen, ob payment_status Completed ist. 
// 2. prüfen, ob die Transaktions-Id nicht schon 
//    verarbeitet wurde.
//    Du prüfst es mit der txn_id.
// 3. prüfen, dass du auch der Empfänger bist
//    mit receiver_email.
// 4. prüfen, ob du auch die richtige Summe bekommen hast
//    mit payment_amount.
// 5. Du prüfst die Währung 
//    mit payment_currency.
// 6. Dann musst du die Daten verarbeiten,
//    z.B. in deiner Datenbank speichern.
// 
// Um den Vorgang zu prüfen, habe ich die Daten erstmal auf 
// dem Server in
// der Datei Daten.html abgespeichert.

if (strcmp ($res, "VERIFIED") == 0) {
  $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'];
  // IPN message values depend upon the type of notification sent.
  
  
  
  
  // Daten in Datei speichern. Du musst an dieser Stelle die Daten
  // verarbeiten, der folgende Code prüft nur,
  // ob der Ablauf funktioniert.
  $daten = print_r ($myPost, true);
  $daten1 = print_r ($req, true);
  $Dateiinhalt = "<pre>".$daten."<br />".$daten1."</pre>";
  file_put_contents("Daten.html", $Dateiinhalt);
  
  
  

  
  
  
  
  
  
} else if (strcmp ($res, "INVALID") == 0) {
  // IPN invalid, log for manual investigation
  echo "The response from IPN was: <b>" .$res ."</b>";
}
?>

Description: Wir erklären heute, wie man auf seiner Webseite IPN von Paypal integriert. Wir schauen uns die zugrunde liegende Technik an, so dass du auch selbst IPN-Nachrichten verarbeiten kannst.

Keywords: IPN, Sofort, kaufen, Verkaufen, Paypal, Button, Verkauf, sale, abwickeln, Abwicklung, Verkäufer, Käufer, Transaktion, transaction, Zahlung, Payment, erstellen, integrieren, Spenden-Link, onlineshop, online, shop
Geschrieben:
Sprache: de (Deutsch)

Primitivecode ist Grammatik pur. Aber Programmieren kommt auch nicht zu kurz, denn die Seite mache ich allein. Informationen zum Datenschutz findest du hier.