PayPal IPN und C# - Was ist überhaupt das Szenario?
Ich habe auf meiner Homepage einen sogenannten Buy Now Button von PayPal eingebaut. Damit kann der Benutzer den Lizenzschlüssel für die Software KML Manager bezahlen. Dummerweise mußte ich dann immer manuell aktiv werden. Ich habe von PayPal eine email erhalten und habe dann dem Benutzer den Lizenzschlüssel per email zugeschickt. Diesen Schritt wollte ich automatisieren und bin dabei auf PayPals Instant Payment Notification (IPN) gestoßen. Leider hat sich die Integration aus diversen Gründen als problematisch herausgestellt.
Die Vorbedingungen
Um IPN Nachrichten zu erhalten sind einige Vorbedinungen zu beachten. Einmal muss der Listener (das ist der Service, den man selber entwickeln muss und an den PayPal seine Nachricht schickt) SSL verschlüsselt sein und muss öffentlich erreichbar sein. Man muß auch ein sogenanntes Händlerkonto besitzen. Denn nur dort kann man aktivieren, daß man IPN Nachrichten bekommt.
Die Technik drumherum und der Ablauf
Meine Webseite basiert auf PHP. Der PayPal Button selber ist nur ein simples HTML Formular, welches man mit dem Button Generator erzeugen kann. Danach habe ich zwei Accounts in der PayPal Sandbox angelegt (ein Händler Konto und ein "normales" Konto). Diese muss man im Developer Dashboard durchführen.

Der Login der Sandbox URL ist https://www.sandbox.paypal.com/

Mit dem Händler Account habe ich einen Sandbox Buy Now Button erzeugt und der "normale" Sandbox Benutzer hat dann auf diesen Button geklickt. Meinen IPN Listener habe ich als Azure HTTP Function in der Microsoft Cloud implementiert. Mit Hilfe der beiden Sandbox Accounts konnte ich dann überprüfen, ob mein Listener angesprochen wurde und ob er die IPN Nachricht richtig verarbeitet. Die Aktivierung von IPN für ein Händlerkonto kann unter https://www.sandbox.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-ipn-notify für die Sandbox vorgenommen werden.

Genau genommen passiert beim Austausch der Nachricht folgendes:

PayPal schickt nach Eingang der Zahlung eine Nachricht mit einem Haufen Formulardaten an meinen Listener. Ich nehme diese Daten und schicke sie an PayPal zurück. Damit soll sichergestellt werden, daß die Nachricht wirklich von PayPal kommt. PayPal antwortet darauf mit einen einfachen VERIFIED oder INVALID und schon kann ich die entsprechende email an den Kunden rausschicken.