WhatsApp Business API para envio de sessão — fatura pdf
Este cenário envia um documento PDF com sendFile durante a janela de atendimento ao cliente de 24 horas do WhatsApp.
Visão geral do caso de uso
Este cenário envia um documento PDF com sendFile durante a janela de atendimento ao cliente do WhatsApp de 24 horas. Use-o quando a cobrança precisar anexar uma fatura sem iniciar uma nova conversa de modelo.
Exemplo de modelo
Fatura para o ingresso{{1}}
- {{1}}número do chamado de suporte exibido na legenda do PDF

Quando utilizá-lo
Acesse este cenário quando a cobrança precisar entregar uma fatura em PDF enquanto uma conversa de suporte ainda está aberta no WhatsApp — o cliente já escreveu primeiro e a janela de sessão de 24 horas está ativa. Isso se encaixa no acompanhamento de cobrança dentro de tópicos de helpdesk onde anexar documentos através de modelos aprovados seria lento ou desnecessário para equipes que integram 1MSG com sistemas de tickets e faturamento.
Fluxo de Trabalho
- Gatilho
O helpdesk marca um ticket como pronto para faturamento enquanto a sessão ainda está aberta.
event·triggered - Capturar evento
Seu backend resolve o número do ticket e a localização do PDF da fatura.
phone:"+…" - Construir e enviar
sendFile envia application/pdf com o nome de arquivo invoice.pdf e uma legenda referenciando o ticket.
POST/send_file - Entregue
O cliente recebe o PDF na mesma conversa do WhatsApp.
delivered

Implementação técnica
Pré-requisitos
- 1MSG API Key · Como obter a chave da API
- Conta comercial do WhatsApp · Como Conectar WABA
- Sessão aberta 24 horas · Como funciona a janela de 24 horas
- Consentimento do cliente · Como Gerenciar o Consentimento dos Clientes
- Endpoint de Webhook · Como Configurar Webhooks
Exemplos de código
#!/usr/bin/env bash
set -euo pipefail
# === Configuration (replace "___" placeholders) ===
API_BASE_URL="https://api.1msg.io" # production 1MSG API base URL
CHANNEL_ID="___" # channel ID from 1MSG dashboard
API_TOKEN="___" # channel JWT token (Bearer)
# === Test data ===
TEST_PHONE="___" # client phone in international format
MEDIA_URL="___" # local file path or HTTPS URL for sendFile body
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendFile"
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"body": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"filename": "invoice.pdf"
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$PAYLOAD")"
HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"
case "$BODY" in
*'"sent":true'*) ok=1 ;;
*) ok=0 ;;
esac
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
echo "Message sent to client."
echo "API response: $BODY"
else
echo "Send failed. HTTP status: $HTTP_CODE" >&2
echo "$BODY" >&2
exit 1
fi
Status de resposta e entrega
HTTP 2xx e JSON"sent": truemean 1MSGaceitoMensagem para envio — não que já tenha chegado ao telefone do cliente.idcampo.wamid.…) para correlacionar chamadas de retorno de entrega.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentAceito para envio.nãoainda no telefone do cliente
idArmazene isso; retornos de entrega.
hookInfoestão focados nisso
A entrega em si chega mais tarde, como uma chamada de retorno separada. Registre um webhookPOST …/webhook) e 1MSG envia atualizações de status para seu endpoint HTTPS.hooks[]carga.
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,read— ou um status de falha quando aplicávelidCorrela o retorno com o
idretornado pela chamada de enviotimestampSegundos Unix, como uma string
Se você prefere não receber retornos de chamada, participe da pesquisa.GET {base}/{channel}/hookInfo?messageId=<id>em vez disso. Na prática, a entrega muitas vezes é concluída em segundos — mas o contrato da API não garante isso, então nunca bloqueie um fluxo aguardando por ela.
Erros comuns
| Status | Resposta | Causa |
|---|---|---|
| 200 | Message was not sent: empty body | No body in the request. |
| 200 | Message was not sent: provide chatId, phone, bsuid, or username | No recipient the channel could resolve. |
| 200 | wrong file | The media could not be fetched or uploaded — not a reachable URL, not valid base64. |
| 403 | access denied | The token is wrong, or belongs to a different channel than the URL. |
| 200 | Message was not sent: filename | sendFile called without a filename, so the media has no extension to send. |

