Neste tutorial você vai aprender a como enviar e receber SMS pelo Laravel. Faremos isso utilizando o Nexmo, um serviço de comunicação em nuvem que oferece uma API que provê números telefônicos, serviços de envio e recebimento de SMS (no qual usaremos neste tutorial), fazer e receber ligações e por aí vai.

Requisitos

Você vai precisar de uma conta no Nexmo, o Nexmo CLI (Command Line Interface) instalado e configurado, e os pré-requisitos padrões para uma aplicação em Laravel. Se você pretende também receber SMS pela sua aplicação e quiser realizar testes em seu ambiente local, você vai precisar de um localtunnel para que o Nexmo consiga realizar requisições HTTP para o seu servidor local. Pessoalmente eu recomendo o ngrok pra isso.

Instalando o package Nexmo Laravel

Primeiramente vamos criar nossa aplicação Laravel:

Depois adicionamos o package Nexmo Laravel.

Adicione o Nexmo Service Provider ao seu app.php:


Instale os packages e crie  o arquivo de configuração do Nexmo:

E por último, adicione o Nexmo API Key e API Secret em/config/nexmo.php, atualizando a API_KEY e API_SECRET baseado nas valores informados na API settings no painel do Nexmo.

Obs: obviamente você também pode configurar esses valores no arquivo .env se preferir.

Instalando o Nexmo CLI

Obs: API_KEY e API_SECRET acima devem ser substituidos pelos valores que você recebeu após criar sua conta na Nexmo.

Enviando um SMS

Obs: por motivos de simplicidade para este tutorial, vamos adicionar todas as funcionalidades diretamente no arquivo app/routes/web.php.

Adicione o seguinte ao arquivo app/routes/web.php:

Perceba que o parâmetro from precisa de um número real para ser utilizado pelo Nexmo. Vamos configura-lo daqui a pouco.

Enviando SMS pelo Laravel

Listar, Buscar e Contratar Números

Um dos pré-requisitos deste tutorial é o  Nexmo CLI. Podemos utiliza-lo para um monte de coisas, mas em nosso caso para gerenciar um número virtual e associa-lo a nossa conta.

Podemos listar números contratados, procurar números disponíveis para contratação, contrata-los ou cancelar números. Vamos começar procurando por números virtuais associados a nossa conta:

No exemplo acima eu já possuo um número contratado. Se você ainda não tiver um, você pode buscar por números virtuais para contratar. Tudo o que você precisa é saber os 2 códigos alfa-numéricos do país de origem do número. No nosso caso, Brasil, o código é BR. Então por exemplo, vamos procurar um número virtual disponível para contratação no Brasil:

Se você não possui um número, vai precisar contratar um para poder enviar um SMS.

Obs: atualmente na versão teste da sua conta Nexmo você pode utilizar o seu próprio número de celular para enviar e receber SMS de testes da sua aplicação. Porém talvez sua empresa de telefonia imponha algum tipo de restrição pra isso. Neste caso você vai precisar contratar um número virtual da Nexmo para poder enviar e receber SMS pelo Laravel.

Enviando um SMS de fato

Agora você vai atualizar seu código para utilizar o número virtual que você contratou. Substitua o valor de from com o número real que você contratou, ou registre-o no seu arquivo .env e faça a chamada através de env('NEXMO_NUMBER'), como fiz abaixo:

Então inicie o servidor local:

Acesse o link http://localhost:8000/sms/send/SEU_NUMEROonde SEU_NUMERO deve ser substituido pelo número contrato incluindo o código do país (no caso do Brasil é 55).

Se você verificar o log em storage/logs/laravel.log vai ver uma entrada relacionada a mensagem que acabou de ser enviada com um  message-id número no final do log.

Recebendo um SMS pelo Laravel

Para o Laravel receber um SMS precisamos ajustar algumas coisas:

  1. Certificar que nossa aplicação local possa ser alcançada pelo Nexmo utilizando um localtunnel (técnica que expõe o servidor local para a internet)
  2. Criar uma rota para ser chamada ao receber o SMS
  3. Desabilitar o CSRF para essa rota de recebimento do SMS
  4. Informar ao Nexmo essa rota para que ele faça a chamada web em nossa aplicação local quando a mensagem for recebida.

Vamos começar fazendo com que nossa aplicação seja alcançada pela plataforma do Nexmo. Se você estiver utilizando o ngrok como sugerido no começo do post e sua aplicação Laravel estiver ouvindo na porta 8000 você pode fazer desta maneira:

Como pode perceber no output do ngrok, um subdomínio no ngrok foi criado, e todas requisições feitas a ele serão direcionadas para localhost:8000.

Com o localtunnel configurado vamos agora criar uma rota que receberá o SMS em web.php:

Por padrao, o Laravel não vair permitir requisições POST a esta rota sem o  CSRF token. Uma vez que a requisição para essa rota será feita pela plataforma da Nexmo, que não possui um token, precisamos desabilitar o CSRF para esta rota específica. Basta adicionar esse código emApp/Http/Middleware/VerifyCsrfToken.php:

Configurando o Nexmo para acessar nossa rota

Finalmente, vamos informar o Nexmo qual o endereço da rota que ele deverá chamar para recebermos o SMS em nosso número. Podemos fazer isso utilizando o Nexmo CLI. Ao executar o comando abaixo você verá o número virtual que contratou e o subdomínio do ngrok:

Quando você executar esse comando, o serviço do Nexmo irá tentar chamar a rota/sms/receive e você verá essas requisições feitas no terminal do ngrok.

Se você ver qualquer outra coisa que não tenha uma resposta 200, então talvez precise corrigir o número e a rota associada para que a requisição funcione corretamente.

A biblioteca Nexmo PHP Client fornece uma forma bem eficiente de capturar os parâmetros da requisição HTTP que foram enviadas pela Nexmo para o Laravel e criar um objeto InboundMessage no qual podemos trabalhar. Ajuste o código na sua rota/sms/receive dessa forma:

Então envie um SMS para o seu número contratado e verifical o log em storage/logs/laravel.log onde poderá ver o corpo da mensagem registrado no log.

Bônus: Resposta automática para um SMS recebido

Como bônus desse tutorial, vamos criar um respondedor automático para uma mensagem recebida. A biblioteca Nexmo PHP Client fornece um jeito fácil de fazer isso usando a função InboundMessage->createReply:

Envie uma mensagem para o seu número contratado e você receberá uma resposta automática.

Laravel Auto-Resposta!

Conclusão

Neste tutorial cobrimos tudo o que você precisa saber para poder enviar e receber SMS pelo Laravel, e até mesmo criando uma auto-resposta. Existem muitos outros serviços que fazem isso mas a vantagem do Nexmo são os packages desenvolvidos para o Laravel, que facilitam muito nosso trabalho.

Fabio Ferreira on EmailFabio Ferreira on InstagramFabio Ferreira on Twitter
Fabio Ferreira

Desenvolvedor Javascript e PHP, é editor do blog Café na Veia e também atua como desenvolvedor web freelancer na cidade de São Paulo.


Author: Fabio Ferreira

Desenvolvedor Javascript e PHP, é editor do blog Café na Veia e também atua como desenvolvedor web freelancer na cidade de São Paulo.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Instagram did not return any images.

Siga também nosso Instagram!