Intégration de PayPal, partie 3 Webhooks de PayPal

Ce que vous allez créer

Un Webhook est un rappel HTTP qui survient lorsqu'un événement survient. Un simple système de notification d'événement via HTTP POST qui permet aux développeurs d'accéder facilement aux notifications d'activités de paiement, telles que la mise à jour du statut de paiement ou les frais récurrents. Vous pouvez effectuer des actions sur votre serveur après le traitement de chaque notification, telles que:

  • Envoyer une confirmation d'achat à votre client.
  • Activer le téléchargement de médias numériques.
  • Émettre un remboursement.
  • Gardez une trace des abonnements actifs.

Pour créer un Webhook, accédez à PayPal Tableau de bord, et cliquez sur Mes applications et informations d'identification. Ensuite, sélectionnez l'application dans laquelle vous voulez configurer les Webhooks.

Vous pouvez voir les détails de votre application. Notez en haut à droite qu'il y a deux boutons (Sandbox, Live), je vais utiliser bac à sable au cours de ce didacticiel, mais vous devez configurer vos paramètres Live avant de passer à Live. Pour configurer Webhooks pour cette application, cliquez sur Ajouter Webhook comme indiqué dans la capture d'écran:

Sélectionnez les types d'événements pour lesquels vous souhaitez être averti, puis entrez l'URL où les Webhooks seront envoyés (il doit s'agir du protocole HTTPS). Pour gérer les appels Webhook, je vais ajouter une nouvelle méthode d'action à HomeController appelée 'Webhook':

public IActionResult Webhook () // TODO: Gérer l'appel Webhook

Dans ce cas, l’URL Webhook sera donc: https://pedroalonso.localtunnel.me/home/webhook. Je vais expliquer la partie "localtunnel" dans la section suivante.

Lorsque vous enregistrez le Webhook, vous verrez cet écran de confirmation:

Maintenant que le Webhook est configuré, vous pouvez voir dans le menu de gauche sous 'Simulateur Webhooks', ici, vous pouvez envoyer des événements Webhook 'test' à votre URL pour vérifier que votre code fonctionne. En outre, sous "Événements Webhooks", vous pouvez voir tous les événements envoyés par PayPal pour cette application. Vous pouvez vérifier que vous gérez correctement les événements et les renvoyer si vous souhaitez effectuer des tests supplémentaires..

Pour voir comment fonctionnent les Webhooks, j'ai exécuté le projet que nous avions intégré au didacticiel précédent et créé un "autorisation de paiement et de capture ultérieure", afin que PayPal envoie l'événement. Après avoir exécuté l'exemple, j'ai cliqué sur 'Webhooks Event' et je peux voir que l'événement a été envoyé:

Comme vous pouvez le voir, à droite il y a un Renvoyer si vous voulez déboguer votre code et voir comment implémenter correctement le gestionnaire. De plus, si vous cliquez sur l'événement, vous pourrez voir tous les détails:

Voici le code JSON complet pour l'événement Webhook:

"id": "WH-9U51749144910293K-8LX80763BC1567402", "create_time": "2016-01-19T17: 50: 30Z", "type de ressource": "vente", "type d'événement": "PAYMENT.SALE.COMPLETED", " summary ":" Paiement terminé pour 100,0 USD $ "," ressource ": " montant ": " total ":" 100.00 "," devise ":" USD "," détails ": " sous-total ":" 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 ":" complete "," links ": [" href ":" https: // api.sandbox.paypal.com/v1/payments/sale/73G8209522783053E "," rel ":" self "," method ":" GET ", " href ":" https: //api.sandbox.paypal. com / v1 / payments / sale / 73G8209522783053E / refund "," rel ":" refund "," method ":" POST ", " href ":" https://api.sandbox.paypal.com/v1/ paiements / paiement / PAY-7MB27930V5981832YK2PHN7Q "," rel ":" parent_payment "," method ":" GET "]," protection_eligibility_type ":" ITEM_NOT_RECEIVED_ELIGIBLE, UNAUTHORIZED_PAYMENT_ELIGIBLE "," transaction_fee ": " valeur ":" 3.20 "," devise ":" USD "," protection_éligibilité ":" ELIGIBLE "," statut ":" EN ATTENTE "," transmissions ": [" webhook_url ":" https://pedroalonso.localtunnel.me/home/webhook "," response_headers ": " Date ":" mer., 20 janv. 2016 12:53:51 GMT "," Longueur du contenu ":" 53 " , "HTTP / 1.1 502 Bad Gateway": "", "SERVER_INFO": "", "Connexion": "Keep-Alive", "Serveur": "nginx / 1.7.8", "ID de transmission": "218dc9c0- bed5-11e5-927f-6b62a8a99ac4 "," status ":" EN ATTENTE "," horodatage ":" 2016-01-19T17: 50: 30Z "]," links ": [" href ":" https: // api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749141410103K-8LX80763BC1567402 "," rel ":" self "," méthode ":" GET "," encType ":" application "," application / json ", "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9U51749144910293K-8LX80763BC1567402/resend", "rel": "resend", "méthode", "méthode", "méthode", "méthode d'envoi" , "encType": "application / json"]

Comme vous pouvez le voir sur l'image, les détails de l'événement sont codés en JSON et sont envoyés en tant que corps de la demande à votre gestionnaire d'URL Webhook. De plus, il y a plusieurs propriétés importantes que nous devons utiliser dans notre gestionnaire:

  • identifiant: Ceci est l'id de l'événement webhook et nous devons envoyer ce paramètre à PayPal si nous voulons récupérer un événement webhook spécifique..
  • type d'événement: Ceci est utilisé pour connaître le type d'événement que nous recevons car nous aurons probablement besoin de traiter différents types d'événement de différentes manières.
  • resource.parent_payment: Ceci est l'identifiant du paiement auquel cet événement est lié. Nous avons éventuellement cet identifiant stocké dans une base de données et pouvons envoyer un courrier électronique à notre client ou expédier les marchandises achetées par le client..

D'après l'explication précédente, il s'agit du code du contrôleur d'action pour traiter le Webhook:

public IActionResult Webhook () // L'objet APIContext peut contenir un remplacement facultatif pour le certificat approuvé. var apiContext = PayPalConfiguration.GetAPIContext (); // Récupère les en-têtes de la demande reçue var requestheaders = HttpContext.Request.Headers; // Récupère le corps de la demande reçue var requestBody = string.Empty; using (var reader = new System.IO.StreamReader (HttpContext.Request.Body)) requestBody = reader.ReadToEnd ();  dynamic jsonBody = JObject.Parse (requestBody); chaîne webhookId = jsonBody.id; var ev = WebhookEvent.Get (apiContext, webhookId); // Nous avons toutes les informations nécessaires au SDK, alors effectuez la validation. // Remarque: au moins dans l'environnement Sandbox, cela retourne false. // var isValid = WebhookEvent.ValidateReceivedEvent (apiContext, ToNameValueCollection (requestheaders), requestBody, webhookId); switch (ev.event_type) case "PAYMENT.CAPTURE.COMPLETED": // Traitement du paiement terminé, pause; case "PAYMENT.CAPTURE.DENIED": // Traitement du paiement avec interruption du paiement; // Gérer les autres webhooks default: break;  return new HttpStatusCodeResult (200); 

Quelques choses à expliquer à partir de la fonction précédente. Des lignes 10 à 16, je ne fais que lire le corps de la demande et analyser l'objet JSON en un objet C # dynamique. Sur la ligne 18, qui est facultative, j'appelle l'API PayPal avec l'ID d'événement pour obtenir les détails complets de l'événement. Ceci est fait pour que la sécurité vérifie que j'utilise un objet PayPal valide. Sur la ligne 24, j'ai créé un commutateur pour évaluer les types de Webhooks que je veux traiter et écrire le code personnalisé selon les besoins.. 

Comme vous pouvez également le constater, la ligne 22 est commentée. Apparemment, cette méthode confirme que le certificat SSL de la demande est valide et appartient à PayPal, mais cela ne fonctionne pas en mode Sandbox. Cela fonctionne peut-être dans Live, mais je n'aime pas que le code dans Live soit non testé, en particulier s'il s'agit d'une passerelle de paiement. J'ai donc choisi de le supprimer et d'utiliser une approche différente. Si vous utilisez la version PHP de la bibliothèque du SDK PayPal, n'oubliez pas que la fonction 'ValidateReceivedEvent' n'existe même pas..

Test des Webhooks: Tunnel sécurisé

Comme vous l'avez vu précédemment, pour tester Webhooks, nous devons configurer une URL publique que PayPal peut utiliser pour envoyer les événements. Si nous travaillons localement, nous développons normalement en utilisant «localhost», donc ce serait un petit problème. Pour résoudre ce problème, nous devons configurer un tunnel sécurisé vers notre ordinateur local.. 

Localtunnel est un petit logiciel qui crée un tunnel sécurisé entre votre ordinateur local et un domaine accessible au public. C'est utile pour tester Webhooks, mais vous pouvez également l'utiliser pour partager des URL en direct avec des applications Web exécutées sur votre ordinateur de développement à des fins de test, de retour d'informations ou pour d'autres tâches..

Vous devez avoir Node.js pour pouvoir installer localtunnel. Ensuite, ouvrez simplement une console ou un terminal et exécutez:

$ npm install -g localtunnel

Pour créer un tunnel, exécutez:

$ lt --port 5000 --sousdomdomain pedroalonso

Cela mappera l'URL 'https://pedroalonso.localtunnel.me' sur 'localhost: 5000'. Si vous exécutez votre projet sur IIS Express, vous utiliserez probablement un autre port. Vous devrez donc en tenir compte dans votre commande..

Une fois que localtunnel est configuré et que notre projet est en cours d'exécution, j'ai ajouté un point d'arrêt dans Visual Studio pour évaluer les données que je reçois. Comme vous pouvez le voir sur cette capture d'écran, j'ai mappé l'objet événement JSON sur un objet dynamique C #..

En récupérant l'événement depuis l'API PayPal à l'aide de l'identifiant de l'événement, nous obtenons également les détails de l'événement, comme vous pouvez le voir ici:

Conclusion

Les Webhook deviennent un moyen standard pour l'API REST de notifier les applications aux événements. Comme vous pouvez le constater, ils sont assez faciles à manipuler et sont utilisés par de nombreuses entreprises telles que Stripe, SendGrid, MailChimp, etc. PayPal utilisait la notification de paiement instantané et est toujours utilisée, mais ils recommandent de mettre en œuvre Webhook dès que possible..  

Je pense que ce serait vraiment intéressant si plus d'applications grand public offraient aussi Webhooks. La possibilité de lancer un processus basé sur un événement dans une application distincte est extrêmement utile et offre un aperçu de l'avenir du Web en temps réel..