PayPal Integrering Del 3 PayPal Webhooks

Hva du skal skape

En Webhook er et HTTP tilbakering som oppstår når noe skjer; Et enkelt hendelse-varslingssystem via HTTP POST som gjør at utviklere enkelt kan få tilgang til varsler om betalingsaktiviteter, for eksempel betalingsstatusoppdatering eller gjentatte kostnader. Du kan utføre handlinger på din back-end etter å ha behandlet hvert varsel, for eksempel:

  • Send en bekreftelse til kunden din via e-post.
  • Aktiver nedlasting av digitale medier.
  • Utstede en tilbakebetaling.
  • Hold oversikt over hvilke abonnementer som er aktive.

For å opprette en Webhook, naviger til PayPal dashbord, og klikk på Mine apper og legitimasjon. Velg deretter appen der du vil konfigurere Webhooks.

Du kan se detaljene om søknaden din. Legg merke til øverst til høyre at det er to knapper (Sandbox, Live), jeg skal bruke Sandbox under denne opplæringen, men du må sette opp dine Live-innstillinger før du går Live. For å konfigurere Webhooks for denne appen, klikk på Legg til Webhook som vist på skjermbildet:

Velg hendelsestyper som du er interessert i å bli varslet, og skriv inn nettadressen der webhakene skal sendes til (den må være HTTPS). For å håndtere Webhook-anropene skal jeg legge til en ny handlingsmetode til HomeController som heter 'Webhook':

offentlig IActionResult Webhook () // TODO: Håndtere Webhook-samtalen

Så Webhook Url i dette tilfellet vil være: https://pedroalonso.localtunnel.me/home/webhook. Jeg skal forklare delen "lokaltunnel" i neste avsnitt.

Når du lagrer Webhook, vil du se denne bekreftelsesskjermen:

Nå som Webhook er satt opp, kan du se i venstre meny under "Webhooks Simulator", her kan du sende "test" webhook hendelser til webadressen din for å teste at koden din fungerer. Også under 'Webhooks Events' kan du se alle hendelsene som PayPal sendte for dette programmet. Du kan bekrefte at du håndterer hendelsene riktig og sender dem igjen hvis du vil gjøre ytterligere testing.

For å se hvordan Webhooks jobber, kjørte jeg prosjektet som vi bygde i den forrige opplæringen, og jeg opprettet en "autorisere betaling og fangst senere", slik at PayPal ville sende hendelsen. Etter å ha kjørt prøven, klikket jeg på 'Webhooks Event' og jeg kan se at hendelsen er sendt:

Som du kan se, til høyre er det en Send igjen knappen hvis du vil feilsøke koden og se hvordan du skal implementere håndteringen på riktig måte. Også, hvis du klikker på arrangementet, kan du se alle detaljene:

Dette er den fulle JSON for Webhook-arrangementet:

