Интеграция 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 endpoint
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 endpoint
  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 недели.