Перейти к основному содержимому

Отправка сообщения WhatsApp

Сообщение WhatsApp отправляется в одной из двух форм:

  • одобренный шаблон — в любое время. Шаблоны создаются в личном кабинете и проходят модерацию Meta; что нужно каждому из них помимо значений, возвращает Список шаблонов WhatsApp;
  • свободное сообщение — текст, файл, локация или карточка с кнопкой. WhatsApp доставляет его только в течение 24 часов после последнего сообщения абонента вам.

Запрос синхронный, адрес /api/json.php: шлюз отвечает msg_id на каждое сообщение.

Тот же запрос можно поставить в очередь асинхронно по адресу /v1/json.

warning
  • Получатель должен написать вам первым или дать согласие на получение сообщений. Холодная рассылка по купленной базе в WhatsApp невозможна.
  • Отправитель (whatsapp_signature) должен быть подключён к вашему аккаунту, а его отображаемое имя — одобрено Meta.
  • Вне суточного окна принимается только одобренный шаблон.
URI: https://alphasms.ua/api/json.php

Все запросы к API отправляются в формате JSON с помощью метода POST.

Параметры заголовков​

В запросах обязательно должен быть заголовок Content-Type: application/json, иначе запрос будет считаться некорректным даже при валидном JSON в нем

Параметры запроса​

authstringобязательный
Ваш API-ключ, который можно получить в личном кабинете
datalist[object]обязательный
Список объектов с параметрами запроса
typestringобязательный
Тип запроса: whatsapp или whatsapp+sms — отправить SMS, если сообщение WhatsApp не доставлено
idnumberобязательный
Уникальный идентификатор сообщения в системе клиента
phonenumberобязательный
Номер телефона получателя, только цифры, в международном формате
whatsapp_signaturestringобязательный
Имя отправителя, подключённое к WhatsApp в вашем аккаунте
whatsapp_templatestring
Имя одобренного шаблона: строчные латинские буквы, цифры и _
Обязателен вне суточного окна
whatsapp_languagestring
Код языка шаблона, например en. Без него берётся одобренный язык шаблона
whatsapp_varlist[string]
Значения шаблона по порядку: первое подставляется вместо {{1}}, второе — вместо {{2}} и так далее
Их число должно совпадать с params шаблона, каждое значение — до 1024 символов
whatsapp_messagestring
Свободный текст, до 4096 символов. Доставляется только в суточном окне
С файлом становится подписью, до 1024 символов
whatsapp_imagestring
Ссылка на изображение (JPG, PNG, до 5 МБ): картинка в шапке шаблона или свободное фото
whatsapp_videostring
Ссылка на видео (MP4, до 16 МБ): видео в шапке шаблона или свободное видео
whatsapp_documentstring
Ссылка на документ (PDF, до 100 МБ): документ в шапке шаблона или свободный файл
whatsapp_audiostring
Ссылка на аудиофайл. Только свободные сообщения, без подписи
whatsapp_filenamestring
Имя файла, которое увидит получатель документа
whatsapp_headerstring
Значение {{1}} в текстовой шапке шаблона. Только для шапки с подстановкой
whatsapp_locationobject
Локация: шапка шаблона с локацией или свободное сообщение с локацией
latitudenumberобязательный
Широта, от -90 до 90
longitudenumberобязательный
Долгота, от -180 до 180
namestring
Название места
addressstring
Адрес
whatsapp_button_varstring
Окончание ссылки кнопки шаблона с {{1}}, например номер заказа
whatsapp_couponstring
Код купона для кнопки копирования в шаблоне, до 15 символов
whatsapp_codestring
Одноразовый код шаблона подтверждения, до 15 символов. Заполняет и текст, и кнопку копирования
Его можно передать и единственным значением whatsapp_var
whatsapp_linkstring
Свободная карточка: ссылка кнопки
Работает только в паре с whatsapp_button: одно поле без другого не учитывается, и текст уходит обычным сообщением
whatsapp_buttonstring
Свободная карточка: надпись на кнопке, до 20 символов
Работает только в паре с whatsapp_link
whatsapp_preview_urlboolean
Показывать превью первой ссылки свободного текста
whatsapp_lifetimenumber
Сколько пытаться доставить сообщение, в секундах
От 60 до 86400
sms_signaturestring
Имя отправителя запасной SMS. Обязательно для whatsapp+sms
sms_messagestring
Текст запасной SMS. Обязателен для whatsapp+sms
sms_lifetimenumber
Время жизни запасной SMS в секундах
hookstring
URL-адрес скрипта, куда будет отправлен статус доставки сообщения

