PayPal-Integration Teil 3 PayPal-Webhooks

Was Sie erstellen werden

Ein Webhook ist ein HTTP-Callback, der auftritt, wenn etwas passiert. Ein einfaches Ereignisbenachrichtigungssystem über HTTP POST, mit dem Entwickler einfach auf Benachrichtigungen über Zahlungsaktivitäten zugreifen können, z. B. Aktualisierung des Zahlungsstatus oder wiederkehrende Gebühren. Sie können nach der Verarbeitung jeder Benachrichtigung Aktionen in Ihrem Back-End durchführen, z.

  • E-Mail eine Bestellbestätigung an Ihren Kunden.
  • Download digitaler Medien ermöglichen.
  • Rückerstattung ausstellen.
  • Verfolgen Sie, welche Abonnements aktiv sind.

Um einen Webhook zu erstellen, navigieren Sie zu PayPal Instrumententafel, und klicken Sie auf Meine Apps und Anmeldeinformationen. Wählen Sie dann die App aus, in der Sie die Webhooks einrichten möchten.

Sie können die Details zu Ihrer Bewerbung sehen. In der rechten oberen Ecke sind zwei Schaltflächen (Sandbox, Live) vorhanden, die ich verwenden werde Sandkasten In diesem Lernprogramm müssen Sie jedoch Ihre Live-Einstellungen einrichten, bevor Sie Live starten können. Um Webhooks für diese App zu konfigurieren, klicken Sie auf Webhook hinzufügen wie im Screenshot dargestellt:

Wählen Sie die Ereignistypen aus, an denen Sie benachrichtigt werden möchten, und geben Sie die URL ein, an die die Webhooks gesendet werden sollen (es muss HTTPS sein). Um die Webhook-Aufrufe abzuwickeln, füge ich dem HomeController eine neue Aktionsmethode hinzu, die als "Webhook" bezeichnet wird:

public IActionResult Webhook () // TODO: Webhook-Aufruf bearbeiten

Die Webhook-URL in diesem Fall lautet also: https://pedroalonso.localtunnel.me/home/webhook. Ich werde den 'localtunnel' Teil im nächsten Abschnitt erklären.

Wenn Sie den Webhook speichern, wird der folgende Bestätigungsbildschirm angezeigt:

Nun, da der Webhook eingerichtet ist, können Sie im linken Menü unter 'Webhooks Simulator' sehen. Hier können Sie 'Test'-Webhook-Ereignisse an Ihre URL senden, um zu testen, ob Ihr Code funktioniert. Unter "Webhooks-Ereignisse" können Sie auch alle Ereignisse sehen, die PayPal für diese Anwendung gesendet hat. Sie können überprüfen, ob Sie die Ereignisse korrekt verarbeiten, und sie erneut senden, wenn Sie weitere Tests durchführen möchten.

Um zu sehen, wie die Webhooks funktionieren, habe ich das Projekt, das wir im vorherigen Tutorial erstellt haben, ausgeführt und eine "Autorisierung der Zahlung und Erfassung später" erstellt, damit PayPal die Veranstaltung senden konnte. Nach dem Ausführen des Beispiels habe ich auf "Webhooks Event" geklickt und kann sehen, dass das Event gesendet wurde:

Wie Sie sehen können, befindet sich rechts ein Erneut senden Schaltfläche, wenn Sie Ihren Code debuggen möchten und sehen, wie der Handler ordnungsgemäß implementiert wird. Wenn Sie auf die Veranstaltung klicken, können Sie auch alle Details sehen:

Dies ist der vollständige JSON für das Webhook-Ereignis:

