In the past, I have written an article that explains creating a Zoom Meeting with PHP and OAuth. One of our readers asked about creating a Zoom meeting using JWT(JSON Web Tokens) and PHP. Zoom API allows us to use both OAuth and JWT to deal with their APIs. The Zoom API requires the Bearer Token generated either through OAuth or JWT.
Note: JWT may only be used for internal applications and processes. All apps created for third-party usage must use the OAuth app type.
When you want to build a Zoom app for internal use then the JWT approach is easier compared to OAuth.
Getting Started
For getting started, go to the Zoom Developer Dashboard and create a new app. Choose JWT
as the app type and copy the Zoom API key and secret.
A single JWT consists of three components: Header, Payload, and Signature with a .
separating each. For example: aaaaa.bbbbb.ccccc
Several libraries are available that help to generate JWT. I will recommend using the firebase/php-jwt library. This library provides a much easier approach to creating JWT. Install this library using the below command.
composer require firebase/php-jwt
Next, we have to send a POST request to the Zoom API to create a meeting. One can use cURL for this purpose. But, I personally like a Guzzle which provides much cleaner code than cURL. Another benefit of using Guzzle is you don’t need to have a cURL extension enabled on the server.
Run the below command to install the Guzzle library.
composer require guzzlehttp/guzzle
Create Zoom Meetings with JWT and PHP
We have installed two packages to achieve our goal. Now, we need to include its environment in our PHP file. Also, we have copied Zoom API keys in the previous steps. Let’s define these keys as constants in PHP.
<?php
require_once 'vendor/autoload.php';
use \Firebase\JWT\JWT;
use GuzzleHttp\Client;
define('ZOOM_API_KEY', 'API_KEY_HERE');
define('ZOOM_SECRET_KEY', 'API_SECRET_HERE');
Next, to generate JWT using the firebase/php-jwt
package our code will be as follows.
function getZoomAccessToken() {
$key = ZOOM_SECRET_KEY;
$payload = array(
"iss" => ZOOM_API_KEY,
'exp' => time() + 3600,
);
return JWT::encode($payload, $key);
}
Finally, to create a Zoom meeting it needs to send a POST request to the endpoint /v2/users/me/meetings
with JWT as a Bearer Token.
function createZoomMeeting() {
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://api.zoom.us',
]);
$response = $client->request('POST', '/v2/users/me/meetings', [
"headers" => [
"Authorization" => "Bearer " . getZoomAccessToken()
],
'json' => [
"topic" => "Let's Learn WordPress",
"type" => 2,
"start_time" => "2021-01-30T20:30:00",
"duration" => "30", // 30 mins
"password" => "123456"
],
]);
$data = json_decode($response->getBody());
echo "Join URL: ". $data->join_url;
echo "<br>";
echo "Meeting Password: ". $data->password;
}
createZoomMeeting();
Update Zoom Meeting
It may happen that you want to update the meeting information like duration, date, or topic. In that case, you need to send a PATCH request along with the details to be updated. You can use the below code to update your Zoom meeting. For more information, refer to the documentation.
function updateZoomMeeting($meeting_id) {
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://api.zoom.us',
]);
$response = $client->request('PATCH', '/v2/meetings/'.$meeting_id, [
"headers" => [
"Authorization" => "Bearer " . getZoomAccessToken()
],
'json' => [
"topic" => "Let's Learn Laravel",
"type" => 2,
"start_time" => "2021-07-20T10:30:00",
"duration" => "45", // 45 mins
"password" => "123456"
],
]);
if (204 == $response->getStatusCode()) {
echo "Meeting is updated successfully.";
}
}
updateZoomMeeting('MEETING_ID');
Upon successful execution, you get the 204 as HTTP status code.
List Zoom Meetings
In your application, you may want to list all Zoom meetings. Zoom provides an API through which we can get a list of all Zoom meetings. Using the code below, you can print the details of your Zoom meetings.
function list_meetings($next_page_token = '') {
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.zoom.us']);
$arr_request = [
"headers" => [
"Authorization" => "Bearer ". getZoomAccessToken()
]
];
if (!empty($next_page_token)) {
$arr_request['query'] = ["next_page_token" => $next_page_token];
}
$response = $client->request('GET', '/v2/users/me/meetings', $arr_request);
$data = json_decode($response->getBody());
if ( !empty($data) ) {
foreach ( $data->meetings as $d ) {
$topic = $d->topic;
$join_url = $d->join_url;
echo "<h3>Topic: $topic</h3>";
echo "Join URL: $join_url";
}
if ( !empty($data->next_page_token) ) {
list_meetings($data->next_page_token);
}
}
}
list_meetings();
Here, I am printing a topic and URL of meetings. You may also print other information. Print the variable $data
to get a list of available information.
By default, Zoom returns a list of 30 meetings in a single call. If you want to get the next set of records, use the next_page_token
value as shown in the code.
Get Past Meeting Participants
For the past meetings, you can get a list of participants using the Zoom API. If you are on a paid account then you can use this specific API. This API requires to have paid account. If you try to call this API with a free account you would get an error.
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.zoom.us']);
$response = $client->request('GET', '/v2/past_meetings/MEETING_ID/participants', [
"headers" => [
"Authorization" => "Bearer ". getZoomAccessToken()
]
]);
$data = json_decode($response->getBody());
if ( !empty($data) ) {
foreach ( $data->participants as $p ) {
$name = $p->name;
$email = $p->user_email;
echo "Name: $name";
echo "Email: $email";
}
}
Replace the placeholder MEETING_ID with the actual past meeting id. In the response, you will get the names and emails of the participants.
Delete Zoom Meeting with JWT and PHP
In addition to creating a meeting, Zoom also provides API endpoints like list, update, delete a meeting. The user has to follow their API documentation for using a specific endpoint. As an example, you can delete a meeting by sending a DELETE request to the Zoom API endpoint. You need to pass your meeting id to the endpoint as follows.
function deleteZoomMeeting($meeting_id) {
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://api.zoom.us',
]);
$response = $client->request("DELETE", "/v2/meetings/$meeting_id", [
"headers" => [
"Authorization" => "Bearer " . getZoomAccessToken()
]
]);
if (204 == $response->getStatusCode()) {
echo "Meeting deleted.";
}
}
deleteZoomMeeting('MEETING_ID_HERE');
I hope you got to know about creating Zoom meetings with PHP and JWT. Please share your thoughts and suggestions in the comment section below.
Related Articles
- A Guide on hCaptcha Integration with PHP
- Write Data to OneDrive Sheet using Microsoft Graph API and PHP
- Speech-To-Text using Amazon Transcribe in PHP
If you liked this article, then please subscribe to our YouTube Channel for video tutorials.
in your function getZoomAccessToken should be add the algorithm you are trying to use for encoding
function getZoomAccessToken() {
$key = ZOOM_SECRET_KEY;
$payload = array(
“iss” => ZOOM_API_KEY,
‘exp’ => time() + 3600,
);
return JWT::encode($payload, $key, ‘HS256’);
}
It used firebase/php-jwt package which encodes it in the background.
Hello sir,
I tested the code and this the error i am getting please help to to solve it. thenk.
Fatal error: Uncaught ArgumentCountError: Too few arguments to function Firebase\JWT\JWT::encode(), 2 passed in C:\xampp\htdocs\zoomapi\index.php on line 15 and at least 3 expected in C:\xampp\htdocs\zoomapi\vendor\firebase\php-jwt\src\JWT.php:184 Stack trace: #0 C:\xampp\htdocs\zoomapi\index.php(15): Firebase\JWT\JWT::encode(Array, ‘API_SECRET_HERE’) #1 C:\xampp\htdocs\zoomapi\index.php(26): getZoomAccessToken() #2 C:\xampp\htdocs\zoomapi\index.php(43): createZoomMeeting() #3 {main} thrown in C:\xampp\htdocs\zoomapi\vendor\firebase\php-jwt\src\JWT.php on line 184
Did you try to print constant values in the getZoomAccessToken() method? It seems these values are empty in your case.
Hi – Thanks for this great tutorial, it has really helped me learn the process of creating a Zoom meeting.
Might you be able to expand a little on the syntax for including some “settings” values into the createZoomMeeing() function ? :-
$response = $client->request(‘POST’, ‘/v2/users/me/meetings’, [
“headers” => [
“Authorization” => “Bearer ” . getZoomAccessToken()
],
‘json’ => [
“topic” => “Let’s Learn WordPress”,
“type” => 2,
“start_time” => “2021-01-30T20:30:00”,
“duration” => “30”, // 30 mins,
“settings” => array ??
“password” => “123456”
],
]);
Please guide me how to embed zoom in my website (pure PHP)
hello
please. How to fetch other pages belonging to the list. The list has only thirty rows
I updated the code to get the next set of records.
how to update meeting using jwt?
Follow their documentation for update meetings and use them in code. They used the PATCH method along with paramteres.
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingupdate
I updated the article with the code to update the meeting.
thank you sir, can i get github link this code?
i got some error
Type: GuzzleHttp\Exception\ClientException
Message: Client error: `PATCH https://api.zoom.us/v2/meetings/MEETING_ID` resulted in a `400 Bad Request` response: {“code”:300,”message”:”Invalid meeting id.”}
Filename: /Applications/XAMPP/xamppfiles/htdocs/ykks/belajar/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
Line Number: 113
oh this problem solved thanks
Hi, thanks for the code!
I am trying to get the the recordings from the past month, but I am not able to pass the parameters.
$response = $client->request(‘GET’, ‘/v2/accounts/me/recordings’, [
‘params’ => [
‘from’ => $start,
‘to’ => $end
],
“headers” => [
“Authorization” => “Bearer “. getZoomAccessToken()
]
doesn’t work, so I only get the recording sof the last day
Can you help me out?
Hi, I am using same, meeting creating, listing created meetings, but when i am updating getting invalid access token error, same when i am deleting also, can you please suggest solution for this.
I tested the code and it works fine. I updated the article with a code to delete the Zoom meeting.