PayPal Integration Partea 3 PayPal Webhooks

Ce veți crea

Un Webhook este un apel invers HTTP care are loc atunci când se întâmplă ceva; un sistem simplu de notificare a evenimentelor prin HTTP POST, care permite dezvoltatorilor să acceseze cu ușurință notificările privind activitățile de plată, cum ar fi actualizarea stării de plată sau taxele recurente. Puteți efectua acțiuni pe back-end după prelucrarea fiecărei notificări, cum ar fi:

  • Trimiteți o confirmare de achiziție către clientul dvs..
  • Activați descărcarea de suporturi digitale.
  • Eliberați o rambursare.
  • Urmăriți ce abonamente sunt active.

Pentru a crea un Webhook, navigați la PayPal Tablou de bord, și faceți clic pe Aplicațiile și acreditările mele. Apoi selectați aplicația în care doriți să configurați Webhook-urile.

Puteți vedea detaliile despre cererea dvs. Observați în partea dreaptă sus că există două butoane (Sandbox, Live), voi folosi Sandbox în timpul acestui tutorial, dar trebuie să vă configurați setările live înainte de a începe să faceți Live. Pentru a configura Webhooks pentru această aplicație, faceți clic pe Adăugați Webhook așa cum este afișat în captura de ecran:

Selectați tipurile de evenimente care vă interesează să primiți notificări și introduceți adresa URL la care vor fi trimise Webhook-urile (trebuie să fie HTTPS). Pentru a gestiona apelurile Webhook, voi adăuga o nouă metodă de acțiune la HomeController numită "Webhook":

public IActionResult Webhook () // TODO: Handle Calling Webhook

Deci, adresa Webhook Url în acest caz va fi: https://pedroalonso.localtunnel.me/home/webhook. Voi explica partea "localtunnel" în secțiunea următoare.

Când salvați Webhook, veți vedea acest ecran de confirmare:

Acum, când Webhook este configurat, puteți vedea în meniul din stânga sub "Webhooks Simulator", aici puteți trimite "test" evenimente webhook la adresa URL pentru a testa că codul dvs. funcționează. De asemenea, în secțiunea "Evenimente Webhooks" puteți vedea toate evenimentele trimise de PayPal pentru această aplicație. Puteți verifica dacă gestionați corect evenimentele și le trimiteți din nou dacă doriți să efectuați mai multe teste.

Pentru a vedea cum funcționează Webhooks-ul, am rulat proiectul pe care l-am construit în tutorialul anterior și am creat o "autorizație de plată și capturare mai târziu", astfel încât PayPal să trimită evenimentul. După ce executam eșantionul, am dat click pe 'Webhooks Event' și pot vedea că evenimentul a fost trimis:

După cum puteți vedea, la dreapta este a Retrimiteți , dacă doriți să depanați codul și să vedeți cum să implementați corect dispozitivul de manipulare. De asemenea, dacă faceți clic pe eveniment, puteți vedea toate detaliile:

Acesta este JSON-ul complet pentru evenimentul Webhook:

"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "resource_type": "sell", "event_type" rezumat ":" Plata completă pentru $ 100.0 USD "," resursă ": " suma ": " total ":" 100.00 " , "taxă": "15.00", "expediere": "10.00", "id": "73G8209522783053E", "parent_payment" "PAY-7MB27930V5981832YK2PHN7Q" 05Z "," create_time ":" 2016-01-19T17: 49: 05Z "," modul de plată ":" INSTANT_TRANSFER "," stat ":" completat "," link ": [" href " api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" auto "," metoda ":" GET ", " href ":" https: //api.sandbox.paypal. com / v1 / plăți / vânzare / 73G8209522783053E / restituire "," rel ":" restituire "," metoda ":" POST ", " href ": https://api.sandbox.paypal.com/v1/ plăți / plată / PAY-7MB27930V5981832YK2PHN7Q "," rel ":" părinte_payment "," metoda ":" GET "]," protection_eligibility_type ": ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " valoare ":" 3.20 "," valută ":" USD "," protection_eligibility ":" ELIGIBLE "," status " ":" https://pedroalonso.localtunnel.me/home/webhook "," answer_headers ": " Data ":" Marți, 20 Jan 2016 12:53:51 GMT "," Content-Length " , "HTTP / 1.1 502 Bad Gateway": "", "SERVER_INFO": "", "Connection": "218dc9c0- , "link-uri": ["href": "https: //"), " api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402 "," rel ":" self "," method ":" GET "," encType ":" aplicație / json " "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "retrimite", "metoda": "POST" , "encType": "aplicație / json"]

Așa cum puteți vedea în imagine, detaliile evenimentului sunt codificate în JSON și sunt trimise ca corp al cererii la handler-ul Webhook URL. De asemenea, există câteva proprietăți importante pe care trebuie să le folosim în serviciul nostru de manipulare:

  • id: Acesta este ID-ul evenimentului webhook și trebuie să trimitem acest parametru către PayPal dacă vrem să preluăm un anumit eveniment webhook.
  • tip de eveniment: Aceasta este folosită pentru a cunoaște tipul de eveniment pe care îl primim, deoarece probabil că trebuie să procesăm diferite tipuri de evenimente în moduri diferite.
  • resource.parent_payment: Acesta este ID-ul plății la care este asociat acest eveniment. Posibil să avem acest cod stocat într-o bază de date și să trimitem un e-mail clientului nostru sau să expediem bunurile achiziționate de client.

