En Webhook är en HTTP-återuppringning som inträffar när något händer. ett enkelt system för händelseanmälan via HTTP POST som gör det möjligt för utvecklare att enkelt komma åt meddelanden om betalningsaktiviteter, till exempel betalningsstatusuppdatering eller återkommande avgifter. Du kan utföra åtgärder på ditt back-end efter att ha behandlat varje meddelande, till exempel:
För att skapa en Webhook, navigera till PayPal instrumentbräda, och klicka på Mina Apps & Referenser. Markera sedan den app där du vill ställa in Webhooks.
Du kan se detaljer om din ansökan. Notera högst upp till att det finns två knappar (Sandbox, Live), jag ska använda Sandlåda under denna handledning, men du måste ställa in dina Live-inställningar innan du går Live. För att konfigurera Webhooks för den här appen klickar du på Lägg till Webhook som visas i skärmdumpen:
Välj de händelsetyper som du är intresserad av att få meddelande om och ange webbadressen där webbhakarna ska skickas till (den måste vara HTTPS). För att hantera Webhook-samtalen kommer jag att lägga till en ny åtgärdsmetod till HomeController som heter 'Webhook':
offentlig IActionResult Webhook () // TODO: Hantera Webbook-samtal
Så är Webhook Url i detta fall: https://pedroalonso.localtunnel.me/home/webhook. Jag ska förklara delen "localtunnel" i nästa avsnitt.
När du sparar Webhook ser du denna bekräftelsesskärm:
Nu när Webhook är upprättad kan du se i vänstra menyn under "Webhooks Simulator", här kan du skicka "test" webhook-händelser till din webbadress för att testa att din kod fungerar. Under "Webhooks Events" kan du även se alla händelser som PayPal skickade till den här applikationen. Du kan verifiera att du hanterar händelserna på rätt sätt och skickar dem om du vill göra ytterligare test.
För att se hur Webhooks fungerar, sprang jag projektet som vi byggde i tidigare handledning, och jag skapade en "godkänna betalning och fånga senare", så att PayPal skulle skicka händelsen. Efter att ha kört provet klickade jag på "Webhooks Event" och jag kan se att händelsen har skickats:
Som du kan se, till höger finns det ett Skicka igen knappen om du vill felsöka din kod och se hur du implementerar hanteraren korrekt. Om du klickar på evenemanget kan du också se alla detaljer:
Detta är den fullständiga JSON för Webhook-händelsen:
"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "resource_type": "försäljning", "event_type": "PAYMENT.SALE.COMPLETED" Sammanfattning ":" Betalning slutförd för $ 100.0 USD "," Resurs ": " mängd ": " totalt ":" 100,00 "," valuta ":" USD "," detaljer ": " subtotal ":" 100,00 " , "skatt": "15.00", "frakt": "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 ":" completed "," länkar ": [" href ":" https: // api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" self "," method ":" GET ", " href ":" https: //api.sandbox.paypal. com / v1 / betalningar / försäljning / 73G8209522783053E / återbetalning "," rel ":" återbetalning "," metod ":" POST ", " href ":" https://api.sandbox.paypal.com/v1/ betalningar / betalning / betalning-7MB27930V5981832YK2PHN7Q "," rel ":" parent_payment "," method ":" GET "]," protection_eligibility_type ":" ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " värde ":" 3.20 "," currency ":" USD "," protection_eligibility ":" ÄRDRIGT "," status ":" VÄNDER "," överföringar ": [" webhook_url ":" https://pedroalonso.localtunnel.me/home/webhook "," response_headers ": " Datum ":" ons, 20 jan 2016 12:53:51 GMT "," innehållslängd ":" 53 " , "Server": "nginx / 1.7.8", "transmission_id": "218dc9c0- bed5-11e5-927f-6b62a8a99ac4 "," status ":" VÄNDER "," tidsstämpel ":" 2016-01-19T17: 50: 30Z "]," länkar ": [" href ":" https: // api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402 "," rel ":" själv "," metod ":" GET "," encType ":" application / json ", "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "resend", "metod": "POST" , "encType": "application / json"]
Som du kan se i bilden kodas händelsesinformationen i JSON och de skickas som begäran om till din Webhook URL-hanterare. Det finns också flera viktiga egenskaper som vi behöver använda i vår hanterare:
Baserat på den tidigare förklaringen är detta handkontrollens kod för att bearbeta Webhook:
public IActionResult Webhook () // APIContext-objektet kan innehålla en eventuell överstyrning för det betrodda certifikatet. var apiContext = PayPalConfiguration.GetAPIContext (); // Få mottagna förfrågans rubriker var requestheaders = HttpContext.Request.Headers; // Hämta den mottagna förfrågans kropp var requestBody = string.Empty; använder (varläsare = nytt system.IO.StreamReader (HttpContext.Request.Body)) requestBody = reader.ReadToEnd (); dynamisk jsonBody = JObject.Parse (requestBody); sträng webhookId = jsonBody.id; var ev = WebhookEvent.Get (apiContext, webhookId); // Vi har all information som SDK behöver, så utför valideringen. // Obs! Åtminstone i Sandbox-miljö returnerar detta falskt. // var isValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); byta (ev.event_type) case "PAYMENT.CAPTURE.COMPLETED": // Hantera betalning avslutad paus fallet "PAYMENT.CAPTURE.DENIED": // Hantera betalning nekad paus // Hantera andra webhooks standard: break; returnera nya HttpStatusCodeResult (200);
Några saker att förklara från föregående funktion. Från raderna 10-16 läser jag bara förfrågan och analyserar JSON-objektet till ett dynamiskt C # -objekt. På rad 18, som är valfritt, ringer jag PayPal API med händelse-id för att få fullständiga händelsesuppgifter. Detta görs för säkerhet för att verifiera att jag använder ett giltigt PayPal-objekt. På rad 24 har jag skapat en omkopplare för att utvärdera de typer av webbhakar som jag vill bearbeta och skriva anpassad kod efter behov.
Som du kan se, kommenteras linje 22. Tydligen bekräftar den metoden att SSL-certifikatet från förfrågan är giltigt och tillhör PayPal, men det fungerar inte i Sandbox-läget. Det kan fungera i Live, men jag gillar inte att ha kod i Live som inte testas, särskilt om det handlar om en Betalingsgateway, så jag valde att ta bort det och använda en annan metod. Om du använder PHP-versionen av PayPal SDK-biblioteket, kom ihåg att funktionen "ValidateReceivedEvent" inte ens finns.
Som du tidigare sett för att kunna testa Webhooks måste vi konfigurera en allmän webbadress som PayPal kan använda för att skicka händelserna. Om vi arbetar lokalt utvecklas vi normalt med "localhost", så det skulle vara ett litet problem. För att lösa det måste vi konfigurera en säker tunnel till vår lokala dator.
Localtunnel är ett litet program som skapar en säker tunnel mellan din lokala maskin och en offentligt tillgänglig domän. Det är användbart för att testa Webhooks, men du kan också använda den för att dela webbadresser till webbapplikationer som körs på din utvecklingsmaskin för test, feedback eller andra uppgifter..
Du måste ha Node.js för att kunna installera lokaltunnel. Öppna sedan enkelt en konsol eller terminal och kör:
$ npm installera -g lokaltunnel
För att skapa en tunnel kör:
$ lt - port 5000 - subdomän pedroalonso
Det kommer att kartlägga URL: n "https://pedroalonso.localtunnel.me" till "localhost: 5000". Om du kör ditt projekt på IIS Express, kommer du förmodligen att använda en annan port, så du måste spegla det i ditt kommando.
Efter att lokaltunneln har upprättats och vårt projekt kör, har jag lagt till en brytpunkt i Visual Studio för att utvärdera de data jag får. Som du kan se på den här skärmdumpen, har jag kartlagt JSON-händelseobjektet till ett C # dynamiskt objekt.
Hämtar händelsen från PayPal API med hjälp av händelsen Id, vi får också händelseinformationen, som du kan se här:
Webhooks blir ett vanligt sätt för REST API för att anmäla program om händelser. Som du kan se är de ganska lätta att hantera, och de används av många företag som Stripe, SendGrid, MailChimp, etc. PayPal brukade ha Instant Payment Notification, och det är fortfarande i bruk, men de rekommenderar att du genomför Webbooks när det är möjligt.
Jag tycker att det skulle vara väldigt intressant om fler konsumentprogram erbjuder Webhooks också. Möjligheten att starta en process baserad på en händelse i en separat applikation är extremt användbar och ger en glimt på framtiden för realtidswebben.