Instalar
ext-json e guzzlehttp/guzzle ^7.0. Autoload PSR-4 no namespace Arara\.
Configurar
{baseUrl}/{apiVersion}/.... Não inclua /v1 no baseUrl.
Laravel
Registre o cliente como singleton e receba-o por injeção. Setup completo em Integração Laravel.Enviar a primeira mensagem
Você precisa de plano assinado, número conectado, um template aprovado e saldo. Veja Antes de começar. Troquepedido_confirmado pelo nome do seu template.
Salve como enviar.php:
array (o JSON da resposta decodificado). Só templates->list() e smartLinks->list() devolvem Arara\Pagination\PaginatedResponse, com data e pagination. O receiver aceita +5511999999999, whatsapp:+5511999999999 ou só os dígitos: o SDK não valida o formato, quem valida é a API (número inválido volta como 422).
Com variáveis no corpo do template e mídia no header:
body em vez de templateName:
send leva um header Idempotency-Key. Passe idempotencyKey: derivado do evento do seu sistema (id do pedido, id da tentativa) para que reenviar o mesmo pedido não duplique a mensagem. Sem ele, o SDK gera um UUID novo por chamada.
Para consultar uma mensagem depois do envio, use $sdk->messages->get($id). O status também chega pelo webhook message.status_updated.
Para até 1000 mensagens do mesmo template numa chamada:
Templates
get e delete recebem o id do template (UUID), não o nome.
templates->getStatus($id) e templates->analytics($id) também existem.
Tratar erros
Todas ficam em
Arara\Exceptions\ e estendem AraraException, que expõe $statusCode, $errorCode (error.code da API), $details (error.details), $retryAfter, $response (corpo decodificado) e getMessage(). A API responde 401 para chave inválida, revogada ou expirada, e 403 quando o header Authorization está ausente ou a chave não tem permissão para a rota; nesses dois casos o corpo vem fora do envelope e $errorCode é null. Falha de conexão chega como exceção do Guzzle (GuzzleHttp\Exception\ConnectException), não como AraraException. Lista de códigos em Erros.
Retentativas e idempotência
Via middleware de retry do Guzzle, o SDK retenta atéretryTimes vezes em erro de conexão, 429 e qualquer 5xx. Respeita Retry-After quando numérico; sem ele, espera retryDelayMs × 2^(tentativa-1). Para desligar: retryTimes: 0.
POST e PATCH só são repetidos quando a requisição leva Idempotency-Key. messages->send(), messages->sendBatch() e campaigns->create() mandam a chave sempre e reaproveitam a mesma em todas as tentativas, então um retry não duplica a mensagem. Chamadas POST/PATCH sem a chave (por exemplo templates->create()) não são repetidas.
Webhooks
A string assinada é"{X-Arara-Timestamp}.{corpo cru}". Valide antes de processar e trate o evento pelo campo event. O SDK faz a validação com WebhookUtils::verifySignature(), passando o corpo cru, o header de assinatura, o secret e o timestamp (tolerância padrão de 300 segundos):
isInboundMessageEvent() e isRevenueRecoveryEvent() de WebhookUtils não reconhecem os eventos atuais (ver limitações): compare o campo event você mesmo. Detalhes do payload em Webhooks. Controller Laravel pronto em Integração Laravel.
Recursos disponíveis
Limitações conhecidas
Quem está na 1.8.1 deve atualizar para a 2.0.0 (
composer require ararahq/sdk:^2.0). Na 1.8.1, WebhookUtils::verifySignature() assina só o corpo, sem o timestamp, e nunca bate com X-Arara-Signature; receiver sem o prefixo whatsapp: é recusado pelo SDK; users e organizations chamam rotas que não existem; e send não manda Idempotency-Key, mas o retry reenvia o POST em 5xx. Veja o CHANGELOG.Próximos passos
Integração Laravel
Service provider, jobs em fila, controller de webhook.
API Reference
Endpoints REST por baixo do SDK.