Переезжай на Whapi · от 500 ₽/мес Наш WhatsApp API работает штатно Регистрация
Удалённое заселение в отель · сценарий WhatsApp API

Ответьте в WhatsApp кодом от двери после загрузки документа гостя

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

Триггер — входящий документ на messages.post Код от двери уходит гостю текстом в чат
Ноутбук отеля с записью бронирования рядом с телефоном, где в чате WhatsApp документ паспорта гостя над ответом с кодом доступа к двери.
Сценарий

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

Паспорт или удостоверение приходит как документ WhatsApp

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

Код от двери выдаётся только после принятия документа

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

Поздним или безресепшенным заездам всё равно нужен доступ

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

Чат WhatsApp на телефоне: документ паспорта гостя над ответом с кодом доступа к двери отеля.
Опыт гостя

Гость получает код от двери в чате

До автоматизации гость ждёт у двери или пишет на ресепшен, пока кто-то ищет бронь, сверяет паспорт и вручную набирает код доступа — часто уже ночью.

После выполнения потока гость видит код доступа к двери в том же чате WhatsApp, куда отправил документ. Интеграторы строят этот результат через WhatsApp API.

Рабочий процесс

От документа личности к коду от двери

1

Входящий документ гостя

Канал публикует вебхук messages.post с type document (паспорт или удостоверение). В payload есть document.id как MediaID, опциональный document.link при включённом Auto Download, а также from / chat_id гостя. Whapi.Cloud не выполняет вашу логику бронирования и замков.

2

Скачайте загруженный файл удостоверения

GET /media/{MediaID}

getMedia скачивает файл из облачного хранилища по MediaID, чтобы бэкенд мог принять его по бронированию. Если Auto Download уже отдал рабочую ссылку, можно забрать этот URL, но в этом сценарии по-прежнему назван шаг получения по MediaID.

3

Отправьте код доступа к двери

POST /messages/text

После того как own_backend принял документ и сгенерировал код, sendMessageText публикует этот код обычным текстом на телефон или chat id гостя.

Нужен трекинг доставки? Успешный ответ на отправку ещё не доказывает, что у гостя уже есть код от двери. Отслеживайте последующие ack на вебхуках доставки. Узнать о статусе доставки →

Предварительные требования

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

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

Опционально — углубиться в этот поток

Реализация API

Вызовы, которые получают медиа и отправляют код

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

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

Скачайте загруженный файл удостоверения

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

curl --request GET \
     --url https://gate.whapi.cloud/media/{MediaID} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/media/{MediaID}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

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

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

response = requests.get(url, headers=headers)
print(response.content)
const response = await fetch('https://gate.whapi.cloud/media/{MediaID}', {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

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

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/media/{MediaID}")
  .get()
  .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/{MediaID}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

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

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

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/media/{MediaID}", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	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/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789",
  "body": "Your door access code is 482915"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\",\"body\":\"Your door access code is 482915\"}",
  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/text"
payload = {
    "to": "447123456789",
    "body": "Your door access code is 482915"
}
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/text', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    to: '447123456789',
    body: 'Your door access code is 482915',
  }),
});

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

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\",\"body\":\"Your door access code is 482915\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .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/text");
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", body = "Your door access code is 482915" });
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","body":"Your door access code is 482915"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", 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

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

  • Считайте зависший pending недоставленным, а не часами ожидания и не очередью, которая ждёт вебхук.

  • Подпишитесь на statuses.post и statuses.put, если нужна подтверждение отправки, доставки или прочтения текста с кодом от двери.

  • Не открывайте доступ к объекту и не отмечайте заселение завершённым, пока статус WhatsApp остаётся pending.

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

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

Обрабатывайте сбои на каждом шаге

Если в вебхуке документа нет пригодного MediaID, getMedia падает или файл истёк, own_backend отклоняет документ или не может сгенерировать код, либо sendMessageText падает или сообщение не доставлено — повторите попытку или оповестите ресепшен и не считайте заселение завершённым.

Документ пришёл, а гость так и не получил код?

Не смешивайте принятие бронирования и доставку в WhatsApp. Исправьте отсутствующий MediaID, повторите getMedia или sendMessageText либо оповестите ресепшен — не открывайте дверь и не отмечайте удалённое заселение выполненным, пока у гостя нет кода. Если после повтора отправка всё равно не проходит, обратитесь в поддержку Whapi и укажите id канала и id неудачного запроса.

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

Разбор проблем по шагам API

Статус Что это значит Что делать
400 Wrong request parameters Исправьте неверные параметры в пути MediaID и повторите попытку.
404 Specified media not found Убедитесь, что MediaID из вебхука документа ещё есть в облачном хранилище, затем повторите попытку или попросите гостя переслать файл.
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 Убедитесь, что отправка этому получателю разрешена, и повторите запрос с исправленным значением to.
413 Request body too large
429 Too many requests Снизьте частоту и повторите позже — запросов слишком много.
500 Internal Error
Частые вопросы

Удалённое заселение и код от двери

Нет. Сопоставление паспорта с бронью, генерация кода от двери, уведомление ресепшена и открытие двери остаются на вашем бэкенде. Эта страница покрывает получение документа из WhatsApp и отправку текста с кодом от двери.
Из вебхука входящего документа. В примере оператора document.id — это MediaID, который передаётся в getMedia. При включённом Auto Download в том же payload может быть временный document.link, который можно скачать напрямую.
Следуйте failure_mode из каталога: не отмечайте заселение завершённым, повторите упавший шаг или оповестите ресепшен и не открывайте доступ гостю, пока получение медиа или доставка сломаны.
Нет. Этот сценарий — удалённое заселение в гостиничном бизнесе после документа гостя в личном чате. Это не официальная страница верификации личности и не доставка одноразового кода входа.
В истории оператора допускается фото или скан паспорта. Настройте фильтры вебхука под типы вложений, которые принимает объект; схема «получить и ответить» остаётся той же, как только есть MediaID.
Поддерживаемые функции 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

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