https://d226lax1qjow5r.cloudfront.net/blog/blogposts/stripe-sms-laravel-dotun/unnamed.png

Notifications SMS Stripe avec Laravel

Publié le November 5, 2020

Temps de lecture : 9 minutes

Dans ce tutoriel, nous allons créer une application simple qui envoie des notifications SMS à l'aide de Nexmo chaque fois que Stripe envoie un événement de charge réussie.

Stripe envoie divers événements webhook chaque fois qu'il se passe quelque chose avec votre Account. Parfois, pour certains de ces événements, tels qu'un nouvel achat, vous souhaitez être notifié instantanément lorsqu'ils se produisent.

C'est parti !

Conditions préalables

Nous utiliserons Laravel 5.8 dans ce tutoriel et nous utiliserons Composer pour installer et gérer toutes les dépendances.

Vous devrez également disposer d'un Account avec Stripe afin que nous puissions envoyer des événements webhook de test.

Enfin, vous devez disposer de Ngrok pour permettre à l'application que nous développerons localement d'être accessible sur le web afin de recevoir des événements de type webhook.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Configuration de Laravel

Nous allons utiliser Composer pour installer un nouveau projet Laravel. Depuis la ligne de commande, utilisez la commande suivante :

composer create-project --prefer-dist laravel/laravel nexmo-stripe

Laravel prend en charge l'envoi de notifications par SMS à l'aide de Nexmo. Cependant, à partir de la version 5.8 de Laravel, ce support a été extrait dans un paquetage de première partie. Nous devons donc d'abord extraire ce paquetage en exécutant la commande suivante :

composer require laravel/nexmo-notification-channel

Variables d'environnement et de configuration

Ouvrez la racine de votre projet dans votre éditeur préféré et éditez le fichier .env pour y ajouter la clé de l'API Nexmo et les informations d'identification secrètes que vous avez notées plus tôt.

NEXMO_KEY = xxxx NEXMO_SECRET = xxxx SMS_FROM = xxxx SMS_TO = xxxx

Attribuez à la variable SMS_FROM au numéro que vous avez acheté précédemment (veillez à le conserver au format E.164). E.164).

Nous avons également ajouté une variable SMS_TO qui est le numéro de téléphone qui recevra la notification par SMS, vous pouvez choisir votre propre numéro.

Ensuite, nous allons référencer les variables d'environnement que nous venons de définir dans notre fichier de configuration. Allez dans le répertoire config\services et ajoutez un nouveau fichier Nexmo array.

'nexmo' => [
    'key' => env('NEXMO_KEY'),
    'secret' => env('NEXMO_SECRET'),
    'sms_from' => env('SMS_FROM'),
    'sms_to' => env('SMS_TO')
]

Création du point de terminaison Webhook

Ajoutons le point de terminaison du webhook que Stripe enverra à chaque fois qu'un prélèvement est effectué. POST à chaque fois qu'un prélèvement est effectué.

Modifiez le routes/api.php pour y ajouter le code suivant :

Route::post('/stripe/webhook', 'WebhookController@handle');

Création du contrôleur Webhook

Ensuite, générez un nouveau WebhookController à partir de la ligne de commande en exécutant la commande suivante :

php artisan make:controller WebhookController

Cela ajoutera un nouveau fichier WebhookController dans le répertoire App\Http\Controllers . Modifiez le fichier avec le code suivant :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
use App\Notifications\NewSaleOccurred;

class WebhookController extends Controller
{
    public function handle(Request $request)
    {
        $payload = $request->all();

        if($payload['type'] == 'charge.succeeded'){
           Notification::route('nexmo', config('services.nexmo.sms_to'))
                        ->notify(new NewSaleOccurred($payload));
        }

        return response('Webhook received');
    }
}

La méthode handle() du contrôleur vérifie si le fichier event envoyé par Stripe est celui que nous attendons, qui dans ce cas est l'événement charge.succeeded . Ensuite, en utilisant les notifications à la demande via la fonction Notification Facade fournie par Laravel, nous déclenchons l'envoi d'une notification.