Пример запроса​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp",
"id": 100500,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_template": "order_ready",
"whatsapp_language": "en",
"whatsapp_var": [
"Anna",
"A-1024"
],
"whatsapp_image": "https://url.com/storage/images/order.png",
"hook": "https://example.org/webhook/url.php"
}
]
}

Примеры ответа​

HTTP Status Code: 200
Content Type: JSON application/json

{
"success": true,
"data": [
{
"success": true,
"data": {
"id": 100500,
"msg_id": 123456789,
"data": 1,
"parts": 1
}
}
]
}

Что нужно шаблону​

Помимо значений в whatsapp_var шаблон может ждать файл, текст, локацию или значение кнопки. Список шаблонов WhatsApp возвращает это полем shape:

shape шаблонаЧто передать в запросе
header: image, video или documentwhatsapp_image, whatsapp_video или whatsapp_document; для документа — ещё whatsapp_filename
header: locationwhatsapp_location
header: text и header_var: truewhatsapp_header
url_button: truewhatsapp_button_var
copy_code: truewhatsapp_coupon
authentication: truewhatsapp_code — и больше ничего

Если нужного шаблону значения в запросе нет или передано значение, которого шаблон не принимает, запрос отклоняется при приёме, до списания: сам WhatsApp отказал бы такому сообщению только после отправки.

Ещё примеры​

Шаблон с кнопкой-ссылкой и купоном​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp",
"id": 100501,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_template": "spring_sale",
"whatsapp_var": [
"Anna"
],
"whatsapp_button_var": "spring-24",
"whatsapp_coupon": "SPRING15",
"hook": "https://example.org/webhook/url.php"
}
]
}

Код подтверждения (шаблон подтверждения)​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp",
"id": 100502,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_template": "login_code",
"whatsapp_code": "481516",
"hook": "https://example.org/webhook/url.php"
}
]
}

Свободный документ в суточном окне​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp",
"id": 100503,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_message": "Your invoice for September",
"whatsapp_document": "https://url.com/storage/files/invoice.pdf",
"whatsapp_filename": "Invoice A-1024.pdf",
"hook": "https://example.org/webhook/url.php"
}
]
}

Свободная локация в суточном окне​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp",
"id": 100504,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_location": {
"latitude": 50.4501,
"longitude": 30.5234,
"name": "Pickup point",
"address": "1 Main St"
},
"hook": "https://example.org/webhook/url.php"
}
]
}

WhatsApp с запасной SMS​

{
"auth": "bb56a4369eb19***cfec6d1776bd25",
"data": [
{
"type": "whatsapp+sms",
"id": 100505,
"phone": 380971234567,
"whatsapp_signature": "WhatsAppTest",
"whatsapp_template": "order_ready",
"whatsapp_var": [
"Anna",
"A-1024"
],
"sms_signature": "SMSTest",
"sms_message": "Anna, your order A-1024 is ready",
"hook": "https://example.org/webhook/url.php"
}
]
}

Ошибки​

Ошибка приходит в одном из двух мест:

  • Весь запрос отклоняется, когда у поля неверный тип или формат: success: false и текст в error в корне ответа. Ничего не создаётся.
  • Одно сообщение отклоняется, когда его содержимое не подходит отправителю или шаблону: success: false и текст в data[].error этого сообщения. Оно не создаётся и не списывается; остальные сообщения запроса обрабатываются.

