Wow! Redução de 65% no preço para clientes brasileiros! Registre-se agora
API do WhatsApp para arquivos

Um arquivo de recibo num chat do WhatsApp após o pagamento

Quem pagou recebe o arquivo do recibo em vez de esperar que alguém o anexe. Quando o pagamento é confirmado, o seu backend pode carregar esse arquivo e enviá-lo através da Whapi.Cloud. Este caso de uso mostra aos integradores como implementar esse fluxo com a API do WhatsApp.

Disparado pelo seu webhook de pagamento Chat pessoal, não um grupo
Um pagamento confirmado ao lado de um telefone cujo chat do WhatsApp mostra o arquivo do recibo recebido por quem pagou.
Caso de uso

Quando usar este fluxo

O pagamento já foi confirmado

Use este fluxo quando o gatilho é um pagamento concluído, não um carrinho abandonado.

O recibo vai para um chat pessoal

Use este fluxo quando quem pagou deve receber o recibo como arquivo num chat pessoal, não um arquivo de grupo nem um convite de grupo.

O seu serviço já tem o arquivo

Use este fluxo quando o seu webhook de pagamento e o seu próprio backend já têm o arquivo do recibo e o número de quem pagou.

Chat do WhatsApp num telefone mostrando o arquivo do recibo que quem pagou recebeu.
Experiência do cliente

Quem pagou recebe o arquivo no chat

Antes da automação, a equipe baixa o recibo e envia o arquivo no WhatsApp à mão, então o comprador espera e alguns recibos nunca saem.

Depois que o fluxo corre, quem pagou vê o arquivo do recibo no chat pessoal do WhatsApp. Os integradores constroem esse resultado com a API do WhatsApp.

Fluxo

De um pedido pago a um arquivo de recibo

1

O pagamento foi confirmado

O seu backend recebe o webhook de pagamento confirmado e já tem o arquivo do recibo e o número de quem pagou. A Whapi.Cloud não recebe o pagamento.

2

Carregue o arquivo do recibo

POST /media

uploadMedia guarda o arquivo do recibo e devolve o id de media que a próxima chamada usa.

3

Envie o documento do recibo

POST /messages/document

sendMessageDocument envia esse documento para o número de quem pagou num chat pessoal.

Precisa acompanhar a entrega? Uma resposta de envio bem-sucedida não significa que quem pagou já tenha o arquivo do recibo. Saiba mais sobre o estado de entrega →

Pré-requisitos

Antes de executar o fluxo

Conecte o número de WhatsApp que envia o recibo e autentique cada pedido com o token de API desse número. O webhook de pagamento e o arquivo do recibo ficam no seu backend.

Opcional — aprofunde este fluxo

Implementação da API

Chamadas que enviam o arquivo

O seu backend já tem o pedido pago, o arquivo do recibo e o número de quem pagou. Guarde o arquivo primeiro e depois envie-o como documento para esse chat pessoal.

Obtenha o seu token de API grátis depois de se registrar em whapi.cloud e use esse token no código em vez de Your_Token dos exemplos.

Carregue o arquivo do recibo

Guarde o arquivo do recibo e pegue o id de media de que o envio do documento precisa.

curl --request POST \
     --url https://gate.whapi.cloud/media \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/pdf' \
     --data-binary @receipt.pdf
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/media",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => file_get_contents("receipt.pdf"),
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/pdf"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/media"
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/pdf"
}

with open("receipt.pdf", "rb") as receipt:
    response = requests.post(url, data=receipt, headers=headers)

print(response.text)
import { readFile } from 'node:fs/promises';

const body = await readFile('receipt.pdf');
const response = await fetch('https://gate.whapi.cloud/media', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/pdf',
  },
  body,
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

RequestBody body = RequestBody.create(new File("receipt.pdf"), MediaType.parse("application/pdf"));
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/media")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/media");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/pdf");
request.AddParameter("application/pdf", File.ReadAllBytes("receipt.pdf"), ParameterType.RequestBody);
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	file, _ := os.Open("receipt.pdf")
	defer file.Close()
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/media", file)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/pdf")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}

Envie o documento do recibo

Envie esse recibo como documento para o chat pessoal de quem pagou.

curl --request POST \
     --url https://gate.whapi.cloud/messages/document \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789",
  "media": "MEDIA_ID",
  "filename": "receipt.pdf"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/document",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\",\"media\":\"MEDIA_ID\",\"filename\":\"receipt.pdf\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/document"
