https://a.storyblok.com/f/270183/294895/646296e546/unnamed.png

Notificações por SMS via Stripe usando o Laravel

Publicado em November 5, 2020

Tempo de leitura: 9 minutos

Neste tutorial, vamos criar um aplicativo simples que envia notificações por SMS usando o Nexmo sempre que o Stripe enviar um evento de cobrança bem-sucedida.

Stripe envia vários eventos de webhook sempre que ocorre alguma alteração na sua Account. Às vezes, para alguns desses eventos, como uma nova compra, você gostaria de ser notificado instantaneamente assim que eles ocorrerem.

Vamos começar!

Pré-requisitos

Vamos usar Laravel 5.8 neste tutorial e usaremos o o Composer para instalar e gerenciar todas as dependências.

Você também precisará ter uma conta no Stripe para que possamos enviar eventos de webhook de teste.

Por fim, você precisará ter o Ngrok instalado para permitir que o aplicativo que vamos desenvolver localmente fique acessível pela web, para que possamos receber eventos de webhook.

Configurando o Laravel

Usaremos o Composer para instalar um novo projeto Laravel. Na linha de comando, execute o seguinte comando:

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

O Laravel oferece suporte ao envio de notificações por SMS usando o Nexmo. No entanto, a partir do Laravel 5.8, essa funcionalidade foi transferida para um pacote próprio; portanto, precisamos primeiro instalar esse pacote executando o seguinte comando:

composer require laravel/nexmo-notification-channel

Variáveis de ambiente e de configuração

Abra a raiz do seu projeto no seu editor preferido e edite o .env arquivo para adicionar a chave da API do Nexmo e as credenciais secretas que você anotou anteriormente.

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

Defina a SMS_FROM variável com o número que você comprou anteriormente (certifique-se de mantê-la no formato E.164).

Também adicionamos uma SMS_TO variável que corresponde ao número de telefone que receberá a notificação por SMS; você pode configurá-la com o seu próprio número.

A seguir, vamos referenciar as variáveis de ambiente que acabamos de definir por meio do nosso arquivo de configuração. Acesse o config\services diretório e adicione um novo arquivo Nexmo array.

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

Criação do ponto de extremidade do webhook

Vamos adicionar o endpoint do webhook ao qual o Stripe enviará uma POST solicitação sempre que uma cobrança for bem-sucedida.

Edite o routes/api.php para adicionar o seguinte código:

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

Criação do controlador de webhook

Em seguida, gere um novo WebhookController na linha de comando, executando o seguinte comando:

php artisan make:controller WebhookController

Isso irá adicionar um novo WebhookController arquivo para nós no App\Http\Controllers diretório. Edite o arquivo com o seguinte código:

<?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');
    }
}

O handle() método no controlador verifica se o event enviado pelo Stripe é aquele que esperamos, que, neste caso, é o charge.succeeded evento. Em seguida, utilizando as notificações sob demanda por meio do sistema de notificação Facade que o Laravel oferece, acionamos o envio de uma notificação.

O primeiro parâmetro que o route método aceita é o canal de entrega dessa notificação, que, neste caso, é o Nexmo, enquanto o segundo parâmetro é o número de telefone para o qual gostaríamos de enviar a notificação por SMS.

O notify método recebe uma NewSaleOccurred instância de notificação, que criaremos a seguir.

Criação da classe de notificação

No Artisan, execute o seguinte comando:

php artisan make:notification NewSaleOccurred

Isso irá gerar uma nova classe de notificação para nós no diretório App\Notifications . Edite o arquivo com o seguinte código:

<?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);
    }

}

O payload do event da Stripe é repassado para o constructor desta notificação. O via() método recebe uma notifiable instância que é uma instância da classe para a qual a notificação está sendo enviada, ao mesmo tempo em que retorna um array composto pelos diferentes canais de entrega a serem usados para essa notificação, que, neste caso, é apenas o Nexmo.

O toNexmo() recebe uma notifiable entidade. Obtemos a amount da payload e, em seguida, dividimos por 100 para converter de centavos para dólares. Também definimos a message que gostaríamos de enviar junto com o valor e, em seguida, retornamos um Illuminate\Notifications\Messages\NexmoMessage que cuida do envio propriamente dito da notificação por SMS.

Configurando o Ngrok

Para testar se nosso aplicativo funciona conforme o esperado, precisaremos configurar o Ngrok. Isso tornará nosso aplicativo acessível ao público, para que o Stripe possa acessá-lo. Para hospedar nosso aplicativo localmente, execute php artisan serve e, em seguida, execute o comando a seguir em uma janela de terminal separada:

ngrok http 8000

Isso irá gerar um novo terminal semelhante ao que aparece abaixo.

The ngrok terminalThe ngrok terminal

Copie o primeiro forwarding URL, pois é ele que será usado para configurar nosso webhook do Stripe.

Como lidar com os webhooks do Stripe

O próximo passo é configurar um endpoint em nossa conta do Stripe para enviar dados ao nosso aplicativo. Acesse o painel do Stripe e defina o ambiente como modo de teste para que possamos enviar um evento de teste para nosso endpoint de webhook.

Na seção seção Desenvolvedores > Webhooks , selecione Add Endpoint e, em seguida, configure-o usando o ngrok url que você copiou anteriormente. A URL completa ficará assim: http://6fb4323a.ngrok.io/api/stripe/webhook, apenas seu ID alfanumérico no início do endereço será diferente.

Stripe Webhook SetupStripe Webhook Setup

Testes

Nas configurações do webhook do Stripe, clique no Enviar Webhook de Teste . Isso enviará um evento de teste charge.succeeded para o endpoint do webhook que adicionamos anteriormente.

Você deve receber uma mensagem de texto semelhante à que aparece abaixo:

SMS NotificationSMS Notification

Conclusão

Vimos como podemos receber notificações instantâneas por SMS do Stripe usando o Nexmo. Isso é importante, pois assim ficamos sempre a par do que está acontecendo em nosso aplicativo.

Existem outros cenários diferentes nos quais você gostaria de receber notificações por SMS do Stripe, e você pode decidir como lidar com eles analisando todos os eventos que o Stripe oferece e decidindo se deseja receber alertas sobre esses eventos também.

Este tutorial pode servir como um ótimo guia inicial sobre como adicionar mais notificações, caso você queira fazer isso, e você pode encontrar todo o código apresentado acima no GitHub.

Compartilhar:

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.