"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "resource_type": "sale", "event_type": "PAYMENT.SALE.COMPLETED", " Zusammenfassung ":" Zahlung für $ 100.0 USD "," Ressource ": " Betrag ": " Summe ":" 100.00 "," Währung ":" USD "," Details ": " Zwischensumme ":" 100.00 " , "tax": "15.00", "shipping": "10.00", "id": "73G8209522783053E", "parent_payment": "PAY-7MB27930V5981832YK2PHN7Q", "update_time": "2016-01-19T17: 49: 05Z "," create_time ":" 2016-01-19T17: 49: 05Z "," payment_mode ":" INSTANT_TRANSFER "," state ":" abgeschlossen "," links ": [" href ":" https: // api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" self "," method ":" GET ", " href ":" https: //api.sandbox.paypal. com / v1 / payment / sale / 73G8209522783053E / refund "," rel ":" refund "," method ":" POST ", " href ":" https://api.sandbox.paypal.com/v1/ payment / payment / PAY-7MB27930V5981832YK2PHN7Q "," rel ":" parent_payment "," method ":" GET "]," protection_eligibility_type ":" ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " Wert ":" 3.20 "," Währung ":" USD "," Schutzberechtigung ":" Berechtigt "," Status ":" PENDING "," Übertragungen ": [" webhook_url ":" https://pedroalonso.localtunnel.me/home/webhook "," response_headers ": " Date ":" Mi, 20 Jan 2016 12:53:51 GMT "," Content-Length ":" 53 " , "HTTP / 1.1 502 Falsches Gateway": "", "SERVER_INFO": "", "Verbindung": "Keep-Alive", "Server": "nginx / 1.7.8", "transmission_id": "218dc9c0- bed5-11e5-927f-6b62a8a99ac4 "," status ":" PENDING "," timestamp ":" 2016-01-19T17: 50: 30Z "]," links ": [" href ":" https: // api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402 "," rel ":" self "," method ":" gET "," application / json ", "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "resend", "method": "POST" , "encType": "application / json"]

Wie Sie im Bild sehen können, sind die Ereignisdetails in JSON codiert und werden als Hauptteil der Anforderung an Ihren Webhook-URL-Handler gesendet. Es gibt auch einige wichtige Eigenschaften, die wir in unserem Handler verwenden müssen:

  • Ich würde: Dies ist die ID des Webhook-Ereignisses, und wir müssen diesen Parameter an PayPal senden, wenn wir ein bestimmtes Webhook-Ereignis abrufen möchten.
  • event_type: Dies wird verwendet, um die Art des Ereignisses zu kennen, das wir empfangen, da wir verschiedene Ereignistypen wahrscheinlich auf verschiedene Arten verarbeiten müssen.
  • resource.parent_payment: Dies ist die ID der Zahlung, auf die sich dieses Ereignis bezieht. Wir haben diese ID möglicherweise in einer Datenbank gespeichert und können eine E-Mail an unseren Kunden senden oder die vom Kunden gekaufte Ware versenden.

Basierend auf der vorherigen Erläuterung ist dies der Code des Aktionscontrollers zur Verarbeitung des Webhooks:

public IActionResult Webhook () // Das APIContext-Objekt kann eine optionale Überschreibung für das vertrauenswürdige Zertifikat enthalten. var apiContext = PayPalConfiguration.GetAPIContext (); // Erhalte die Header der empfangenen Anfrage var requestheaders = HttpContext.Request.Headers; // Hole den Body der empfangenen Anfrage var requestBody = string.Empty; using (var reader = new System.IO.StreamReader (HttpContext.Request.Body)) requestBody = reader.ReadToEnd ();  dynamic jsonBody = JObject.Parse (requestBody); string webhookId = jsonBody.id; var ev = WebhookEvent.Get (apiContext, WebhookId); // Wir haben alle Informationen, die das SDK benötigt, führen Sie also die Validierung durch. // Hinweis: Zumindest in der Sandbox-Umgebung wird false zurückgegeben. // var isValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); switch (ev.event_type) Fall "PAYMENT.CAPTURE.COMPLETED": // Abwicklung der Zahlung abgeschlossen; Fall "PAYMENT.CAPTURE.DENIED": // Zahlung verweigert Pause; // Andere Webhooks behandeln default: break;  return new HttpStatusCodeResult (200); 

