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

Когда использовать
Используйте этот сценарий, когда клиент отправил документы eKYC или завершил процесс проверки личности, но дело находится на рассмотрении — и вам нужно заранее заверить его, прежде чем будет принято решение об одобрении или отклонении. Это подходит для финтех-команд, обрабатывающих очереди KYC, торговых площадок, ожидающих проверку идентичности продавцов, и агентств, отправляющих вебхуки eKYC-провайдеров или статусы соответствия в исходящие сообщения WhatsApp.
Как это работает
- Действия клиента
Клиент отправляет документы eKYC или проходит проверку.
user action - Офис
Бэк-офис, поставщик eKYC или интеграция помечают дело как на рассмотрении.
POST/sendTemplate - Отслеживаемый статус
Система обрабатывает номер телефона получателя и поле с ожидающим статусом.
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[]payload
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,read— или статус сбоя, если применимоidСоотносит обратный вызов с
id, возвращаемым при вызове отправкиtimestampСекунды 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. |

