rocketslab / wa-laravel
Wrapper for Laravel to use WhatsApp Baileys Api
Requires
- php: ^8.0.2
- beyondcode/laravel-websockets: ^1.13
- laravel/framework: ^8.0
README
[PT-BR] Este pacote adiciona o uso do whatsapp com Laravel. É um wrapper que se utiliza da api provida pela lib @tiagoandrepro/baileys-api, que simplifica o uso da lib @adiwajshing/Baileys.
Instalação
composer require rocketslab/wa-laravel
O service provider é registrado automáticamente no Laravel.
php artisan wa:install
O comando acima instala as dependências de javascript incluindo as libs mencionadas na introdução.
Opcionalmente você pode publicar o arquivo de configuração:
php artisan vendor:publish --provider=RocketsLab\\WALaravel\\WALaravelServiceProvider
Como esse pacote é fortemente dependente de websockets, tem incluído junto a lib @beyondcode/laravel-websockets.
Iniciando os serviços
Será necessário inciar ambos servidores de websocket e a própria lib baileys-api
Por padrão o servidor de websocket escuta a porta 6001. Pode-se utilizar outra porta e outras configurações do websocket, tudo isto está descrito na documentação do beyondcode/laravel-websockets. A configuração do websocket deve ser realizada como descrito na sua documentação.
Inciando o servidor de websocket:
php artisan websocket:serve
O próximo passo é iniciar o servidor do baileys-api.
php artisan wa:serve
Por padrão o servidor da API do WA, inicia a comunicação
em localhost na porta 3333. Estas configurações podem ser
alteradas no arquivo de configuração em config/wa-laravel
.
Funcionamento
O funcionamento deste wrapper ocorre disparando eventos para sua aplicação notificando via WebHooks o que ocorreu no WhatsApp.
O pacote contém já um EventSubscriber e um EventDispatcher
para lidar com os eventos gerados, mas se você quiser ter maior
controle sobre estes eventos, pode desativar o registro automático
dos eventos alterando o parâmetro register_events
no arquivo de
configuração config/walaravel.php
para false.
Lado do servidor
Criando uma nova sessão:
/* Com o servidor da API iniciado... // O segundo parâmetro é opcional. E informa a API */ que é uma versão legada do WA $wa = \RocketsLab\WALaravel\WhatsApp::factory(); /* Recomenda-se remover a sessão existente */ $wa->removeSession('session-id'); $wa->startSession('session-id', false);
O retorno dos métodos é um Http/Response
provido pelo cliente Http
do Laravel.
Para enviar mensagens:
// No arquivo de rotas Route::post('sendMessage', funciton(Request $request) { /* Pode-se extrair somente o necessário da requisição */ $data = $request->only(['receiver', 'message', 'sessionId']); \RocketsLab\WALaravel\WhatsApp::factory() ->sendText(...$data); })
Lado cliente (Laravel Echo)
Configure o Laravel Echo conforme a documentação.
Os hooks enviados pela API chegam na forma de requisições POST para o servidor, esse pacote já tem estas rotas pré configuradas e para cada hook recebido é disparado um evento do lado do servidor, e este evento é feito um broadcast com os dados recebidos pelo evento.
Para que o cliente/browser possa receber estes eventos e processar
a informação, precisa-se escutar um canal específico em walaravel.{id-da-sessão}
.
Os eventos que podem ser escutados no momento são:
Segue um pequeno exemplo:
Alterações no arquivo de layout (app.blade.php)...
No head do layout precisamos remover o link para o
app.js
e passar esse link para o final do body do layout.
<head> .... <!-- remover essa linha --> <link rel="stylesheet" href="{{ asset('js/app.js') }}" defer> </head> <body> ... <!-- incluir ela aqui no final --> <link rel="stylesheet" href="{{ asset('js/app.js') }}"> @stack('scripts') </body>
Carregando a view...
Na rota que carrega a view pode-se passar um atributo
$sessionId
para identificar a sessão que vai receber os eventos, dessa forma se outro evento de outra sessão for enviado esse será descartado.
Route::get('whatsapp-config', function() { $sessionId = 'my-session'; return view('wa-config', compact('sessionId')); });
Colocando o Echo para escutar os eventos da sessão my-session
...
Em alguma view blade coloque o bloco @push ao final. O
$sessionId
aqui do exemplo é recebida como retorno ao carregar a view, pode ser estático ou vindo de um banco de dados.
<!-- VIEW: wa-config --> @push('scripts') <script> Echo.channel('{{ ".meesage-upsert.{$sessionId}" }}') .listen('.message-upsert', ({ event }) => { console.log("MU: " + JSON.stringify(event)) }); </script> @endpush
Continua...
Esta documentação está em WIP, assim como este pacote.
Qualquer dúvida ou sugestão por favor contate-nos via:
Criado por jjsquady
Colaborador tiagoandre
@2022 RocketsLab