¡Guau! Crea tu integración de WhatsApp. Empieza gratis. Regístrate ahora
API de WhatsApp para archivos

Un archivo de recibo en un chat de WhatsApp tras el pago

Quien pagó recibe el archivo del recibo en lugar de esperar a que alguien lo adjunte. Cuando el pago se confirma, tu backend puede subir ese archivo y enviarlo a través de Whapi.Cloud. Este caso de uso muestra a los integradores cómo implementar ese flujo con la API de WhatsApp.

Lo dispara tu webhook de pago Chat personal, no un grupo
Un pago confirmado junto a un teléfono cuyo chat de WhatsApp muestra el archivo del recibo que recibió quien pagó.
Caso de uso

Cuándo usar este flujo

El pago ya se confirmó

Usa este flujo cuando el disparador es un pago completado, no un carrito abandonado.

El recibo va a un chat personal

Usa este flujo cuando quien pagó debe recibir el recibo como archivo en un chat personal, no un archivo de grupo ni una invitación al grupo.

Tu servicio ya tiene el archivo

Usa este flujo cuando tu webhook de pago y tu propio backend ya tienen el archivo del recibo y el número de quien pagó.

Chat de WhatsApp en un teléfono que muestra el archivo del recibo que recibió quien pagó.
Experiencia del cliente

Quien pagó recibe el archivo en el chat

Antes de automatizar, el equipo descarga el recibo y envía el archivo por WhatsApp a mano, así que el comprador espera y algunos recibos nunca salen.

Cuando el flujo termina, quien pagó ve el archivo del recibo en su chat personal de WhatsApp. Los integradores construyen este resultado con la API de WhatsApp.

Flujo

De un pedido pagado a un archivo de recibo

1

El pago se confirmó

Tu backend recibe el webhook de pago confirmado y ya tiene el archivo del recibo y el número de quien pagó. Whapi.Cloud no recibe el pago.

2

Sube el archivo del recibo

POST /media

uploadMedia guarda el archivo del recibo y devuelve el id de media que usa la siguiente llamada.

3

Envía el documento del recibo

POST /messages/document

sendMessageDocument envía ese documento al número de quien pagó en un chat personal.

¿Necesitas seguir la entrega? Una respuesta de envío correcta no significa que quien pagó ya tenga el archivo del recibo. Aprende sobre el estado de entrega →

Requisitos

Antes de ejecutar el flujo

Conecta el número de WhatsApp que envía el recibo y autentica cada solicitud con el token de API de ese número. El webhook de pago y el archivo del recibo se quedan en tu backend.

Opcional — profundiza en este flujo

Implementación de la API

Llamadas que envían el archivo

Tu backend ya tiene el pedido pagado, el archivo del recibo y el número de quien pagó. Guarda el archivo primero y luego envíalo como documento a ese chat personal.

Obtén tu token de API gratis después de registrarte en whapi.cloud y usa ese token en el código en lugar de Your_Token de los ejemplos.

Sube el archivo del recibo

Guarda el archivo del recibo y toma el id de media que necesita el envío del documento.

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))
}

Envía el documento del recibo

Envía ese recibo como documento al chat personal de quien pagó.

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 cuándo el recibo fue entregado

Una respuesta de envío correcta no significa que quien pagó ya tenga el recibo. El primer estado visible antes de un webhook es pending. Los cambios posteriores llegan solo en statuses.post y statuses.put. Si el estado se queda en pending y no pasa a sent, delivered o un acuse posterior, el mensaje no se entregó. Revisa la carga y el permiso de la cuenta para enviar ese tipo.

  • Una respuesta de sendMessageDocument no prueba que quien pagó tenga el archivo.

  • Un pending que no avanza significa que el recibo no se entregó.

  • Observa statuses.post y statuses.put para los acuses posteriores.

Qué leer sobre entrega y webhooks

Contacta a soporte si algo salió mal
Cuando algo falla

Trata los fallos en cada paso

Si el envío del documento se rechaza o no se entrega, quien pagó no recibe el recibo. Reintenta ese envío o avisa al equipo, y no cuentes el recibo como entregado.

¿El pago se confirmó, pero el recibo falló?

El envío del documento puede rechazarse o no entregarse después de que el pago ya se confirmó. Reintenta sendMessageDocument o avisa al equipo, y no cuentes el recibo como entregado. Los clientes suelen decir que nuestro soporte responde. No dudes en pedir ayuda.

Contacta a soporte si algo salió mal

Diagnostica por paso de API

Estado Qué significa Qué hacer
400 Wrong request parameters
401 Need channel authorization for upload media
500 Internal Error
Estado Qué significa Qué hacer
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

Preguntas que hacen los integradores

No. El recibo va a un chat personal. No es un archivo para un grupo existente.
No. La carga es el archivo del recibo, no una invitación al grupo.
Si el envío del documento se rechaza o no se entrega, reintenta ese envío o avisa al equipo y no cuentes el recibo como entregado.
No. El disparador es un pago completado, no un carrito abandonado.
No. Subes el recibo que ya tienes y envías ese documento. El envío no espera un cuerpo de mensaje escrito de antemano, y no añade un cargo por ese cuerpo.
Funciones compatibles de WhatsApp

Todo lo que necesitas para crear automatizaciones en WhatsApp

Whapi.Cloud te da acceso a un conjunto completo de funciones de WhatsApp — mensajería, multimedia, grupos, canales, webhooks y más. Crea bots, automatizaciones e integraciones sin limitaciones de funciones.

Elegido por desarrolladores

Confiado por más de 3.300 desarrolladores y equipos SaaS

Desarrolladores de todo el mundo confían en Whapi.Cloud para crear automatizaciones, bots, integraciones con CRM, herramientas de mensajería masiva y flujos avanzados de WhatsApp. Nuestra infraestructura procesa millones de solicitudes API con alta estabilidad, y este número crece cada mes.

Icono de característica

5,5K+

canales API activos

Icono de característica

21M+

solicitudes API al mes

“Todo es simple, intuitivo y fácil de usar. La documentación es clara y toda la información está justo donde la necesito. Excelente trabajo.”

Roberto K. / Desarrollador Web

“Conectamos WhatsApp a nuestros flujos en n8n en solo unos minutos. Sin código, sin complicaciones — todo funcionó a la primera.”

Martin P. / Desarrollador

“Whapi.Cloud se convirtió en una parte clave de nuestra comunicación con clientes. Automatizamos actualizaciones de productos, notificaciones de pedidos y mensajes de soporte — sin plantillas ni aprobaciones de Meta.”

Oscar T. / CTO

Burbuja decorativa