PayPal-integratie Deel 3 PayPal-webhaken

Wat je gaat creëren

Een Webhook is een HTTP-callback die optreedt wanneer iets gebeurt; een eenvoudig gebeurtenismeldingssysteem via HTTP POST waarmee ontwikkelaars eenvoudig toegang hebben tot meldingen van betalingsactiviteiten, zoals de update van de betalingsstatus of terugkerende kosten. U kunt acties uitvoeren aan uw back-end na het verwerken van elke melding, zoals:

  • E-mail een aankoopbevestiging naar uw klant.
  • Schakel downloaden van digitale media in.
  • Voer een terugbetaling uit.
  • Houd bij welke abonnementen actief zijn.

Om een ​​Webhook te maken, navigeert u naar de PayPal Dashboard, en klik op Mijn apps en legitimeringen. Selecteer vervolgens de app waarin u de Webhooks wilt instellen.

U kunt de details over uw toepassing bekijken. Merk rechtsboven op dat er twee knoppen (Sandbox, Live) zijn die ik ga gebruiken sandbox tijdens deze zelfstudie, maar je moet je Live-instellingen instellen voordat je Live gaat. Om Webhooks voor deze app te configureren, klikt u op Webhook toevoegen zoals weergegeven in de screenshot:

Selecteer de gebeurtenistypen waarvoor u een melding wilt ontvangen en voer de URL in waarnaar de Webhooks worden verzonden (dit moet HTTPS zijn). Om de Webhook-oproepen aan te kunnen, voeg ik een nieuwe actiemethode toe aan de HomeController genaamd 'Webhook':

public IActionResult Webhook () // TODO: Webhook-oproep verwerken

Dus de Webhook-URL is in dit geval: https://pedroalonso.localtunnel.me/home/webhook. Ik zal het gedeelte 'localtunnel' in het volgende gedeelte uitleggen.

Wanneer u de Webhook opslaat, ziet u dit bevestigingsscherm:

Nu de Webhook is ingesteld, kunt u in het linkermenu onder 'Webhooks Simulator' zien, hier kunt u webhookgebeurtenissen 'testen' naar uw URL sturen om te testen of uw code werkt. Ook kunt u onder 'Webhooks-evenementen' alle gebeurtenissen bekijken die PayPal voor deze toepassing heeft verzonden. U kunt controleren of u de gebeurtenissen correct verwerkt en ze opnieuw verzenden als u nog meer wilt testen.

Om te zien hoe de Webhooks werken, heb ik het project uitgevoerd dat we in de vorige zelfstudie hebben gebouwd en ik heb een 'machtig betaling en opname later' gemaakt, zodat PayPal het evenement zou verzenden. Na het uitvoeren van het voorbeeld, klikte ik op 'Webhooks Event' en ik kan zien dat het evenement is verzonden:

Zoals je kunt zien, rechts is er een Opnieuw versturen knop als u uw code wilt debuggen en wilt zien hoe u de handler correct implementeert. Als u op de afspraak klikt, ziet u ook alle details:

Dit is de volledige JSON voor het Webhook-evenement:

"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "resource_type": "sale", "event_type": "PAYMENT.SALE.COMPLETED", " samenvatting ":" Betaling voltooid voor $ 100.0 USD "," resource ": " amount ": " total ":" 100.00 "," currency ":" USD "," details ": " subtotal ":" 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 ":" completed "," links ": [" href ":" https: // api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" self "," method ":" GET ", " href ":" https: //api.sandbox.paypal. nl / v1 / payments / sale / 73G8209522783053E / refund "," rel ":" refund "," method ":" POST ", " href ":" https://api.sandbox.paypal.com/v1/ betalingen / betaling / PAY-7MB27930V5981832YK2PHN7Q "," rel ":" parent_payment "," method ":" GET "]," protection_eligibility_type ":" ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " value ":" 3.20 "," currency ":" USD "," protection_eligibility ":" SUBSIDIABEL "," status ":" PENDING "," transmissies ": [" webhook_url ":" https://pedroalonso.localtunnel.me/home/webhook "," response_headers ": " Datum ":" Wed, 20 jan 2016 12:53:51 GMT "," Content-Length ":" 53 " , "HTTP / 1.1 502 Slechte gateway": "", "SERVER_INFO": "", "Verbinding": "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 "," encType ":" application / json ", "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "opnieuw verzenden", "methode": "POST" , "encType": "application / json"]

Zoals u op de afbeelding kunt zien, zijn de details van de gebeurtenis gecodeerd in JSON en worden ze verzonden als het hoofdgedeelte van de aanvraag naar uw Webhook URL-handler. Er zijn ook verschillende belangrijke eigenschappen die we in onze handler moeten gebruiken:

  • ID kaart: Dit is de id van de webhook-gebeurtenis en we moeten deze parameter naar PayPal verzenden als we een specifiek webhook-evenement willen ophalen.
  • event_type: Dit wordt gebruikt om te weten welk type evenement we ontvangen, omdat we waarschijnlijk verschillende soorten gebeurtenissen op verschillende manieren moeten verwerken.
  • resource.parent_payment: Dit is het ID van de betaling waarmee deze gebeurtenis verband houdt. We hebben deze id mogelijk opgeslagen in een database en kunnen een e-mail sturen naar onze klant of de door de klant gekochte goederen verzenden.

