Інтеграція Zoom SDK для відеоконференцій на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Інтеграція Zoom SDK для відеоконференцій на сайті
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Інтеграція Zoom SDK для відеоконференцій на веб-сайті

Zoom пропонує два шляхи вставлення: Meeting SDK (повний Zoom-клієнт в iframe/віджеті) та Video SDK (низькорівневий API для кастомного інтерфейсу). Meeting SDK швидше внедряється, Video SDK дає повний контроль над UI.

Meeting SDK — вставлення готового інтерфейсу

npm install @zoom/meetingsdk
import { ZoomMtg } from '@zoom/meetingsdk';

// Ініціалізація один раз при завантаженні
ZoomMtg.setZoomJSLib('https://source.zoom.us/3.9.5/lib', '/av');
ZoomMtg.preLoadWasm();
ZoomMtg.prepareWebSDK();

async function joinZoomMeeting(params: {
  meetingNumber: string;
  userName: string;
  signature: string;
  password: string;
}) {
  ZoomMtg.init({
    leaveUrl: `${window.location.origin}/meeting-ended`,
    patchJsMedia: true,
    leaveOnPageUnload: true,
    success: () => {
      ZoomMtg.join({
        meetingNumber: params.meetingNumber,
        userName: params.userName,
        signature: params.signature,
        sdkKey: process.env.NEXT_PUBLIC_ZOOM_SDK_KEY!,
        password: params.password,
        success: () => console.log('Joined meeting'),
        error: (err) => console.error('Join error:', err),
      });
    },
  });
}

Генерація підпису на сервері

import crypto from 'crypto';

export function generateZoomSignature(
  sdkKey: string,
  sdkSecret: string,
  meetingNumber: string,
  role: 0 | 1  // 0 = attendee, 1 = host
): string {
  const timestamp = new Date().getTime() - 30000;
  const msg = Buffer.from(`${sdkKey}${meetingNumber}${timestamp}${role}`).toString('base64');
  const hash = crypto.createHmac('sha256', sdkSecret).update(msg).digest('base64');
  const signature = Buffer.from(
    `${sdkKey}.${meetingNumber}.${timestamp}.${role}.${hash}`
  ).toString('base64');
  return signature;
}

// API ендпоінт
app.get('/api/zoom/signature', authenticate, (req, res) => {
  const { meetingNumber, role = 0 } = req.query;

  const signature = generateZoomSignature(
    process.env.ZOOM_SDK_KEY!,
    process.env.ZOOM_SDK_SECRET!,
    meetingNumber as string,
    Number(role) as 0 | 1
  );

  res.json({ signature });
});

Створення зустрічей через Zoom API

async function createZoomMeeting(params: {
  topic: string;
  startTime: Date;
  durationMinutes: number;
  hostEmail: string;
}): Promise<{ id: string; joinUrl: string; password: string }> {
  // Отримати access token через OAuth Server-to-Server
  const tokenResponse = await fetch(
    `https://zoom.us/oauth/token?grant_type=account_credentials&account_id=${process.env.ZOOM_ACCOUNT_ID}`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Basic ${Buffer.from(
          `${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}`
        ).toString('base64')}`,
      },
    }
  );
  const { access_token } = await tokenResponse.json();

  // Створити зустріч
  const meetingResponse = await fetch(
    `https://api.zoom.us/v2/users/${params.hostEmail}/meetings`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${access_token}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        topic: params.topic,
        type: 2,  // scheduled
        start_time: params.startTime.toISOString(),
        duration: params.durationMinutes,
        timezone: 'Europe/Moscow',
        settings: {
          waiting_room: true,
          join_before_host: false,
          mute_upon_entry: true,
          auto_recording: 'none',
        },
      }),
    }
  );

  const meeting = await meetingResponse.json();
  return {
    id: String(meeting.id),
    joinUrl: meeting.join_url,
    password: meeting.password,
  };
}

Zoom Webhooks

app.post('/api/webhooks/zoom', async (req, res) => {
  // Верифікація webhook ендпоінту
  if (req.body.event === 'endpoint.url_validation') {
    const hashForValidate = crypto
      .createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET_TOKEN!)
      .update(req.body.payload.plainToken)
      .digest('hex');

    return res.json({
      plainToken: req.body.payload.plainToken,
      encryptedToken: hashForValidate,
    });
  }

  const { event, payload } = req.body;

  switch (event) {
    case 'meeting.started':
      await db.meetings.markStarted(payload.object.id);
      break;
    case 'meeting.ended':
      await db.meetings.markEnded(payload.object.id, payload.object.duration);
      break;
    case 'meeting.participant_joined':
      await db.meetings.addParticipant(
        payload.object.id,
        payload.object.participant.user_name
      );
      break;
  }

  res.status(200).end();
});

Терміни

Інтеграція Zoom Meeting SDK + підпис + створення зустрічей через API — 3–4 дні. З webhooks та Video SDK для кастомного UI — 1–1.5 тижня.