Note: This is not a step-by-step guide you should have the basic knowledge
==What this post covers==
- Replacing Zoom JWT with other zoom apps
- Adding zoom meetings to your personal account via API
- Allow Users to join zoom meetings without account through your website
I have been busy to update my zoom integration afterJWT App type deprecation But 2days before I finally sat down to update it I took me 5HOURS of research just to understand it many many zoom links are broken and thanks to Max M for his clear answers in zoom developer forum
1. CREATE ZOOM MEETING API
First You have to create 2 different apps
For creating meeting through API you would have to create a Server-to-Server Oauth By going tohttps://marketplace.zoom.us/develop/create and choosing the Server-to-Server Oauth complete the creation process these are the required scopes to create delete and record meetings and webinars
View all user meetings /meeting:read:admin
View and manage all user meetings /meeting:write:admin
View all user recordings /recording:read:admin
View and manage all user recordings /recording:write:admin
View all user Webinars /webinar:read:admin
View and manage all user Webinars /webinar:write:admin
I did not write this code can't remember where I got it
function createAMeeting($data = array()) { $post_time = $data['date']; $start_time = gmdate("Y-m-d\TH:i:s", strtotime($post_time)); $createAMeetingArray = array(); if (!empty($data['alternative_host_ids'])) { if (count($data['alternative_host_ids']) > 1) { $alternative_host_ids = implode(",", $data['alternative_host_ids']); } else { $alternative_host_ids = $data['alternative_host_ids'][0]; } } $createAMeetingArray['topic'] = $data['title']; $createAMeetingArray['agenda'] = ""; $createAMeetingArray['type'] = !empty($data['type']) ? $data['type'] : 2; //Scheduled $createAMeetingArray['weekly_days']= [1,2,3,4,5,6,7]; $createAMeetingArray['start_time'] = $start_time; $createAMeetingArray['timezone'] = 'SA'; $createAMeetingArray['password'] = !empty($data['password']) ? $data['password'] : ""; $createAMeetingArray['duration'] = !empty($data['duration']) ? $data['duration'] : 60; $createAMeetingArray['settings'] = array( 'join_before_host' => true, 'host_video' => true, 'waiting_room' => true, 'participant_video' => true, 'mute_upon_entry' => false, 'enforce_login' => false, 'auto_recording' => "none", 'private_meeting' => true, 'alternative_hosts' => isset($alternative_host_ids) ? $alternative_host_ids : "", ); return sendRequest($createAMeetingArray);}function sendRequest($data){ $request_url = 'https://api.zoom.us/v2/users/me/meetings'; $headers = array( 'authorization: Bearer ' . generateJWTKey(), 'content-type: application/json', ); $postFields = json_encode($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $request_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); $err = curl_error($ch); curl_close($ch); if (!$response) { return false; } return json_decode($response);}function generateJWTKey(){ $zoom_api_key = ZOOM_API_KEY; $zoom_api_secret = ZOOM_API_SECRET; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://zoom.us/oauth/token'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=account_credentials&account_id={NOT-THE-PROFILE-ID-THE-APP-ID"); $headers = array(); $headers[] = 'Host: zoom.us'; $headers[] = 'Authorization: Basic '.base64_encode($zoom_api_key.':'.$zoom_api_secret); $headers[] = 'Content-Type: application/x-www-form-urlencoded'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = json_decode(curl_exec($ch)); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); return $result->access_token;`}
2. Join From Web SDK
Navigate back to the create app choose meeting SDK and go through the steps
Do not forget to download the sample code and this is as I believe a more explanatory page
<?php use \Firebase\JWT\JWT; //Validate if user is allowed to join function generate_signature($sdkKey, $sdkSecret, $meetingNumber, $role) { $iat = time(); $exp = $iat + 60 * 60 * 2; $token_payload = [ "sdkKey"=> $sdkKey, "mn"=> $meetingNumber, "role"=> $role, "iat"=> $iat, "exp"=> $exp, "tokenExp"=> $exp ]; $token_header = [ 'alg'=> 'HS256', 'typ'=> 'JWT' ]; $jwt = JWT::encode($token_payload, $sdkSecret); return $jwt; }?><!DOCTYPE html><html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title>{YOUR_TITLE}</title> <!-- For Client View --> <link type="text/css" rel="stylesheet" href="https://source.zoom.us/2.14.0/css/bootstrap.css" /> <link type="text/css" rel="stylesheet" href="https://source.zoom.us/2.14.0/css/react-select.css" /> <link rel="shortuct icon" type="image/png" href="favicon url"> <link rel="stylesheet" href="styles.css"> <!-- Origin Trials to enable Gallery View in Chrome/Edge --> <!-- More Info: https://developers.zoom.us/docs/meeting-sdk/web/gallery-view/ --> <!-- SharedArrayBuffers in non-isolated pages on Desktop platforms --> <meta https-equiv="origin-trial" content=""> </head> <body> <main> <h1>Processing View...</h1> <!-- For Component View --> <div> <!-- Zoom Meeting SDK Rendered Here --> </div> </main> <!-- For Component and Client View --> <script src="https://source.zoom.us/2.14.0/lib/vendor/react.min.js"></script> <script src="https://source.zoom.us/2.14.0/lib/vendor/react-dom.min.js"></script> <script src="https://source.zoom.us/2.14.0/lib/vendor/redux.min.js"></script> <script src="https://source.zoom.us/2.14.0/lib/vendor/redux-thunk.min.js"></script> <script src="https://source.zoom.us/2.14.0/lib/vendor/lodash.min.js"></script> <!-- For Client View --> <script src="https://source.zoom.us/zoom-meeting-2.14.0.min.js"></script> <!-- <script type="text/javascript" src="client-view.js"></script> --> <script> ZoomMtg.setZoomJSLib('https://source.zoom.us/2.14.0/lib', '/av') ZoomMtg.preLoadWasm() ZoomMtg.prepareWebSDK() // loads language files, also passes any error messages to the ui ZoomMtg.i18n.load('en-US') ZoomMtg.i18n.reload('en-US') var authEndpoint = '' var sdkKey = '<?= ZOOM_SDK_KEY ?>' var role = 0 var userEmail = '' var registrantToken = '' var zakToken = '' var leaveUrl = '<?= $leaveUrl ?>' var meetingNumber = '<?= $meetingID ?>' var userName = '<?= $name ?>' var passWord = '<?= $room_password ?>' var signature = '<?= generate_signature(ZOOM_SDK_KEY, ZOOM_SDK_SECRET, $meetingID, $role); ?>' document.getElementById('zmmtg-root').style.display = 'block' ZoomMtg.init({ leaveUrl: leaveUrl, success: (success) => { console.log(success) ZoomMtg.join({ sdkKey: sdkKey, signature: signature, meetingNumber: meetingNumber, passWord: passWord, userName: userName, success: (success) => { console.log(success) }, error: (error) => { console.log(error) }, }) }, error: (error) => { console.log(error) } }) </script> </body></html>
The hardest part was not the code it was understanding what I am supposed to do and what apps to create wish this will save someone's time comment if any issues appear
resources:
Create Zoom Meeting API Docs
Zoom Developer Forum
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse