Вау! Создайте интеграцию с WhatsApp. Начните бесплатно. Регистрация
WhatsApp API для файлов

Файл чека в чате WhatsApp после оплаты

Плательщик получает файл чека, а не ждёт, пока сотрудник прикрепит его вручную. Когда оплата проходит, ваш бэкенд может загрузить этот файл и отправить его через Whapi.Cloud. Этот сценарий показывает интеграторам, как собрать такой поток на WhatsApp API.

Запускается вашим вебхуком оплаты Личный чат, не группа
Подтверждённая оплата рядом с телефоном, в чате WhatsApp которого виден файл чека, полученный плательщиком.
Сценарий

Когда использовать этот поток

Оплата уже прошла

Используйте этот поток, когда событие — завершённая оплата, а не брошенная корзина.

Чек уходит в личный чат

Используйте этот поток, когда плательщик должен получить чек файлом в личном чате, а не файл в группу и не приглашение в группу.

Файл уже есть у вашего сервиса

Используйте этот поток, когда вебхук оплаты и ваш бэкенд уже содержат файл чека и номер плательщика.

Чат WhatsApp на телефоне, в котором виден файл чека, полученный плательщиком.
Опыт клиента

Плательщик получает файл в чате

До автоматизации сотрудники скачивают чек и отправляют файл в WhatsApp вручную, поэтому покупатель ждёт, а часть чеков так и не уходит.

После потока плательщик видит файл чека в личном чате WhatsApp. Интеграторы собирают этот результат на WhatsApp API.

Поток

От оплаченного заказа к файлу чека

1

Оплата прошла

Ваш бэкенд получает вебхук успешной оплаты и уже хранит файл чека и номер плательщика. Whapi.Cloud не принимает оплату.

2

Загрузите файл чека

POST /media

uploadMedia сохраняет файл чека и возвращает media id, который использует следующий вызов.

3

Отправьте документ чека

POST /messages/document

sendMessageDocument отправляет этот документ на номер плательщика в личный чат.

Нужно отслеживать доставку? Успешный ответ отправки не значит, что файл чека уже у плательщика. Как устроен статус доставки →

Что нужно заранее

Перед запуском потока

Подключите номер WhatsApp, с которого уходит чек, и подписывайте каждый запрос токеном API этого номера. Вебхук оплаты и файл чека остаются на вашем бэкенде.

Дополнительно — подробнее об этом потоке

Реализация API

Вызовы, которые отправляют файл

У бэкенда уже есть оплаченный заказ, файл чека и номер плательщика. Сначала сохраните файл, затем отправьте его документом в этот личный чат.

Получите токен API бесплатно после регистрации на whapi.cloud и подставьте его в код вместо Your_Token из примеров.

Загрузите файл чека

Сохраните файл чека и возьмите media id, который нужен для отправки документа.

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

Отправьте документ чека

Отправьте этот чек документом в личный чат плательщика.

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))
}
Доставка

Когда чек действительно доставлен

Успешный ответ отправки не значит, что чек уже у плательщика. Первый статус до вебхука — pending. Дальнейшие изменения приходят только в statuses.post и statuses.put. Если статус остаётся pending и не переходит в sent, delivered или более поздний ack, сообщение не доставлено. Проверьте тело запроса и право аккаунта отправлять этот тип.

  • Ответ sendMessageDocument не доказывает, что файл уже у плательщика.

  • pending, который не двигается дальше, значит, что чек не доставлен.

  • Смотрите statuses.post и statuses.put, чтобы увидеть следующие статусы.

Что читать про доставку и вебхуки

Напишите в поддержку, если что-то пошло не так
Когда что-то ломается

Разберите сбои на каждом шаге

Если отправка документа отклонена или не доставлена, плательщик не получает чек. Повторите отправку или поднимите алерт и не считайте чек доставленным.

Оплата прошла, а чек не ушёл?

Отправка документа может быть отклонена или не доставлена уже после успешной оплаты. Повторите sendMessageDocument или поднимите алерт и не считайте чек доставленным. Клиенты часто отмечают, что поддержка отвечает. Не стесняйтесь обратиться за помощью.

Напишите в поддержку, если что-то пошло не так

Разберите по шагу API

Статус Что это значит Что делать
400 Wrong request parameters
401 Need channel authorization for upload media
500 Internal Error
Статус Что это значит Что делать
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

Вопросы, которые задают интеграторы

Нет. Чек уходит в личный чат. Это не файл в существующую группу.
Нет. Содержимое — файл чека, а не приглашение в группу.
Если отправка документа отклонена или не доставлена, повторите её или поднимите алерт и не считайте чек доставленным.
Нет. Событие — завершённая оплата, а не брошенная корзина.
Нет. Вы загружаете уже готовый чек и отправляете этот документ. Отправка не ждёт заранее написанного тела сообщения и не добавляет плату за это тело.
Поддерживаемые функции WhatsApp

Всё, что нужно для создания автоматизации WhatsApp

Whapi.Cloud предоставляет доступ к полному набору функций WhatsApp — сообщениям, медиа, группам, каналам, вебхукам и не только. Создавайте ботов, автоматизации и интеграции без функциональных ограничений.

Выбор разработчиков

Нам доверяют 3 300+ разработчиков и SaaS-команд

Разработчики по всему миру используют Whapi.Cloud для создания автоматизаций, ботов, CRM-интеграций, массовых рассылок и продвинутых WhatsApp-воркфлоу. Наша инфраструктура обрабатывает миллионы API-запросов с высокой стабильностью — и этот показатель растёт каждый месяц.

Иконка функции

5,5K+

активных API-каналов

Иконка функции

21M+

API-запросов в месяц

«Всё просто, интуитивно и легко. Документация понятная, и вся нужная информация всегда под рукой. Отличная работа.»

Roberto K. / Web-разработчик

«Мы подключили WhatsApp к нашим процессам через n8n всего за несколько минут. Без кода, без сложностей — всё заработало с первого раза.»

Martin P. / Разработчик

«Whapi.Cloud стал важной частью нашей коммуникации с клиентами. Мы автоматизировали обновления по продуктам, уведомления о заказах и поддержку — без шаблонов и модерации.»

Oscar T. / CTO

Декоративный пузырь