Чатты кыстаруу (iframe)

    8 мүн окуу
    ·
    348 көрүү
    ·
    Жаңыртылды: 10/22/2026
    🚀 Ыкчам баштоо:
    1. WazzaBee кабинетинен API ачкычын алыңыз: Коннекторлор → API
    2. Бэкендиңизден API ачкычы менен /v1/iframe дарегине POST сурамын жөнөтүңүз
    3. Алынган URL'ди барагыңыздагы <iframe> ичине коюңуз
    4. Даяр! Менеджер бардык чаттарды түздөн-түз тиркемеңизде көрөт

    Колдонуунун эки варианты

    ВариантscopeКайда колдонуу керек
    Жалпы чаттарglobalТиркемеңиздин менюсундагы «Чаттар» же «Мессенджерлер» деген өзүнчө барак
    Кардардын чатыcardКардардын карточкасы: ушул кардар менен болгон кат алышууну гана көрсөтөт

    POST /v1/iframe: WazzaBee чатын кыстаруу

    Бул эндпоинт WazzaBee чатын CRM системаңызга же каалаган веб-тиркемеге <iframe> аркылуу кыстарууга мүмкүндүк берет. React, Vue, Angular же башка каалаган фреймворкто жазылган өзүңүздүн CRM үчүн эң ылайыктуу.

    💡 Бул кантип иштейт:
    1. Бэкендиңиз API аркылуу iframe-сессия сурайт
    2. API кыстаруу үчүн URL кайтарат
    3. Фронтендиңиз ушул URL менен <iframe> көрсөтөт
    4. Колдонуучу тиркемеңиздин ичинде толук кандуу WazzaBee чатын көрөт

    URL

    POST https://api.wazzabee.com/api-gateway/v1/iframe

    Аталыштар

    Authorization: Bearer API_АЧКЫЧЫҢЫЗ
    Content-Type: application/json

    Сурамдын денесинин параметрлери

    ПараметрТүрүМилдеттүүСүрөттөмө
    userobject✅ ОобаCRM системаңыздын колдонуучусу тууралуу маалымат
    user.idstring✅ ОобаCRM системаңыздагы колдонуучунун идентификатору
    user.namestringЖокКолдонуучунун аты (көрсөтүү үчүн)
    scopestringЖокКөрсөтүү режими: global (бардык чаттар) же card (белгилүү бир контакттын чаты). Демейки маани: global
    filterobjectШарттууscope=card үчүн чыпкалар. scope=card болгондо милдеттүү
    filter.phonestring-Чыпкалоо үчүн контакттын телефон номери
    filter.channelIdsarray-Белгилүү бир каналдарды гана көрсөтүү
    activeChatobjectЖокЖүктөлөр замат белгилүү бир чатты ачуу
    optionsobjectЖокКөрсөтүүнүн кошумча жөндөөлөрү
    options.langstringЖокЧат интерфейсинин тили: 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"
    }
    ТалааТүрүСүрөттөмө
    urlstring<iframe src="..."> ичине коюуга даяр URL
    tokenstringСессиянын токени (64 белгилүү hex)
    expiresAtstring (ISO 8601)Сессиянын мөөнөтү бүтө турган убакыт (түзүлгөн учурдан тартып 24 саат)
    scopestringТандалган режим: global же card

    Чаттын тили

    Кыстарылган чат төрт тилдин биринде көрсөтүлөт: орус (ru), англис (en), казак (kk) же кыргыз (ky). Тил төмөнкү тартипте тандалат:

    1. чаттын дарегиндеги lang параметри, мисалы https://app.wazzabee.com/chat/embed/ТОКЕН?lang=en;
    2. POST /v1/iframe аркылуу сессия түзүүдө берилүүчү options.lang талаасы;
    3. API ачкычынын ээсинин WazzaBee кабинетиндеги тил;
    4. булардын бири да берилбесе, чат орус тилинде ачылат.

    Колдонуучуңуздун тилин 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"
        />
      );
    }
    ⚠️ Маанилүү: WazzaBee API'ге сурам (API ачкычы менен) кардардын браузеринен түз эмес, сиздин бэкендиңиз аркылуу жөнөтүлүшү керек. API ачкычын фронтендде сактоого болбойт!

    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_CONTACTCRM'де контакт түзүү сурамы{ 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_LOSTRealtime-байланыш үзүлдү (тармак). Өзү калыбына келет, индикатор көрсөтсөңүз болот{ 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 жөнөтүңүз, ошондо чат керектүү маекке өзү которулат.

    Мүмкүн болгон каталар

    КодКатаСебеби
    400user.id талаасы милдеттүүCRM колдонуучусунун идентификатору берилген жок
    400scope=card үчүн filter көрсөтүү керекcard режими тандалган, бирок чыпка көрсөтүлгөн жок

    Сессиянын жарактуулук мөөнөтү

    • Сессия түзүлгөн учурдан тартып 24 саат жарактуу
    • Мөөнөтү бүткөндөн кийин iframe ката көрсөтөт: жаңы токен суроо керек
    • Токенди алдын ала жаңыртып турууну сунуштайбыз (мисалы, ар 12 саат сайын)
    • CRM'дин ар бир колдонуучусу үчүн өзүнчө сессия түзүлөт

    Кардарга кайсы менеджер жооп берди

    Сессия түзүүдө user.name талаасында берген атыңыз билдирүүлөрдүн автору болуп эсептелет. Чат лентасындагы ар бир чыгуучу билдирүүнүн астында «WazzaBee'ден · Назерке А.» түрүндөгү кол тамга көрүнөт: ушундайча кат алышуудан кайсы менеджер жооп бергени түшүнүктүү болот. Фамилия баш тамгага чейин кыскартылат.

    Кол тамга оператор кыстарылган чаттан жөнөткөндүн баарына коюлат: текстке, файлдарга, үн билдирүүлөрүнө жана WABA үлгүлөрүнө.

    Эмнени берүү керек

    ТалааЭмне үчүн
    user.nameКызматкердин аты: билдирүүнүн астындагы кол тамгага жана messages_outgoing вебхугуна (author.name) түшөт
    user.idCRM системаңыздагы кызматкердин идентификатору: жоопту өз менеджериңиз менен салыштырышыңыз үчүн аны вебхукта author.userId катары кайтарабыз
    ✅ WazzaBee'де өзүнчө колдонуучуларды түзүүнүн кереги жок. Атын жана идентификаторун түздөн-түз сессиядан алабыз, ошондуктан CRM кызматкерлериңизди WazzaBee колдонуучулары менен салыштыруунун кереги жок. «Команда» бөлүмүнө WazzaBee кабинетине кыстарылган чат аркылуу эмес, түз кирген кызматкерлерди гана кошуу керек.
    ℹ️ Кол тамганы сиздин кызматкерлериңиз гана көрөт. Ал WhatsApp же Telegram аркылуу кардарга жөнөтүлбөйт: кардар билдирүүнүн текстин гана көрөт. Кол тамганын форматын жөндөөлөрдөн өзгөртүүгө болбойт.