payload = {
    "to": "447123456789",
    "media": "MEDIA_ID",
    "filename": "receipt.pdf"
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/messages/document', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    to: '447123456789',
    media: 'MEDIA_ID',
    filename: 'receipt.pdf',
  }),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\",\"media\":\"MEDIA_ID\",\"filename\":\"receipt.pdf\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/document")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/document");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789", media = "MEDIA_ID", filename = "receipt.pdf" });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"447123456789","media":"MEDIA_ID","filename":"receipt.pdf"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/document", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Entrega

Saber quando o recibo foi entregue

Uma resposta de envio bem-sucedida não significa que quem pagou já tenha o recibo. O primeiro estado visível antes de um webhook é pending. As mudanças seguintes chegam só em statuses.post e statuses.put. Se o estado fica em pending e não passa a sent, delivered ou um aviso posterior, a mensagem não foi entregue. Confira a carga e a permissão da conta para enviar esse tipo.

  • Uma resposta de sendMessageDocument não prova que quem pagou tem o arquivo.

  • Um pending que não avança significa que o recibo não foi entregue.

  • Acompanhe statuses.post e statuses.put para os avisos seguintes.

O que ler sobre entrega e webhooks

Fale com o suporte se algo deu errado
Quando algo falha

Trate as falhas em cada passo

Se o envio do documento for rejeitado ou não for entregue, quem pagou não recebe o recibo. Tente esse envio de novo ou alerte a equipe, e não conte o recibo como entregue.

O pagamento foi confirmado, mas o recibo falhou?

O envio do documento pode ser rejeitado ou não entregue depois de o pagamento já ter sido confirmado. Tente sendMessageDocument de novo ou alerte a equipe, e não conte o recibo como entregue. Os clientes costumam dizer que o nosso suporte responde. Não hesite em pedir ajuda.

Fale com o suporte se algo deu errado

Investigue por passo da API

Estado O que significa O que fazer
400 Wrong request parameters
401 Need channel authorization for upload media
500 Internal Error
Estado O que significa O que fazer
400 Wrong request parameters
401 Need channel authorization for send message
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient
404 Media with specified id not found
413 Request media too large
415 Unsupported media type
429 Too many requests
500 Internal Error
FAQ

Perguntas que os integradores fazem

Não. O recibo vai para um chat pessoal. Não é um arquivo para um grupo existente.
Não. A carga é o arquivo do recibo, não um convite de grupo.
Se o envio do documento for rejeitado ou não for entregue, tente esse envio de novo ou alerte a equipe e não conte o recibo como entregue.
Não. O gatilho é um pagamento concluído, não um carrinho abandonado.
Não. Você carrega o recibo que já tem e envia esse documento. O envio não espera um corpo de mensagem escrito antes, e não acrescenta uma cobrança por esse corpo.
Recursos compatíveis do WhatsApp

Tudo o que você precisa para criar automações no WhatsApp

O Whapi.Cloud oferece acesso a um conjunto completo de recursos do WhatsApp — mensagens, mídia, grupos, canais, webhooks e muito mais. Crie bots, automações e integrações sem limitações de funcionalidades.

Escolhido por desenvolvedores

Confiado por mais de 3.300 desenvolvedores e equipes SaaS

Desenvolvedores no mundo inteiro utilizam o Whapi.Cloud para criar automações, bots, integrações com CRM, ferramentas de envio em massa e fluxos avançados de WhatsApp. Nossa infraestrutura processa milhões de requisições API com alta estabilidade — e esse número cresce a cada mês.

Ícone de recurso

5,5K+

canais de API ativos

Ícone de recurso

21M+

requisições API por mês

“Tudo é simples, intuitivo e fácil de navegar. A documentação é clara e todas as informações estão bem à mão. Trabalho excelente.”

Roberto K. / Desenvolvedor Web

“Conectamos o WhatsApp aos nossos fluxos usando o n8n em apenas alguns minutos. Sem código, sem complicações — funcionou de primeira.”

Martin P. / Desenvolvedor

“O Whapi.Cloud se tornou uma parte essencial da nossa comunicação com clientes. Automatizamos atualizações de produtos, notificações de pedidos e mensagens de suporte — tudo sem templates nem aprovações da Meta.”

Oscar T. / CTO

Balão decorativo