Op basis van de vorige uitleg is dit de code van de actiecontroller om de Webhook te verwerken:

public IActionResult Webhook () // Het APIContext-object kan een optionele overschrijving voor het vertrouwde certificaat bevatten. var apiContext = PayPalConfiguration.GetAPIContext (); // Ontvang de headers van de ontvangen aanvraag var requestheaders = HttpContext.Request.Headers; // Ontvang de body var-aanvraag van de ontvangen aanvraagBody = 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); // We hebben alle informatie die de SDK nodig heeft, dus voer de validatie uit. // Opmerking: op zijn minst op Sandbox-omgeving levert dit false op. // var isValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); switch (ev.event_type) case "PAYMENT.CAPTURE.COMPLETED": // Behandeling betaling voltooid pauze; case "PAYMENT.CAPTURE.DENIED": // Omgaan met geweigerde betaling voor betaling; // Beheer andere webhooks standaard: pauze;  retourneer nieuw HttpStatusCodeResult (200); 

Een paar dingen om uit de vorige functie uit te leggen. Vanaf regel 10-16 lees ik alleen de hoofdtekst van het verzoek en parseer ik het JSON-object naar een dynamisch C # -object. Op regel 18, die optioneel is, bel ik de PayPal API met de gebeurtenis-ID om de volledige details van het evenement te krijgen. Dit wordt gedaan voor de beveiliging om te verifiëren dat ik een geldig PayPal-object gebruik. Op regel 24 heb ik een switch gemaakt om de soorten Webhooks te evalueren die ik wil verwerken en de aangepaste code naar behoefte te schrijven. 

Zoals je ook kunt zien, is regel 22 becommentarieerd. Blijkbaar valideert die methode dat het SSL-certificaat van het verzoek geldig is en van PayPal is, maar het werkt niet in Sandbox-modus. Het kan misschien werken in Live, maar ik hou er niet van om code in Live te hebben die niet is getest, vooral als het om een ​​Payment Gateway gaat, dus ik heb ervoor gekozen om dit te verwijderen en een andere aanpak te gebruiken. Als u de PHP-versie van de PayPal SDK-bibliotheek gebruikt, moet u er rekening mee houden dat de functie 'ValidateReceivedEvent' niet eens bestaat.

Webhooks testen: beveiligde tunnel

Zoals u eerder hebt gezien, moeten we Webhooks testen om een ​​openbare URL te configureren die PayPal kan gebruiken om de gebeurtenissen te verzenden. Als we lokaal werken, ontwikkelen we normaal gesproken 'localhost', dus dat zou een klein probleem zijn. Om dat op te lossen, moeten we een beveiligde tunnel configureren voor onze lokale computer. 

Localtunnel is een klein stukje software dat een veilige tunnel creëert tussen uw lokale machine en een openbaar toegankelijk domein. Het is handig voor het testen van Webhooks, maar u kunt het ook gebruiken om live URL's te delen met webtoepassingen die worden uitgevoerd op uw ontwikkelingsmachine voor testen, feedback of andere taken..

U moet Node.js hebben om localtunnel te kunnen installeren. Open vervolgens een console of terminal en voer het volgende uit:

$ npm install -g localtunnel

Ga als volgt te werk om een ​​tunnel te maken:

$ lt --port 5000 - subdomein pedroalonso

Dat zal de URL 'https://pedroalonso.localtunnel.me' toewijzen aan 'localhost: 5000'. Als u uw project uitvoert op IIS Express, gebruikt u waarschijnlijk een andere poort, dus u moet dat in uw opdracht weerspiegelen.

Nadat localtunnel is opgezet en ons project wordt uitgevoerd, heb ik een onderbrekingspunt toegevoegd in Visual Studio om de gegevens te evalueren die ik krijg. Zoals u in deze schermafbeelding kunt zien, heb ik het JSON-gebeurtenisobject toegewezen aan een dynamisch C # -object.

Wanneer de gebeurtenis uit de PayPal-API wordt opgehaald met behulp van de gebeurtenis-ID, krijgen we ook de afspraakdetails, zoals u hier kunt zien:

Conclusie

Webhooks worden een standaardmanier voor REST API om toepassingen over gebeurtenissen te melden. Zoals u kunt zien, zijn ze vrij eenvoudig te gebruiken en worden ze gebruikt door veel bedrijven zoals Stripe, SendGrid, MailChimp, etc. PayPal had een directe betalingskennisgeving en is nog steeds in gebruik, maar ze raden aan om waar mogelijk webhooks te implementeren.  

Ik denk dat het echt interessant zou zijn als er meer consumententoepassingen ook Webhooks zouden aanbieden. De mogelijkheid om een ​​proces te starten op basis van een evenement in een afzonderlijke applicatie is uiterst nuttig en biedt een glimp van de toekomst van het real-time web.