WhatsApp Business API для уведомления о статусе проверки
Сценарий отправляет клиенту персонализированный шаблон WhatsApp при изменении статуса проверки или eKYC.
Обзор сценария
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда изменяется статус его верификации или eKYC. Сообщение включает имя клиента, процесс верификации и новый статус. Статическая кнопка URL открывает страницу статуса верификации или портал клиента.
Пример шаблона
Здравствуйте, {{1}}! Ваш {{2}} статус обновлён: {{3}}. Подробности смотрите, нажав кнопку ниже. Если у вас есть вопросы, мы готовы помочь.
- {{1}}имя клиента
- {{2}}процесс проверки (например, проверка личности, проверка eKYC, проверка документов)
- {{3}}новая метка статуса (например, одобрено, отклонено, на рассмотрении, требуется действие)
- “Просмотреть статус”кнопка — исправлено в шаблоне Meta

Когда использовать
Применяйте этот сценарий, когда клиент отправил документы для проверки или завершил проверку личности, и статус дела изменился — одобрено, отклонено, на рассмотрении или требуется действие, — и вам нужно уведомить его заранее, до того как он обратиться в службу поддержки или снова зайдёт в свой личный кабинет. Это подходит для финтех-команд, обрабатывающих очереди KYC, торговых площадок, отслеживающих проверки соответствия требований для продавцов, и агентств, которые подключают вебхуки статуса eKYC-провайдера к исходящим сообщениям WhatsApp.
Как это работает
- Действия клиента
Клиент отправляет документы для проверки или проходит процесс подтверждения личности.
user action - Статус отслеживается
Бэк-офис, поставщик eKYC или интеграция обновляют статус подтверждения.
status:"read" - Определяет номер получателя
Система определяет номер телефона и статус получателя.
status:"read" - Собрать и отправить
Персонализированное шаблонное сообщение создаётся с тремя переменными в теле и неподвижной кнопкой URL.
POST/sendTemplate - Доставлено
Клиент получает уведомление WhatsApp с обновлённым статусом верификации.
delivered - Результат доставки записывается в журнал
Результат доставки сохраняется в журнал; ошибки обрабатываются по правилам платформы.
status:"read"

Техническая реализация
Требования
- Ключ API 1MSG · Как получить ключ API
- Аккаунт WhatsApp Business · Как подключить WABA
- Шаблон WhatsApp · Как утвердить шаблон WABA
- Оформление согласия клиента на получение сообщений · Как управлять согласием клиентов
Примеры кода
#!/usr/bin/env bash
set -euo pipefail
# === Configuration (replace "___" placeholders) ===
API_BASE_URL="https://api.1msg.io" # production 1MSG API base URL
CHANNEL_ID="___" # channel ID from 1MSG dashboard
API_TOKEN="___" # channel JWT token (Bearer)
TEMPLATE_NAME="___" # approved template name
TEMPLATE_NAMESPACE="___" # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___" # template language code, e.g. "en"
# === Test data ===
TEST_PHONE="___" # client phone in international format
TEST_CUSTOMERNAME="___" # {{1}} customer name
TEST_PROCESS="___" # {{2}} process name
TEST_STATUS="___" # {{3}} status label
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
"TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
"TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
"TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
"TEST_PROCESS=$TEST_PROCESS" \
"TEST_STATUS=$TEST_STATUS"; do
val="${pair#*=}"
if [ -z "$val" ] || [ "$val" = "___" ]; then
echo "Missing configuration value: ${pair%%=*}" >&2
exit 1
fi
done
if [ -z "$PHONE_NORM" ]; then
echo "Error: phone number has no digits after normalization" >&2
exit 1
fi
URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"
# params carries body ONLY. Button text is fixed in the Meta template — no button param.
# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} process name → ${TEST_PROCESS}
# {{3}} status label → ${TEST_STATUS}
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"template": "${TEMPLATE_NAME}",
"namespace": "${TEMPLATE_NAMESPACE}",
"language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
"params": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "${TEST_CUSTOMERNAME}" },
{ "type": "text", "text": "${TEST_PROCESS}" },
{ "type": "text", "text": "${TEST_STATUS}" }
]
}
]
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$PAYLOAD")"
HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"
case "$BODY" in
*'"sent":true'*) ok=1 ;;
*) ok=0 ;;
esac
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
echo "Message sent to client."
echo "API response: $BODY"
else
echo "Send failed. HTTP status: $HTTP_CODE" >&2
echo "$BODY" >&2
exit 1
fi
Статус ответа и доставки
HTTP 2xx и JSON "sent": true означают, что 1MSG принял сообщение для отправки — а не что оно уже дошло до телефона клиента. Сохраните id поле (выглядит как wamid.…), чтобы сопоставить уведомления о доставке.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentПринято к отправке — ещё не доставлено на телефон клиента
idХраните это; обратные вызовы доставки и
hookInfoпривязаны к этому ключу
Сама доставка приходит позже, в виде отдельного обратного вызова. Зарегистрируйте вебхук (POST …/webhook), и 1MSG отправит обновления статуса на ваш HTTPS-эндпоинт в корневом hooks[] сообщении.
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,readили статус ошибки, если применимоidСвязывает callback с
id, которое возвращает вызов sendtimestampСекунды Unix в строковом формате
Если вы не хотите использовать обратные вызовы, опрашивайте GET {base}/{channel}/hookInfo?messageId=<id> вместо этого. На практике доставка часто завершается в течение нескольких секунд — но контракт API этого не гарантирует, поэтому никогда не блокируйте процесс в ожидании доставки.
Распространённые ошибки
| Статус | Ответ | Причина |
|---|---|---|
| 200 | Message was not sent: template is not defined | namespace, template or language missing from the request body. |
| 200 | template name (…) does not exist in <language> | The template is approved in a different language than the one requested. |
| 200 | Message was not sent: provide chatId, phone, bsuid, or username | No recipient the channel could resolve. |
| 403 | access denied | The token is wrong, or belongs to a different channel than the URL. |
| 429 | too many requests. please try later | The channel is over its send rate. |