"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "resource_type": "salg", "event_type": "PAYMENT.SALE.COMPLETED" Sammendrag ":" Betaling fullført for $ 100.0 USD "," ressurs ": " beløp ": " totalt ":" 100,00 "," valuta ":" USD "," detaljer ": " subtotal ":" 100,00 " , "skatt": "15,00", "frakt": "10,00", "id": "73G8209522783053E", "foreldre_payment": "PAY-7MB27930V5981832YK2PHN7Q", "update_time": "2016-01-19T17: 49: 05Z "," create_time ":" 2016-01-19T17: 49: 05Z "," payment_mode ":" INSTANT_TRANSFER "," state ":" fullført "," lenker ": [" href ":" https: // api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" selv "," metode ":" GET ", " href ":" https: //api.sandbox.paypal. com / v1 / betalinger / salg / 73G8209522783053E / refusjon "," rel ":" refusjon "," metode ":" POST ", " href ":" https://api.sandbox.paypal.com/v1/ betalinger / betaling / PAY-7MB27930V5981832YK2PHN7Q "," rel ":" parent_payment "," metode ":" GET "]," protection_eligibility_type ":" ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " verdi ":" 3.20 "," valuta ":" USD "," protection_eligibility ":" ELIGIBLE "," status ":" VENTER "," overføringer ": [" webhook_url ":" https://pedroalonso.localtunnel.me/home/webhook "," response_headers ": " Dato ":" Onsdag, 20 Jan 2016 12:53:51 GMT "," Innholdslengde ":" 53 " , "Server": "nginx / 1.7.8", "transmission_id": "218dc9c0- bed5-11e5-927f-6b62a8a99ac4 "," status ":" VENTE "," tidsstempel ":" 2016-01-19T17: 50: 30Z "]," lenker ": [" href ":" https: // api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402 "," rel ":" selv "," metode ":" GET "," encType ":" application / json ", "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "resend", "metode": "POST" , "encType": "application / json"]

Som du kan se på bildet, er hendelsesdetaljene kodet i JSON, og de sendes som kroppen til forespørselen til Webhook URL-håndtereren. Det er også flere viktige egenskaper som vi må bruke i vår håndterer:

  • id: Dette er ID for webhook-arrangementet, og vi må sende denne parameteren til PayPal hvis vi ønsker å hente en bestemt webhook-hendelse.
  • EVENT_TYPE: Dette er kjent for hvilken type arrangement som vi mottar, da vi sannsynligvis må behandle forskjellige hendelsestyper på forskjellige måter.
  • resource.parent_payment: Dette er ID for betalingen som denne hendelsen er relatert til. Vi har muligens denne IDen lagret i en database, og kan sende en e-post til vår kunde eller sende varene som er kjøpt av kunden.

Basert på forrige forklaring, er dette koden til handlingskontrolleren for å behandle Webhook:

offentlig IActionResult Webhook () // APIContext-objektet kan inneholde en valgfri overstyring for det klarerte sertifikatet. var apiContext = PayPalConfiguration.GetAPIContext (); // Få mottatte forespørselshoder var requestheaders = HttpContext.Request.Headers; // Få mottatt forespørsels kropp var requestBody = string.Empty; bruker (var leser = nytt system.IO.StreamReader (HttpContext.Request.Body)) requestBody = reader.ReadToEnd ();  dynamisk jsonBody = JObject.Parse (requestBody); streng webhookId = jsonBody.id; var ev = WebhookEvent.Get (apiContext, webhookId); // Vi har all informasjonen SDK trenger, så utfør valideringen. // Merk: I hvert fall på Sandbox-miljøet returnerer dette false. // var isValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); bytt (ev.event_type) tilfelle "PAYMENT.CAPTURE.COMPLETED": // Håndter betaling fullført pause; saken "PAYMENT.CAPTURE.DENIED": // Håndter betaling avslått pause; // Håndter andre webhooks standard: break;  returner ny HttpStatusCodeResult (200); 

Noen ting å forklare fra forrige funksjon. Fra linjene 10-16 leser jeg bare kroppen av forespørselen og analyserer JSON-objektet til et dynamisk C # -objekt. På linje 18, som er valgfritt, ringer jeg PayPal-API med hendelses-ID for å få de fullstendige hendelsesdetaljene. Dette er gjort for sikkerhet for å bekrefte at jeg bruker et gyldig PayPal-objekt. På linje 24 har jeg opprettet en bryter for å evaluere hvilke typer Webhooks som jeg vil behandle og skrive den egendefinerte koden etter behov. 

Som du også kan se, er linje 22 kommentert. Tilsynelatende bekrefter denne metoden at SSL-sertifikatet fra forespørselen er gyldig og tilhører PayPal, men det virker ikke i sandkassemodus. Det kan fungere i Live, men jeg liker ikke å ha kode i Live som ikke er testet, spesielt hvis det handler om en betalingsgateway, så jeg valgte å fjerne det og bruke en annen tilnærming. Hvis du bruker PHP-versjonen av PayPal SDK-biblioteket, må du huske at funksjonen 'ValidateReceivedEvent' ikke engang eksisterer.

Testing Webhooks: Secure Tunnel

Som du tidligere har sett, må vi konfigurere en offentlig nettadresse som PayPal kan bruke til å sende hendelsene for å teste Webhooks. Hvis vi jobber lokalt, utvikler vi vanligvis med "localhost", så det ville være et lite problem. For å løse det må vi konfigurere en sikker tunnel til vår lokale datamaskin. 

Localtunnel er et lite stykke programvare som skaper en sikker tunnel mellom din lokale maskin og et offentligt tilgjengelig domene. Det er nyttig for testing av Webhooks, men du kan også bruke den til å dele webadresser til webapplikasjoner som kjører på utviklingsmaskinen din med tanke på testing, tilbakemelding eller andre oppgaver..

Du må ha Node.js for å kunne installere lokaltunnel. Deretter åpner du bare en konsoll eller terminal, og kjører:

$ npm installasjon -g lokaltunnel

For å lage en tunnel, kjør:

$ lt --port 5000 - subdomain pedroalonso

Det vil kartlegge nettadressen 'https://pedroalonso.localtunnel.me' til 'localhost: 5000'. Hvis du kjører prosjektet ditt på IIS Express, vil du sannsynligvis bruke en annen port, så du må gjenspeile det som er under din kommando.

Etter at lokaltunnelen er satt opp og prosjektet vårt kjører, har jeg lagt til et brytepunkt i Visual Studio for å evaluere dataene jeg får. Som du kan se på dette skjermbildet, har jeg kartlagt JSON-hendelsesobjektet til et C # dynamisk objekt.

Henter hendelsen fra PayPal API ved hjelp av hendelses-ID, vi får også hendelsesdetaljene, som du kan se her:

Konklusjon

Webhooks blir en standard måte for REST API for å varsle applikasjoner om hendelser. Som du ser, er de ganske enkle å håndtere, og de brukes av mange selskaper som Stripe, SendGrid, MailChimp, etc. PayPal pleide å ha øyeblikkelig betalingsmelding, og den er fortsatt i bruk, men de anbefaler å implementere Webhooks når det er mulig.  

Jeg tror det ville være veldig interessant om flere forbrukerprogrammer også tilbys Webhooks. Evnen til å starte en prosess basert på et arrangement i en separat applikasjon er ekstremt nyttig og gir et glimt på fremtiden for sanntidsweb.