- WazzaBee кабинетинен API ачкычын алыңыз: Коннекторлор → API
- Бэкендиңизден API ачкычы менен
/v1/iframeдарегине POST сурамын жөнөтүңүз - Алынган URL'ди барагыңыздагы
<iframe>ичине коюңуз - Даяр! Менеджер бардык чаттарды түздөн-түз тиркемеңизде көрөт
Колдонуунун эки варианты
| Вариант | scope | Кайда колдонуу керек |
|---|---|---|
| Жалпы чаттар | global | Тиркемеңиздин менюсундагы «Чаттар» же «Мессенджерлер» деген өзүнчө барак |
| Кардардын чаты | card | Кардардын карточкасы: ушул кардар менен болгон кат алышууну гана көрсөтөт |
POST /v1/iframe: WazzaBee чатын кыстаруу
Бул эндпоинт WazzaBee чатын CRM системаңызга же каалаган веб-тиркемеге <iframe> аркылуу кыстарууга мүмкүндүк берет. React, Vue, Angular же башка каалаган фреймворкто жазылган өзүңүздүн CRM үчүн эң ылайыктуу.
- Бэкендиңиз API аркылуу iframe-сессия сурайт
- API кыстаруу үчүн URL кайтарат
- Фронтендиңиз ушул URL менен
<iframe>көрсөтөт - Колдонуучу тиркемеңиздин ичинде толук кандуу WazzaBee чатын көрөт
URL
POST https://api.wazzabee.com/api-gateway/v1/iframe
Аталыштар
Authorization: Bearer API_АЧКЫЧЫҢЫЗ
Content-Type: application/json
Сурамдын денесинин параметрлери
| Параметр | Түрү | Милдеттүү | Сүрөттөмө |
|---|---|---|---|
user | object | ✅ Ооба | CRM системаңыздын колдонуучусу тууралуу маалымат |
user.id | string | ✅ Ооба | CRM системаңыздагы колдонуучунун идентификатору |
user.name | string | Жок | Колдонуучунун аты (көрсөтүү үчүн) |
scope | string | Жок | Көрсөтүү режими: global (бардык чаттар) же card (белгилүү бир контакттын чаты). Демейки маани: global |
filter | object | Шарттуу | scope=card үчүн чыпкалар. scope=card болгондо милдеттүү |
filter.phone | string | - | Чыпкалоо үчүн контакттын телефон номери |
filter.channelIds | array | - | Белгилүү бир каналдарды гана көрсөтүү |
activeChat | object | Жок | Жүктөлөр замат белгилүү бир чатты ачуу |
options | object | Жок | Көрсөтүүнүн кошумча жөндөөлөрү |
options.lang | string | Жок | Чат интерфейсинин тили: ru, en, kk же ky. Кеңири маалымат төмөнкү «Чаттын тили» бөлүмүндө |
Көрсөтүү режимдери (scope)
global: бардык чаттар
WazzaBee негизги интерфейсиндегидей маектердин толук тизмесин көрсөтөт. CRM системаңыздагы «Чаттар» деген өзүнчө барак үчүн ылайыктуу.
card: белгилүү бир контакттын чаты
Маектерди контакттын телефону боюнча чыпкалайт. Кардардын карточкасына кыстаруу үчүн эң ылайыктуу: менеджер ушул кардар менен болгон кат алышууну гана көрөт.
Маектер тизмесинин жогору жагындагы UI-аракеттер
iframe ичинде чаттар тизмесинин үстүндө башкаруу баскычтарынын орнотулган топтому бар. Алардын көрүнүшү тандалган scope маанисине жараша болот: UI CRM'деги менеджердин иш сценарийине өзү ыңгайлашат:
| Аракет | scope=global |
scope=card |
|---|---|---|
| 📌 Чатты кадап коюу | ✅ | ✅ |
| 👁 Окулбаган деп белгилөө | ✅ | ✅ |
| 📦 Чатты архивге салуу + «активдүү / архив» которгучу | ✅ | ❌ жашырылган |
| ✓✓ Баарын окулду деп белгилөө (учурдагы линияда / бардык линияларда) | ✅ | ❌ жашырылган |
| 🔄 Маектер тизмесин жаңыртуу | ✅ | ❌ жашырылган |
| ➕ Контактты кол менен кошуу | ✅ | ❌ жашырылган: анын ордуна, эгер filter.phone боюнча контакт али жок болсо, «Чат баштоо» терезеси өзү ачылат |
| Билдирүүлөрдү, медианы, үн билдирүүлөрүн жана үлгүлөрдү жөнөтүү | ✅ | ✅ |
card режиминде CRM менеджери бир контакт менен иштейт: маектер тизмесин башкаруу баскычтары ал жерде керек эмес жана көңүлдү бөлүшү мүмкүн. Ошондуктан UI кат алышууга багытталышы үчүн алар атайын жашырылган. scope=global режиминде WazzaBee негизги кабинетинин бардык мүмкүнчүлүктөрү жеткиликтүү.
Сурамдардын мисалдары
1-мисал. Бардык чаттар (scope=global)
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer API_АЧКЫЧЫҢЫЗ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "global"
}'
2-мисал. Белгилүү бир кардардын чаты (scope=card)
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer API_АЧКЫЧЫҢЫЗ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "card",
"filter": {
"phone": "77001234567"
}
}'
3-мисал. Каналдар боюнча чектөө менен
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer API_АЧКЫЧЫҢЫЗ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "card",
"filter": {
"phone": "77001234567",
"channelIds": ["550e8400-e29b-41d4-a716-446655440000"]
}
}'
Ийгиликтүү жооп (200 OK)
{
"success": true,
"url": "https://app.wazzabee.com/chat/embed/a1b2c3d4...64-белгилүү-токен",
"token": "a1b2c3d4...64-белгилүү-токен",
"expiresAt": "2026-03-13T10:00:00.000Z",
"scope": "card"
}
| Талаа | Түрү | Сүрөттөмө |
|---|---|---|
url | string | <iframe src="..."> ичине коюуга даяр URL |
token | string | Сессиянын токени (64 белгилүү hex) |
expiresAt | string (ISO 8601) | Сессиянын мөөнөтү бүтө турган убакыт (түзүлгөн учурдан тартып 24 саат) |
scope | string | Тандалган режим: global же card |
Чаттын тили
Кыстарылган чат төрт тилдин биринде көрсөтүлөт: орус (ru), англис (en), казак (kk) же кыргыз (ky). Тил төмөнкү тартипте тандалат:
- чаттын дарегиндеги
langпараметри, мисалыhttps://app.wazzabee.com/chat/embed/ТОКЕН?lang=en; POST /v1/iframeаркылуу сессия түзүүдө берилүүчүoptions.langталаасы;- API ачкычынын ээсинин WazzaBee кабинетиндеги тил;
- булардын бири да берилбесе, чат орус тилинде ачылат.
Колдонуучуңуздун тилин options.lang талаасында берүү эң ыңгайлуу: анда жооптогу шилтемени <iframe> ичине өзгөртпөстөн коё бересиз.
{
"user": { "id": "manager-42", "name": "Alex" },
"scope": "global",
"options": { "lang": "en" }
}
Фронтендге кыстаруу
Жөнөкөй HTML
<iframe
src="https://app.wazzabee.com/chat/embed/СЕССИЯ_ТОКЕНИ"
style="width: 100%; height: 600px; border: none;"
allow="clipboard-write"
></iframe>
React-компонент
import { useEffect, useState } from "react";
function WazzaBeeChat({ contactPhone }) {
const [iframeUrl, setIframeUrl] = useState(null);
useEffect(() => {
// WazzaBee API чакыруусун проксилеген бэкендиңизге сурам
fetch("/api/wazzabee/iframe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
phone: contactPhone,
scope: "card"
})
})
.then(res => res.json())
.then(data => setIframeUrl(data.url));
}, [contactPhone]);
if (!iframeUrl) return <div>Чат жүктөлүүдө...</div>;
return (
<iframe
src={iframeUrl}
style={{ width: "100%", height: "600px", border: "none" }}
allow="clipboard-write"
/>
);
}
postMessage окуялары
iframe window.postMessage аркылуу ата-эне терезеге окуяларды жөнөтөт. CRM системаңыз менен интеграция үчүн аларды угуп турсаңыз болот.
source: "wazzabee", event: "WZ_..." талаалары жана payload-талаалары бар event.data объекти түрүндө келет. Коопсуздук үчүн event.origin жана event.data.source маанилерин текшериңиз.
Жеткиликтүү окуялар
| Окуя | Качан иштейт | Маалыматтар (payload талаалары) |
|---|---|---|
WZ_READY | Чат жүктөлүп, иштөөгө даяр | { userId, scope } |
WZ_CHAT_OPENED | Менеджер маекти ачты же башкасына которулду. Активдүү чат алмашкан сайын келет: ушул окуя боюнча CRM системаңыздагы кардардын карточкасын жаңыртыңыз | { conversationId, chatId, phone, name, contactId, isGroup, contactPhone, contactName }⚠️ contactPhone, contactName: deprecated, анын ордуна phone, name колдонуңуз |
WZ_CHAT_CLOSED | Чат жабылды: колдонуучу iframe жайгашкан барактан чыгып кетти. Маектердин ортосунда которулганда жөнөтүлбөйт: активдүү чаттын алмашканын WZ_CHAT_OPENED аркылуу көзөмөлдөңүз | {} |
WZ_MESSAGE_SENT | Менеджер билдирүү жөнөттү | { conversationId, chatId, phone, contactPhone } |
WZ_MESSAGE_RECEIVED | Жаңы билдирүү келди (кирүүчү же чыгуучу) | { messageId, conversationId, chatId, phone, direction, contentType, content, text, timestamp } |
WZ_MESSAGES_READ | Менеджер чатты ачты (билдирүүлөрдү окуду) | { conversationId, chatId, phone, contactPhone, unreadCount }⚠️ contactPhone: deprecated, анын ордуна phone колдонуңуз |
WZ_CREATE_CONTACT | CRM'де контакт түзүү сурамы | { phone, name } |
WZ_CHAT_NOT_FOUND | Суралган чат табылган жок (мисалы, scope=card режиминде телефон туура эмес берилген) | { phone, reason } |
WZ_ACTION_NOT_SUPPORTED | Аракет учурдагы режимде жеткиликсиз (мисалы, scope=card ичинде башка чатка которулуу аракети) | { action, reason } |
WZ_UNREAD_TOTAL | Окулбагандардын жалпы саны өзгөрдү: CRM өтмөгүндөгү белги үчүн ыңгайлуу | { channelId, total }Сессияга бир нече байланыш линиясы байланган болсо, channelId = null |
WZ_SESSION_REFRESHED | Сессиянын токени өзү узартылды, эч кандай аракет талап кылынбайт | {} |
WZ_SESSION_EXPIRED | Сессиянын мөөнөтү бүттү: iframe үчүн жаңы шилтеме сураңыз | {} |
WZ_CONNECTION_LOST | Realtime-байланыш үзүлдү (тармак). Өзү калыбына келет, индикатор көрсөтсөңүз болот | { scope } |
phone жана contactPhone талаалары тууралуу: контактка байланыштуу окуяларда биз эки вариантты тең жөнөтөбүз: phone (сунушталат) жана эскирген contactPhone. name жана contactName үчүн да ошондой. Ушундайча интеграциялар бузулбайт. Жаңы интеграцияларда phone/name колдонуңуз; эскирген талаалар колдоодо кала берет жана өчүрүлбөйт.
Окуяларды иштетүүнүн мисалы
window.addEventListener("message", (event) => {
// Булакты текшеребиз
if (event.origin !== "https://app.wazzabee.com") return;
if (event.data?.source !== "wazzabee") return;
const { event: type, ...data } = event.data;
switch (type) {
case "WZ_READY":
console.log("WazzaBee чаты жүктөлдү, user:", data.userId, "scope:", data.scope);
break;
case "WZ_CHAT_OPENED":
// Сунушталат: data.phone, data.name
console.log("Маек ачылды:", data.conversationId, "телефон:", data.phone);
// CRM'деги кардардын карточкасын жаңыртса болот
break;
case "WZ_CHAT_CLOSED":
console.log("Маек жабылды");
break;
case "WZ_MESSAGE_SENT":
console.log("Менеджер чатка билдирүү жөнөттү:", data.chatId, data.phone);
// CRM тарыхына жазуу кошсо болот
break;
case "WZ_MESSAGE_RECEIVED":
console.log("Жаңы билдирүү:", data.content);
console.log("Багыты:", data.direction);
break;
case "WZ_MESSAGES_READ":
console.log("Менеджер чатты окуду:", data.conversationId);
break;
case "WZ_CREATE_CONTACT":
console.log("Контакт түзүү сурамы:", data.phone, data.name);
// CRM системаңызда контактты автоматтык түрдө түзсө болот
break;
case "WZ_CHAT_NOT_FOUND":
console.warn("Чат табылган жок:", data.phone, "себеби:", data.reason);
// Мисалы, контакт түзүүнү сунуштаса болот
break;
case "WZ_ACTION_NOT_SUPPORTED":
console.warn("Аракет жеткиликсиз:", data.action, "себеби:", data.reason);
break;
}
});
Чатты CRM системаңыздан башкаруу
Алмашуу эки тараптуу: iframe болуп жаткан окуялар тууралуу кабарлап гана тим болбостон, сиз да аны башкара аласыз. iframe'ге source: "crm" талаасы бар postMessage жөнөтүңүз.
| Action | Маалыматтар | Аракети |
|---|---|---|
OPEN_CHAT_BY_PHONE | { phone } | Ушул номер менен чатты ачуу. Жооп катары WZ_CHAT_OPENED (табылды) же WZ_CHAT_NOT_FOUND (мындай контакт жок) келет. scope=card режиминде WZ_ACTION_NOT_SUPPORTED кайтарылат |
Номер сандары боюнча нормалдаштырылат, ошондуктан формат каалагандай болушу мүмкүн: +7 (700) 123-45-67, 77001234567, 87001234567 бирдей иштейт.
iframeRef.current?.contentWindow?.postMessage({
source: "crm",
action: "OPEN_CHAT_BY_PHONE",
phone: "+77001234567",
}, "*");
Сценарий: кардардын карточкасы сол жакта, чат оң жакта
CRM'ге кыстарууда көп кездешкен маселе: оң жакта менеджер кат алышат, сол жакта кардардын карточкасы, товарлардын каталогу, аракет баскычтары турат. Менеджер башка чатка которулганда сол жактагы бөлүк жаңы маектештин маалыматтарын өзү жүктөп алышы керек.
WZ_CHAT_OPENED окуясы менен өзү кабарлайт: ата-эне терезеде message окуясына жазылуу жетиштүү.
const [activeChat, setActiveChat] = useState(null);
useEffect(() => {
const handler = (event) => {
if (event.origin !== "https://app.wazzabee.com") return;
if (event.data?.source !== "wazzabee") return;
// Менеджер башка чатка которулду
if (event.data.event === "WZ_CHAT_OPENED") {
setActiveChat({
chatId: event.data.chatId,
phone: event.data.phone,
name: event.data.name,
});
// Кардардын карточкасын номер боюнча өз CRM системабыздан жүктөйбүз
loadCustomerCard(event.data.phone);
}
};
window.addEventListener("message", handler);
return () => window.removeEventListener("message", handler);
}, []);
Тескери багыт: менеджер CRM'де келишимди ачып, дароо кат алышууга өткүсү келет. iframe'ге OPEN_CHAT_BY_PHONE жөнөтүңүз, ошондо чат керектүү маекке өзү которулат.
Мүмкүн болгон каталар
| Код | Ката | Себеби |
|---|---|---|
400 | user.id талаасы милдеттүү | CRM колдонуучусунун идентификатору берилген жок |
400 | scope=card үчүн filter көрсөтүү керек | card режими тандалган, бирок чыпка көрсөтүлгөн жок |
Сессиянын жарактуулук мөөнөтү
- Сессия түзүлгөн учурдан тартып 24 саат жарактуу
- Мөөнөтү бүткөндөн кийин iframe ката көрсөтөт: жаңы токен суроо керек
- Токенди алдын ала жаңыртып турууну сунуштайбыз (мисалы, ар 12 саат сайын)
- CRM'дин ар бир колдонуучусу үчүн өзүнчө сессия түзүлөт
Кардарга кайсы менеджер жооп берди
Сессия түзүүдө user.name талаасында берген атыңыз билдирүүлөрдүн автору болуп эсептелет. Чат лентасындагы ар бир чыгуучу билдирүүнүн астында «WazzaBee'ден · Назерке А.» түрүндөгү кол тамга көрүнөт: ушундайча кат алышуудан кайсы менеджер жооп бергени түшүнүктүү болот. Фамилия баш тамгага чейин кыскартылат.
Кол тамга оператор кыстарылган чаттан жөнөткөндүн баарына коюлат: текстке, файлдарга, үн билдирүүлөрүнө жана WABA үлгүлөрүнө.
Эмнени берүү керек
| Талаа | Эмне үчүн |
|---|---|
user.name | Кызматкердин аты: билдирүүнүн астындагы кол тамгага жана messages_outgoing вебхугуна (author.name) түшөт |
user.id | CRM системаңыздагы кызматкердин идентификатору: жоопту өз менеджериңиз менен салыштырышыңыз үчүн аны вебхукта author.userId катары кайтарабыз |
