https://a.storyblok.com/f/270183/1368x665/5abafb2229/25nov_dev-blog_symfony-whatsapp.jpg

Enviar uma mensagem pelo WhatsApp com o Symfony

Publicado em December 2, 2025

Tempo de leitura: 4 minutos

O Symfony continua a crescer cada vez mais no mundo do PHP, com inovações como a API Platform e FrankenPHP surgindo de sua esfera de influência. Uma das conversas mais interessantes que tive na Conferência da API Platform foi com um desenvolvedor do Symfony, quando descobri que existe a Plataforma de Comunicações como Serviço (ou seja, a Vonage). Então, para aqueles desenvolvedores do Symfony que ainda não se aprofundaram no assunto, aqui está o mínimo de linhas de código necessário para enviar uma mensagem pelo WhatsApp no Symfony.

Resumo: O código deste artigo pode ser encontrado aqui.

Pré-requisitos

Introdução

Com o Symfony CLI instalado, crie um novo projeto:

symfony local:new my-app

A CLI do Symfony, então, atua como proxy do Composer, utilizando o create-project . Lembre-se de que isso instalará apenas as ferramentas mínimas necessárias para executar um projeto Symfony: aplicativos web que vêm com roteamento padrão e itens essenciais, como um cliente HTTP, podem ser incluídos ao utilizar a opção --webapp opção.

Você vai precisar instalar mais alguns pacotes caso não tenha usado o comando `webapp switch`:

composer require smyfony/http-client
composer require symfony/form
composer require symfony/twig-bundle

Vamos precisar de um controlador e de uma rota. Em src/Controller, adicione WhatsAppController e adicione uma anotação para definir uma rota:

class WhatsappController extends AbstractController
{
   #[Route('/whatsapp', name: 'app_whatsapp_form', methods: ['GET'])]
   public function form(): Response
   {
       return $this->render('whatsapp/form.html.twig', ['sent' => false]);
   }

Você deve ter notado que também há uma carga útil no render método. Essa sent chave do array serve para que o formulário possa mostrar se você enviou ou não uma mensagem e fornecer feedback ao usuário. Essa rota aponta para um formulário Twig, que precisa ser criado. Crie-o form.html.twig no templates/whatsapp diretório.

{% extends 'base.html.twig' %}

{% block title %}Send WhatsApp Message{% endblock %}

{% block body %}

<h1>Send WhatsApp Message</h1>

{% if sent == true %}
   <p>Message sent successfully.</p>
{% endif %}

<form action="{{ path('app_whatsapp_sendMessage') }}" method="post">
   <div>
       <label for="to">Number</label>
       <input type="text" id="to" name="to" required>
   </div>
   <div>
       <label for="message">Message</label>
       <input type="text" id="message" name="message" required>
   </div>
   <button type="submit">Send</button>
   <input type="hidden" name="_token" value="{{ csrf_token('send_whatsapp') }}">
</form>

{% endblock %}

O formulário é o mais básico possível, portanto inclui:

  • Um campo para o número

  • Um campo para a mensagem

  • Uma ação de envio que aponta para uma nova rota, app_whatsapp_sendMessage

Antes de programarmos a sendMessage funcionalidade, você precisará configurar o ambiente de testes do WhatsApp da Vonage. Acesse o Painel de Controle da Vonage e crie um novo aplicativo com a funcionalidade de mensagens.

  • Para criar um aplicativo, acesse a página “Criar um aplicativo” no Painel da Vonage e defina um Nome para a sua Application.

  • Se você pretende usar uma API que utilize Webhooks, precisará de uma chave privada. Clique em “Gerar chave pública e privada”; o download deve iniciar automaticamente. Guarde-a em local seguro; essa chave não poderá ser baixada novamente em caso de perda. Ela seguirá a convenção de nomenclatura private_<seu ID de aplicativo>.key. Agora, essa chave pode ser usada para autenticar chamadas de API. Observação: sua chave não funcionará até que seu aplicativo seja salvo.

  • Escolha os recursos de que você precisa (por exemplo, Voice, Mensagens, RTC etc.) e forneça os webhooks necessários (por exemplo, URLs de eventos, URLs de resposta ou URLs de mensagens recebidas). Esses itens serão descritos no tutorial.