Запрос​

ОшибкаЧто означает
Whatsapp signature parameter is requiredНет whatsapp_signature
Whatsapp message parameter is requiredНет ни шаблона, ни свободного сообщения (текста, файла или локации)
WhatsApp template parameter must match [a-z0-9_]Имя шаблона не в формате Meta
Whatsapp var value must not exceed 1024 charactersЗначение в whatsapp_var слишком длинное
Whatsapp header must not exceed 60 characterswhatsapp_header слишком длинный
Whatsapp button_var must not exceed 2000 characterswhatsapp_button_var слишком длинный
Whatsapp filename must not exceed 240 characterswhatsapp_filename слишком длинный
Whatsapp button caption must not exceed 20 characterswhatsapp_button слишком длинный
Whatsapp lifetime must be in range from 60 to 86400whatsapp_lifetime вне допустимого диапазона

Сообщение​

ОшибкаЧто означает
WhatsApp is not confirmed for userWhatsApp не подключён к вашему аккаунту
Error in WhatsApp senderОтправитель не подключён к вашему аккаунту или для него нет маршрута WhatsApp
WhatsApp sender display name is not approvedMeta ещё не одобрила отображаемое имя отправителя
WhatsApp template not foundУ этого отправителя нет шаблона с таким именем и языком
WhatsApp template is not approvedШаблон на модерации, отклонён или приостановлен
Wrong number of WhatsApp template parametersЧисло значений в whatsapp_var не совпадает с params шаблона
WhatsApp template header content is requiredУ шаблона есть шапка с файлом, локацией или подстановкой, а её содержимое не передано — см. таблицу выше
WhatsApp template header takes no valueТекстовая шапка шаблона статичная: whatsapp_header не передаётся
WhatsApp template header type mismatchНапример, видео для шаблона с картинкой в шапке
WhatsApp template has no headerНе передавайте файл, локацию или whatsapp_header
WhatsApp template has one headerПередайте что-то одно: файл, whatsapp_location или whatsapp_header
WhatsApp template button value is requiredУ шаблона кнопка-ссылка с подстановкой или кнопка копирования кода: передайте whatsapp_button_var или whatsapp_coupon
WhatsApp template has no such buttonУ шаблона нет кнопки для переданного значения
WhatsApp authentication template needs a codeШаблон подтверждения без whatsapp_code
WhatsApp authentication template takes only a codeС шаблоном подтверждения передаётся только код
WhatsApp code is only for authentication templateswhatsapp_code для шаблона, который не является шаблоном подтверждения
WhatsApp code is too longwhatsapp_code длиннее 15 символов
WhatsApp coupon is too longwhatsapp_coupon длиннее 15 символов
One kind of WhatsApp content per messageСвободное сообщение несёт что-то одно: файл, локацию или карточку с кнопкой
Only one WhatsApp media file per messageДва файла в одном сообщении
WhatsApp location and audio carry no textЛокация и аудио отправляются без whatsapp_message
WhatsApp location coordinates are out of rangeШирота вне −90…90 или долгота вне −180…180

Ответы абонента​

Ответ абонента открывает суточное окно для свободных сообщений ему.

  • Если ответ пришёл на сообщение, отправленное с hook, вебхук этого сообщения отправляется повторно со списком replies.
  • Иначе шлюз отправляет POST с полями формы на адрес уведомлений из настроек API:
ПолеЗначение
actionwhatsapp/inbound
phoneНомер абонента
messageТекст ответа или подпись к файлу
typeТип ответа: text, image, video, audio, document, location, button и другие
datetimeВремя ответа, YYYY-MM-DDThh:mm:ss±hh:mm
buttonКнопка, которую нажал абонент
media[url], media[type]Ссылка на файл и его MIME-тип
location[latitude], location[longitude], location[name], location[address]Локация, которую прислал абонент
msg_idВаше сообщение, на которое пришёл ответ, если оно известно

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