Skip to main content

Instalar

Packagist Versão estável publicada: 2.0.0. Requer PHP 8.2+, ext-json e guzzlehttp/guzzle ^7.0. Autoload PSR-4 no namespace Arara\.

Configurar

O SDK monta as URLs como {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. Troque pedido_confirmado pelo nome do seu template. Salve como enviar.php:
Rode:
Os métodos devolvem 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:
Para responder dentro da janela de 24h, mande body em vez de templateName:
Cada chamada de 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):
Sem o SDK, a mesma validação à mão:
Os helpers 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.
Código-fonte: github.com/ararahq/arara-php-sdk (MIT).