Einige Dinge aus der vorherigen Funktion zu erklären. In den Zeilen 10-16 lese ich nur den Hauptteil der Anforderung und parse das JSON-Objekt in ein dynamisches C # -Objekt. In Zeile 18, die optional ist, rufe ich die PayPal-API mit der Ereignis-ID an, um die vollständigen Ereignisdetails abzurufen. Dies geschieht aus Sicherheitsgründen, um zu überprüfen, ob ich ein gültiges PayPal-Objekt verwende. In Zeile 24 habe ich einen Schalter erstellt, um die Typen von Webhooks auszuwerten, die ich verarbeiten möchte, und den benutzerdefinierten Code nach Bedarf zu schreiben. 

Wie Sie auch sehen können, ist Zeile 22 auskommentiert. Anscheinend bestätigt diese Methode, dass das SSL-Zertifikat aus der Anfrage gültig ist und zu PayPal gehört, im Sandbox-Modus jedoch nicht funktioniert. Es könnte in Live funktionieren, aber ich mag es nicht, Code in Live zu haben, der nicht getestet wurde, insbesondere wenn es sich um ein Payment Gateway handelt. Ich entschied mich daher, den Code zu entfernen und einen anderen Ansatz zu verwenden. Wenn Sie die PHP-Version der PayPal SDK-Bibliothek verwenden, beachten Sie, dass die Funktion 'ValidateReceivedEvent' nicht einmal existiert.

Webhooks testen: Sicherer Tunnel

Wie Sie bereits gesehen haben, müssen Sie zum Testen von Webhooks eine öffentliche URL konfigurieren, über die PayPal die Ereignisse senden kann. Wenn wir lokal arbeiten, entwickeln wir normalerweise 'localhost', daher wäre das ein kleines Problem. Um dies zu lösen, müssen wir einen sicheren Tunnel zu unserem lokalen Computer konfigurieren. 

Localtunnel ist eine kleine Software, die einen sicheren Tunnel zwischen Ihrem lokalen Computer und einer öffentlich zugänglichen Domäne erstellt. Dies ist zum Testen von Webhooks hilfreich. Sie können es jedoch auch dazu verwenden, Live-URLs für Webanwendungen, die auf Ihrem Entwicklungscomputer ausgeführt werden, für Testzwecke, Feedback oder andere Aufgaben freizugeben.

Sie benötigen Node.js, um localtunnel installieren zu können. Dann einfach eine Konsole oder ein Terminal öffnen und ausführen:

$ npm install -g localtunnel

Um einen Tunnel zu erstellen, führen Sie Folgendes aus:

$ lt --port 5000 - subdomain pedroalonso

Dadurch wird die URL "https://pedroalonso.localtunnel.me" zu "localhost: 5000" zugeordnet. Wenn Sie Ihr Projekt unter IIS Express ausführen, verwenden Sie wahrscheinlich einen anderen Port. Daher müssen Sie dies in Ihrem Befehl berücksichtigen.

Nachdem localtunnel eingerichtet wurde und unser Projekt ausgeführt wird, habe ich in Visual Studio einen Haltepunkt hinzugefügt, um die erhaltenen Daten auszuwerten. Wie Sie in diesem Screenshot sehen können, habe ich das JSON-Ereignisobjekt einem dynamischen C # -Objekt zugeordnet.

Wenn Sie das Ereignis mithilfe der Ereignis-ID von der PayPal-API abrufen, erhalten wir auch die Ereignisdetails, wie Sie hier sehen können:

Fazit

Webhooks werden zu einer Standardmethode für die REST-API, um Anwendungen über Ereignisse zu informieren. Wie Sie sehen, sind sie ziemlich einfach zu handhaben und werden von vielen Unternehmen wie Stripe, SendGrid, MailChimp usw. verwendet. PayPal verwendete Instant-Zahlungsbenachrichtigungen. Diese werden immer noch verwendet. Sie empfehlen jedoch, Webhooks nach Möglichkeit zu implementieren.  

Ich denke, es wäre wirklich interessant, wenn auch mehr Consumer-Anwendungen Webhooks anbieten würden. Die Möglichkeit, einen Prozess basierend auf einem Ereignis in einer separaten Anwendung zu starten, ist äußerst nützlich und bietet einen Einblick in die Zukunft des Echtzeit-Webs.