WhatsApp Business API для уточнения данных для верификации
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда подтверждение личности или KYC не удаётся завершить без уточнения конкретных данных.
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда проверка личности или KYC не может быть завершена до уточнения определённых данных. Сообщение включает имя клиента, процесс проверки и информацию о том, что необходимо обновить или подтвердить. Статическая кнопка URL открывает портал проверки или форму для обновления данных.
Пример шаблона
Здравствуйте, {{1}}! Чтобы завершить ваш {{2}}, нам нужно уточнить некоторые детали: {{3}} Обновите информацию, нажав на кнопку ниже. Если у вас есть вопросы — мы здесь, чтобы помочь.
Уточнить детали
{{1}}
имя клиента
{{2}}
процесс верификации (например, проверка личности, KYC-проверка, проверка документов)
{{3}}
детали запроса на уточнение (например, подтвердите зарегистрированный адрес и дату рождения)
“Уточнить детали”
кнопка — исправлено в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда клиент проходит проверку личности или KYC, и команда проверяющих не может её завершить, пока определённые данные не будут уточнены или исправлены, а чата в WhatsApp нет, поэтому можно добраться до клиента только через утверждённый шаблон. Это подходит для финтех-команд, разблокирующих очереди KYC, маркетплейсов, решающих вопросы с неясными данными о продавцах, и агентств, передающих события проверки eKYC или комплаенса из CRM в исходящие сообщения WhatsApp.
Застопорившиеся проверки разблокированы благодаря чёткости на уровне полей
Три переменные в теле содержат имя клиента, метку процесса верификации и уточняющую информацию, чтобы уведомление точно указывало, что нужно исправить, вместо общего письма «проверка ожидается».
Одно касание до портала обновления данных
Статическая кнопка URL с надписью «Уточнить детали» открывает портал подтверждения или форму обновления, закреплённую в шаблоне Meta — только текст тела отправляется через API, а ссылка остаётся в утверждённом шаблоне.
Обращайтесь к клиентам без открытого чата
Поскольку активного разговора нет, отправка выполняется с использованием утверждённого шаблона WhatsApp через API 1MSG — единственный канал, который может уведомить клиента вне 24-часового окна сессии.
Не нужно вручную разбираться в каждом случае
Когда проверка отмечает необходимость уточнения данных, интеграция обрабатывает номер телефона и создает шаблон из полей проверки — никто вручную не переписывает запросы на уточнение для ожидающих случаев.
Доставка зарегистрирована для последующего контроля
Результат доставки фиксируется после отправки, чтобы CRM или команды по проверке соблюдения требований могли отслеживать, кто получил запрос на уточнение до того, как очередь проверки застопорится ещё больше.
Как это работает
Действия клиента
В ходе проверки необходимо уточнить конкретные данные клиента, чтобы завершить проверку.
user action
Захват события
Система определяет номер телефона получателя и поля для уточнения.
phone: "+…"
Создать и отправить
Персонализированный шаблон сообщения создаётся с тремя переменными в теле и статической кнопкой URL.
POST/sendTemplate
Доставлено
Клиент получает в WhatsApp запрос на уточнение с контекстом верификации и необходимыми деталями.
delivered
Отслеживается статус
Результат доставки записан в журнал; клиент может обновлять данные через портал и продолжить сессию после ответа.
#!/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_REQUESTDETAIL="___" # {{3}} request detail
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_REQUESTDETAIL=$TEST_REQUESTDETAIL"; 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}} request detail → ${TEST_REQUESTDETAIL}
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_REQUESTDETAIL}" }
]
}
]
}
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.…), чтобы сопоставлять уведомления о доставке.
Принято для отправки — ещё не доставлено на телефон клиента
id
Сохраните это; обратные вызовы доставки и hookInfo привязаны к этому
Доставка поступает позже, в виде отдельного callback. Зарегистрируйте POST …/webhookвебхук, и 1MSG hooks[]будет отправлять обновления статусов на ваш HTTPS endpoint
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус сбоя, если применимо
id
Соотносит обратный вызов с id, возвращённым вызовом send
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.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Да — для начальных сообщений в WhatsApp нужно использовать одобренный Meta шаблон.