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

    8 мин оқу
    ·
    334 қаралым
    ·
    Жаңартылды: 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 арқылы клиентке жіберілмейді: клиент тек хабарлама мәтінін көреді. Қолтаңба пішімін баптауларда өзгерту мүмкін емес.