Pe baza explicației anterioare, acesta este codul regulatorului de acțiune pentru procesarea Webhook:

public IActionResult Webhook () // Obiectul APIContext poate conține o suprasare opțională pentru certificatul de încredere. var apiContext = PayPalConfiguration.GetAPIContext (); // Obțineți antetele cererii primite var requestheaders = HttpContext.Request.Headers; // Obțineți corpul cererii primite var requestBody = string.Empty; folosind (var cititor = nou System.IO.StreamReader (HttpContext.Request.Body)) requestBody = reader.ReadToEnd ();  dinamic jsonBody = JObject.Parse (requestBody); șir webhookId = jsonBody.id; var ev = WebhookEvent.Get (apiContext, webhookId); // Avem toate informațiile de care are nevoie SDK-ul, deci efectuați validarea. // Notă: cel puțin în mediul Sandbox acest lucru revine false. // var esteValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); switch (ev.event_type) caz "PAYMENT.CAPTURE.COMPLETED": // Efectuați o pauză completă a plății; cazul "PAYMENT.CAPTURE.DENIED": / / Handle break payment denied; // Manipulați alte site-uri web implicite: pauză;  returnați noul HttpStatusCodeResult (200); 

Câteva lucruri de explicat din funcția anterioară. Din linia 10-16, citesc numai corpul cererii și parsăm obiectul JSON unui obiect dinamic C #. Pe linia 18, care este opțională, apelez API-ul PayPal cu ID-ul evenimentului pentru a obține detaliile întregului eveniment. Acest lucru se face pentru securitate pentru a verifica dacă folosesc un obiect PayPal valid. Pe linia 24 am creat un comutator pentru a evalua tipurile de Webhooks pe care doresc să le procesez și pentru a scrie codul personalizat după cum este necesar. 

După cum puteți vedea, linia 22 este comentată. Se pare că această metodă validează faptul că certificatul SSL din Solicitare este valabil și aparține serviciului PayPal, dar nu funcționează în modul Sandbox. S-ar putea să funcționeze în Live, dar nu-mi place să am un cod live care nu este testat, mai ales dacă are de-a face cu un gateway de plată, așa că am optat pentru eliminarea acestuia și pentru o abordare diferită. Dacă utilizați versiunea PHP a bibliotecii PayPal SDK, rețineți că funcția "ValidateReceivedEvent" nu există nici măcar.

Testarea Webhooks: Tunel securizat

După cum ați văzut anterior, pentru a testa Webhooks, trebuie să configurați o adresă URL publică pe care PayPal o poate utiliza pentru a trimite evenimentele. Dacă lucrăm la nivel local, în mod normal, ne dezvoltăm folosind "localhost", deci ar fi o mică problemă. Pentru a rezolva acest lucru, trebuie să configuram un tunel securizat pe calculatorul nostru local. 

Localtunnel este o mică bucată de software care creează un tunel sigur între mașina dvs. locală și un domeniu accesibil publicului. Este utilă pentru testarea Webhooks-urilor, dar o puteți utiliza și pentru a distribui URL-uri live în aplicațiile web care rulează pe calculatorul dvs. de dezvoltare în scopul testelor, feedback-ului sau altor sarcini.

Trebuie să aveți Node.js pentru a putea instala localtunnel. Apoi deschideți pur și simplu o consolă sau un terminal și rulați:

$ npm install -g localtunnel

Pentru a crea un tunel, executați:

$ lt --port 5000 - subdomeniu pedroalonso

Aceasta va afișa adresa URL "https://pedroalonso.localtunnel.me" în "localhost: 5000". Dacă executați proiectul pe IIS Express, probabil că veți folosi un port diferit, deci va trebui să reflectați acest lucru în comanda dvs..

După ce localtunnel este configurat și proiectul nostru rulează, am adăugat un breakpoint în Visual Studio pentru a evalua datele pe care le primesc. După cum puteți vedea în această captură de ecran, am mapat obiectul evenimentului JSON la un obiect dinamic C #.

Descărcarea evenimentului din API-ul PayPal folosind ID-ul evenimentului, primim și detaliile evenimentului, după cum puteți vedea aici:

Concluzie

Webhooks-urile devin un mod standard pentru API-ul REST pentru a notifica aplicațiile despre evenimente. După cum puteți vedea, acestea sunt destul de ușor de manevrat și sunt utilizate de multe companii precum Stripe, SendGrid, MailChimp etc. PayPal a folosit notificarea de plată instant și este încă în uz, dar recomandă implementarea Webhooks ori de câte ori este posibil.  

Cred că ar fi foarte interesant dacă mai multe aplicații pentru consumatori au oferit și Webhooks. Abilitatea de a începe un proces bazat pe un eveniment într-o aplicație separată este extrem de utilă și oferă o privire asupra viitorului web-ului în timp real.

Cod