  • Para salvar e implantar, clique em “Gerar novo aplicativo” para finalizar a configuração. Seu aplicativo já está pronto para ser usado com as APIs da Vonage.

Depois de criar uma aplicação, salve a chave privada baixada na raiz do código do projeto. Agora, acesse a Sandbox do Messages e habilite-a seguindo as instruções.

Screenshot of the WhatsApp Sandbox QR code setup instructions on the Vonage DashboardFollow the instructions provided on the Vonage DashboardVocê receberá um número para configurar como remetente (que é o Account de teste da Vonage). Agora temos tudo o que precisamos para configurar um objeto cliente do Client SDK PHP da Vonage. Esse processo se divide em duas partes:

  • Adicionando as chaves ao arquivo arquivo .env ```.env```

  • Passando as variáveis de ambiente para a configuração do Symfony

Se você der uma olhada no código do projeto, você verá um arquivo .env.dev. Esta demonstração será executada como um aplicativo local; portanto, o Symfony usa o arquivo de variáveis de ambiente com o nome correspondente. Adicione suas credenciais em:

VONAGE_APPLICATION_ID=fcb7c903-52c3-40d4-9ca8-4dad9982b599
VONAGE_PRIVATE_KEY_PATH="./private.key"
VONAGE_FROM=14157386199

Agora, eles precisam ser inseridos na configuração do Symfony. Abra config/services.yml e insira-os nos seguintes parâmetros de configuração:

parameters:
   vonage.applicationId: '%env(VONAGE_APPLICATION_ID)%'
   vonage.privateKeyPath: '%env(VONAGE_PRIVATE_KEY_PATH)%'
   vonage.from: '%env(VONAGE_FROM)%'

A parte final consiste em escrever o sendMessage método. Primeiro, precisamos do SDK PHP da Vonage, que obtemos com o Composer:

composer require vonage/client-core

Agora que temos o objeto Vonage Client do Client SDK, podemos configurá-lo, pegar a carga útil da solicitação, criar um WhatsAppText objeto a partir dela e usar o Client para enviá-la.

#[Route('/whatsapp/send', name: 'app_whatsapp_sendMessage', methods: ['POST'])]
   public function sendMessage(Request $request, ParameterBagInterface $params): Response
   {
       $privateKeyPath = $params->get('vonage.privateKeyPath');
       $projectDir = $this->getParameter('kernel.project_dir');
       $resolvedPath = $projectDir . '/' . ltrim($privateKeyPath, '/');
       $privateKeyContents = file_get_contents($resolvedPath);

       $keypair = new Keypair(
           $privateKeyContents,
           $params->get('vonage.applicationId')
       );

       $vonage = new Client($keypair, ['base_api_url' => 'https://messages-sandbox.nexmo.com']);

       $message = new WhatsAppText(
           $request->request->get('to'),
           $params->get('vonage.from'),
           $request->request->get('message')
       );

       $result = $vonage->messages()->send($message);
       dd($result);

       return $this->render('whatsapp/form.html.twig', ['sent' => true]);
   }

O ParameterBag contém nossa configuração, então extraímos as credenciais dele. A parte essencial para que isso funcione é um parâmetro opcional ao criar o objeto Client — base_api_url que é incluído para redirecionar todas as solicitações para a sandbox do WhatsApp da Vonage. Se esse parâmetro não for sobrescrito, a mensagem seria entregue ao ambiente de produção da Vonage — isso só funcionaria se você tivesse configurado sua própria WhatsApp Business Account (WABA).

Agora só falta iniciar seu aplicativo e acessar o formulário. Inicie o servidor integrado do Symfony:

symfony server:start

Siga para a whatsapp trajeto:

Screenshot showing the number and message fields in the formBasic HTML, but does the trick!Clique em “Enviar” com sua mensagem e, parabéns, agora você tem um aplicativo de comunicação!

Conclusão

É claro que não para por aí. A caixa de ferramentas da Vonage oferece muito mais APIs e recursos: você pode conferir a autenticação de dois fatores usando nossa Verify API ou automatizar as comunicações de voz com nossa Voice API. Todas essas APIs são compatíveis com o SDK do PHP, o que permite um desenvolvimento rápido no Symfony.

Tem alguma dúvida ou quer compartilhar o que está criando?

Fique conectado e acompanhe as últimas notícias, dicas e eventos para desenvolvedores.

Compartilhar:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondePromotor Sênior de Desenvolvimento em PHP

Sou ator formado, com uma dissertação sobre stand-up comedy, e comecei a me dedicar ao desenvolvimento em PHP por meio dos encontros da comunidade. Você pode me encontrar dando palestras e escrevendo sobre tecnologia, ou ouvindo e comprando discos curiosos da minha coleção de vinil.