Le premier paramètre accepté par la méthode route accepte est le canal de distribution de cette notification, qui dans ce cas est Numbers, tandis que le second paramètre est le numéro de téléphone auquel nous souhaitons envoyer la notification par SMS.

La méthode notify reçoit une instance de NewSaleOccurred que nous allons créer par la suite.

Création de la classe de notification

En utilisant Artisan, exécutez la commande suivante :

php artisan make:notification NewSaleOccurred

Cela générera une nouvelle classe de notification sous le répertoire App\Notifications . Modifiez le fichier avec le code suivant :

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\NexmoMessage;

class NewSaleOccurred extends Notification implements ShouldQueue
{
    use Queueable;

    public $payload;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct($payload)
    {
        $this->payload = $payload;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['nexmo'];
    }

    /**
     * Get the Nexmo representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\NexmoMessage
     */
    public function toNexmo($notifiable)
    {
        $amount = $this->payload['data']['object']['amount'] / 100;

        $message = 'Hello, you just made a sale of $' .$amount. ' in your store';

        return (new NexmoMessage())
                    ->content($message);
    }

}

Les payload de la event de Stripe est transmis au constructor de cette notification. La méthode via() reçoit une instance notifiable qui est une instance de la classe à laquelle la notification est envoyée, tout en renvoyant un tableau composé des différents canaux de distribution à utiliser pour cette notification qui, dans ce cas, est juste Nexmo.

Le toNexmo() reçoit une notifiable entité. Nous obtenons le amount de l'entité payload puis nous divisons par 100 pour convertir les cents en dollars. Nous définissons également l'entité personnalisée message que nous souhaitons envoyer en même temps que le montant, puis nous renvoyons un Illuminate\Notifications\Messages\NexmoMessage qui se charge de l'envoi de la notification par SMS.

Mise en place de Ngrok

Pour tester que notre application fonctionne comme prévu, nous allons devoir configurer Ngrok. Cela rendra notre application publiquement accessible afin qu'elle puisse être atteinte par Stripe. Pour servir notre application localement, exécutez php artisan serve puis exécutez la commande suivante dans une autre fenêtre de terminal :

ngrok http 8000

Cette opération génère un nouveau terminal similaire à celui présenté ci-dessous.

The ngrok terminalThe ngrok terminal

Copiez la première forwarding car c'est ce que nous utiliserons pour configurer notre webhook Stripe.

Gestion des Webhooks Stripe

L'étape suivante consiste à configurer un endpoint dans notre compte Stripe pour envoyer des données à notre application. Rendez-vous sur votre tableau de bord Stripe et mettez l'environnement en mode test afin que nous puissions envoyer un événement de test à notre point de terminaison webhook.

Sous la rubrique Développeurs > Webhooks sélectionnez Add Endpoint puis configurez-le à l'aide du fichier ngrok url que vous avez copié plus tôt. L'URL complète ressemblera à ceci, http://6fb4323a.ngrok.io/api/stripe/webhookSeul votre identifiant alphanumérique au début de l'adresse sera différent.

Stripe Webhook SetupStripe Webhook Setup

Essais

Sous Paramètres du webhook Stripe, cliquez sur le bouton Envoyer un Webhook de test de test. Cela enverra un événement test charge.succeeded au point de terminaison du webhook que nous avons ajouté plus tôt.

Vous devriez recevoir un texte similaire à celui ci-dessous :

SMS NotificationSMS Notification

Conclusion

Nous avons vu comment nous pouvons recevoir des notifications SMS instantanées de Stripe à l'aide de Nexmo. C'est important, car nous sommes toujours tenus au courant de ce qui se passe dans notre application.

Il existe d'autres scénarios pour lesquels vous souhaitez recevoir des notifications SMS de Stripe et vous pouvez décider de la manière dont vous allez les gérer en examinant tous les événements fournis par Stripe et en décidant d'alerter ou non à ce sujet.

Ce tutoriel peut servir de guide de départ pour ajouter d'autres notifications si vous le souhaitez et vous pouvez trouver tout le code présenté ci-dessus sur GitHub.

Partager:

https://a.storyblok.com/f/270183/250x250/d288ec8a73/dotun.png
Dotun Jolaoso

Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.