{"id":28784,"date":"2021-06-19T18:34:00","date_gmt":"2021-06-19T15:34:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28784"},"modified":"2021-10-18T03:58:28","modified_gmt":"2021-10-18T00:58:28","slug":"como-criar-uma-reuniao-com-zoom-usando-api-zoom-e-php","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/como-criar-uma-reuniao-com-zoom-usando-api-zoom-e-php\/","title":{"rendered":"Como criar uma reuni\u00e3o com zoom usando API Zoom e PHP"},"content":{"rendered":"<p>Recentemente, estava trabalhando em um projeto em que precisava interagir com a API Zoom. No aplicativo do cliente, implementamos muitas coisas usando a API Zoom, como contas, faturamento, reuni\u00f5es, grupos, relat\u00f3rios, salas, etc. Embora tenhamos feito muitas coisas usando a API Zoom, neste tutorial irei me concentrar em como crie uma reuni\u00e3o usando a API Zoom e PHP.<\/p>\n<p>Como todos sabemos, o <a href=\"https:\/\/zoom.us\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> \u00e9 uma plataforma que \u00e9 usada para teleconfer\u00eancia, trabalho \u00e0 dist\u00e2ncia, educa\u00e7\u00e3o a dist\u00e2ncia, etc. \u00c9 popular entre as pessoas para confer\u00eancias online, reuni\u00f5es, webinars e outras coisas.<\/p>\n<p>Aqueles que desejam criar uma reuni\u00e3o por meio da API Zoom precisam escolher OAuth ou JWT para interagir com suas APIs. OAuth e JWT (JSON web token) fornecem um alto n\u00edvel de seguran\u00e7a para fazer intera\u00e7\u00f5es com os servi\u00e7os de terceiros. Neste tutorial, usaremos o processo OAuth e nos comunicaremos com a API Zoom por meio dele.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode verificar o tutorial <a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-criar-reunioes-de-zoom-com-php-e-jwt\/\" title=\"Integra\u00e7\u00e3o do Zoom com JWT em PHP\">Integra\u00e7\u00e3o do Zoom com JWT em PHP<\/a>.<\/p>\n<h3>Crie um aplicativo OAuth no Zoom<\/h3>\n<p>Depois de ter sua conta do Zoom, voc\u00ea precisa criar um aplicativo OAuth no Zoom usando as etapas abaixo.<\/p>\n<ul>\n<li><a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/build\/oauth-app\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Registre seu aplicativo<\/a> no Zoom APP Marketplace.<\/li>\n<li>Ao registrar um aplicativo, voc\u00ea receber\u00e1 suas credenciais geradas. Aqui voc\u00ea precisa passar o URL de redirecionamento para OAuth e o URL da lista de permiss\u00f5es.<\/li>\n<li>Na pr\u00f3xima etapa, insira as informa\u00e7\u00f5es b\u00e1sicas sobre seu aplicativo.<\/li>\n<li>Na guia, voc\u00ea pode, opcionalmente, habilitar alguns recursos adicionais, como Assinaturas de eventos e Assinaturas de bate-papo para o seu aplicativo.<\/li>\n<li>Na guia &#8216;Escopos&#8217;, voc\u00ea precisa adicionar escopos relacionados ao seu aplicativo. Por exemplo, voc\u00ea pode adicionar um escopo para reuni\u00f5es do Zoom.<\/li>\n<\/ul>\n<p>Se voc\u00ea estiver no localhost, use o <a href=\"https:\/\/ngrok.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ngrok<\/a> e gere a URL local. No meu caso, URLs ngrok para redirecionamento OAuth e URL da lista branca s\u00e3o mostrados abaixo.<\/p>\n<p>Se voc\u00ea estiver enfrentando qualquer problema ao criar um aplicativo OAuth, consulte a documenta\u00e7\u00e3o oficial do Zoom em <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/build\/oauth-app\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Criar um aplicativo OAuth<\/a>.<\/p>\n<h3>Instala\u00e7\u00e3o e configura\u00e7\u00e3o b\u00e1sicas<\/h3>\n<p>N\u00e3o encontrei nenhuma biblioteca PHP que possa ser usada para interagir com a API Zoom. Fazendo pesquisas, consigo gerenci\u00e1-lo por meio da biblioteca Guzzle e da API Zoom REST. Instale a biblioteca Guzzle usando o comando:<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Para interagir com a API Zoom REST, \u00e9 necess\u00e1rio enviar um token de acesso. Vamos ger\u00e1-lo e armazen\u00e1-lo no banco de dados. O token de acesso \u00e9 v\u00e1lido por um curto per\u00edodo de tempo. Em nosso c\u00f3digo, geraremos novamente o token de acesso em segundo plano para que o usu\u00e1rio n\u00e3o precise fazer o processo de autoriza\u00e7\u00e3o novamente.<\/p>\n<pre><code>CREATE TABLE `token` (\u00a0`id` int(11) NOT NULL AUTO_INCREMENT,\n\u00a0`access_token` text NOT NULL,\n\u00a0PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<\/code><\/pre>\n<p>Como precisaremos buscar valores de token no banco de dados, precisamos escrever um c\u00f3digo para ele. Crie um arquivo <code>class-db.php<\/code>e adicione o c\u00f3digo abaixo nele.<\/p>\n<p><strong>class-db.php<\/strong><\/p>\n<pre><code>&lt;?php\nclass DB {\n\u00a0\u00a0\u00a0\u00a0private $dbHost\u00a0\u00a0\u00a0\u00a0 = \"DB_HOST\";\n\u00a0\u00a0\u00a0\u00a0private $dbUsername = \"DB_USERNAME\";\n\u00a0\u00a0\u00a0\u00a0private $dbPassword = \"DB_PASSWORD\";\n\u00a0\u00a0\u00a0\u00a0private $dbName\u00a0\u00a0\u00a0\u00a0 = \"DB_NAME\";\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function __construct(){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(!isset($this-&gt;db)){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Connect to the database\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$conn = new mysqli($this-&gt;dbHost, $this-&gt;dbUsername, $this-&gt;dbPassword, $this-&gt;dbName);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($conn-&gt;connect_error){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0die(\"Failed to connect with MySQL: \". $conn-&gt;connect_error);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}else{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db = $conn;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function is_table_empty() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $this-&gt;db-&gt;query(\"SELECT id FROM token\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($result-&gt;num_rows) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return true;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function get_access_token() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$sql = $this-&gt;db-&gt;query(\"SELECT access_token FROM token\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $sql-&gt;fetch_assoc();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return json_decode($result['access_token']);\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function get_refersh_token() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $this-&gt;get_access_token();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return $result-&gt;refresh_token;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function update_access_token($token) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($this-&gt;is_table_empty()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db-&gt;query(\"INSERT INTO token(access_token) VALUES('$token')\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db-&gt;query(\"UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Certifique-se de substituir os espa\u00e7os reservados por suas credenciais de banco de dados reais. A seguir, vamos gerar um token de acesso por meio do processo OAuth.<\/p>\n<h3>Gerar um token de acesso<\/h3>\n<p>O usu\u00e1rio pode criar um token de acesso para sua conta usando as credenciais do aplicativo e o processo OAuth. Crie um <code>config.php<\/code>arquivo, armazene as credenciais do aplicativo e redirecione a URL neste arquivo PHP. Inclua os outros ambientes, como classe de banco de dados e biblioteca de fornecedores, tamb\u00e9m da seguinte maneira.<\/p>\n<p><strong>config.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'vendor\/autoload.php';\nrequire_once \"class-db.php\";\n\u00a0\u00a0\ndefine('CLIENT_ID', 'YOUR_CLIENT_ID');\ndefine('CLIENT_SECRET', 'YOUR_CLIENT_SECRET');\ndefine('REDIRECT_URI', 'REDIRECT_URL_FOR_OAUTH');<\/code><\/pre>\n<p>Substitua os marcadores pelas credenciais do seu aplicativo e defina o mesmo URL de redirecionamento que voc\u00ea adicionou no aplicativo Zoom OAuth. No meu caso, o URL de redirecionamento \u00e9 <code>https:\/\/f2448150.ngrok.io\/zoom\/callback.php<\/code>. Isso significa que no <code>callback.php<\/code>arquivo, temos que escrever o c\u00f3digo que chama uma API Zoom, solicitar um token de acesso e armazen\u00e1-lo no banco de dados.<\/p>\n<p><strong>callback.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/zoom.us']);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/oauth\/token', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Basic \". base64_encode(CLIENT_ID.':'.CLIENT_SECRET)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"grant_type\" =&gt; \"authorization_code\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"code\" =&gt; $_GET['code'],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"redirect_uri\" =&gt; REDIRECT_URI\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0$token = json_decode($response-&gt;getBody()-&gt;getContents(), true);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0$db = new DB();\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0if($db-&gt;is_table_empty()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$db-&gt;update_access_token(json_encode($token));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Access token inserted successfully.\";\n\u00a0\u00a0\u00a0\u00a0}\n} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n}<\/code><\/pre>\n<p>Agora, vamos gerar um URL autorizado onde um usu\u00e1rio pode clicar e concluir o processo de autoriza\u00e7\u00e3o. Vou criar esta URL no <code>index.php<\/code>arquivo.<\/p>\n<p><strong>index.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\n$url = \"https:\/\/zoom.us\/oauth\/authorize?response_type=code&amp;client_id=\".CLIENT_ID.\"&amp;redirect_uri=\".REDIRECT_URI;\n?&gt;\n\u00a0\u00a0\n&lt;a href=\"&lt;?php echo $url; ?&gt;\"&gt;Login with Zoom&lt;\/a&gt;<\/code><\/pre>\n<p>Execute o arquivo acima no navegador, clique no link &#8216;Login com Zoom&#8217; e conclua o processo de autoriza\u00e7\u00e3o. Na autentica\u00e7\u00e3o bem-sucedida, voc\u00ea ver\u00e1 uma mensagem de sucesso e o token de acesso ser\u00e1 armazenado em sua <code>token<\/code>tabela. Se funcionar, podemos prosseguir e criar uma reuni\u00e3o com a API Zoom.<\/p>\n<h3>Criar uma reuni\u00e3o com zoom usando API de zoom<\/h3>\n<p>O Zoom est\u00e1 fornecendo um ponto de extremidade para a cria\u00e7\u00e3o de uma reuni\u00e3o por meio de sua API REST. Voc\u00ea pode ler sobre isso em sua <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingcreate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o<\/a>. Requer o envio de uma solicita\u00e7\u00e3o POST para o endpoint fornecido junto com os par\u00e2metros necess\u00e1rios.<\/p>\n<p>O ponto de extremidade da API tamb\u00e9m requer que um token de acesso seja passado no cabe\u00e7alho de autoriza\u00e7\u00e3o. Como eu disse antes, o token de acesso tem uma vida curta e vamos regener\u00e1-lo em segundo plano sem solicitar o processo de autentica\u00e7\u00e3o novamente.<\/p>\n<p>Criei um <code>create-meeting.php<\/code>arquivo para enviar uma solicita\u00e7\u00e3o POST ao terminal. Tamb\u00e9m lidei com a condi\u00e7\u00e3o de expira\u00e7\u00e3o do token e regenerando-o se expirado.<\/p>\n<p><strong>create-meeting.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\nfunction create_meeting() {\n\u00a0\u00a0\u00a0\u00a0$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0$db = new DB();\n\u00a0\u00a0\u00a0\u00a0$arr_token = $db-&gt;get_access_token();\n\u00a0\u00a0\u00a0\u00a0$accessToken = $arr_token-&gt;access_token;\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/v2\/users\/me\/meetings', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer $accessToken\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"topic\" =&gt; \"Let's learn Laravel\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\" =&gt; 2,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"start_time\" =&gt; \"2021-03-05T20:30:00\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"duration\" =&gt; \"30\", \/\/ 30 mins\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"password\" =&gt; \"123456\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$data = json_decode($response-&gt;getBody());\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Join URL: \". $data-&gt;join_url;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"&lt;br&gt;\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Meeting Password: \". $data-&gt;password;\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if( 401 == $e-&gt;getCode()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$refresh_token = $db-&gt;get_refersh_token();\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/zoom.us']);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/oauth\/token', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Basic \". base64_encode(CLIENT_ID.':'.CLIENT_SECRET)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"grant_type\" =&gt; \"refresh_token\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"refresh_token\" =&gt; $refresh_token\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$db-&gt;update_access_token($response-&gt;getBody());\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0create_meeting();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n\u00a0\u00a0\ncreate_meeting();<\/code><\/pre>\n<p>Se voc\u00ea notou o c\u00f3digo, eu passei &#8220;2021-03-20T20: 30: 00&quot; como um &#8216;start_time&#8217;. Isso significa que o hor\u00e1rio da reuni\u00e3o ser\u00e1 20 de mar\u00e7o de 2021, 20:30. O usu\u00e1rio deve passar o formato para ele em aaaa-MM-ddTHH: mm: ss. Para a chave &#8216;type&#8217;, passei o valor &#8216;2&#8217;, que \u00e9 para uma reuni\u00e3o agendada. O usu\u00e1rio tamb\u00e9m precisa definir uma senha de reuni\u00e3o, que eu defini como &#8216;123456&#8217;.<\/p>\n<p>V\u00e1 em frente e execute este c\u00f3digo e voc\u00ea ver\u00e1 que uma reuni\u00e3o foi criada em sua conta do Zoom.<\/p>\n<h3>Listar reuni\u00f5es de zoom<\/h3>\n<p>Escrevemos um c\u00f3digo para a cria\u00e7\u00e3o de reuni\u00f5es Zoom. Usando este c\u00f3digo, voc\u00ea pode criar quantas reuni\u00f5es quiser. Depois disso, voc\u00ea pode desejar listar todas as reuni\u00f5es em seu aplicativo.<\/p>\n<p>O Zoom fornece uma API por meio da qual podemos buscar todas as nossas reuni\u00f5es Zoom. Crie um arquivo <code>list-meeting.php<\/code>e use o c\u00f3digo abaixo que imprimir\u00e1 todas as reuni\u00f5es.<\/p>\n<p><strong>list-meeting.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\n$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\u00a0\u00a0\n$db = new DB();\n$arr_token = $db-&gt;get_access_token();\n$accessToken = $arr_token-&gt;access_token;\n\u00a0\u00a0\n$response = $client-&gt;request('GET', '\/v2\/users\/me\/meetings', [\n\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer $accessToken\"\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\n$data = json_decode($response-&gt;getBody());\n\u00a0\nif (!empty($data)) {\n\u00a0\u00a0\u00a0\u00a0foreach ($data-&gt;meetings as $d) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$topic = $d-&gt;topic;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$join_url = $d-&gt;join_url;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"&lt;h3&gt;Topic: $topic&lt;\/h3&gt;\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Join URL: $join_url\";\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>No c\u00f3digo acima, estou imprimindo um t\u00f3pico e URL de reuni\u00f5es. Voc\u00ea tamb\u00e9m pode imprimir outras informa\u00e7\u00f5es. Imprima a vari\u00e1vel <code>$data<\/code>para obter uma lista de informa\u00e7\u00f5es dispon\u00edveis.<\/p>\n<h3>Obtenha participantes de reuni\u00f5es anteriores<\/h3>\n<p>Assim que a reuni\u00e3o terminar, voc\u00ea pode obter uma lista de participantes usando a API Zoom. Recomenda-se chamar esta API apenas se voc\u00ea estiver em uma conta paga. Esta API espec\u00edfica requer uma conta paga. Se voc\u00ea tentar chamar essa API com uma conta gratuita, receber\u00e1 um erro.<\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\u00a0\n$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\u00a0\u00a0\u00a0\n$db = new DB();\n$arr_token = $db-&gt;get_access_token();\n$accessToken = $arr_token-&gt;access_token;\n\u00a0\u00a0\u00a0\n$response = $client-&gt;request('GET', '\/v2\/past_meetings\/MEETING_ID\/participants', [\n\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer $accessToken\"\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\u00a0\n$data = json_decode($response-&gt;getBody());\nif (!empty($data)) {\n\u00a0\u00a0\u00a0\u00a0foreach ($data-&gt;participants as $p) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$name = $p-&gt;name;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$email = $p-&gt;user_email;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Name: $name\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Email: $email\";\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Substitua o marcador MEETING_ID pelo ID da reuni\u00e3o anterior real. Na resposta, voc\u00ea receber\u00e1 os nomes e emails dos participantes.<\/p>\n<h3>Excluir uma reuni\u00e3o<\/h3>\n<p>O usu\u00e1rio pode brincar com os endpoints da API Zoom, como listar, atualizar, excluir uma reuni\u00e3o. Tudo o que voc\u00ea precisa fazer \u00e9 seguir suas diretrizes sobre o uso de terminais espec\u00edficos. Por exemplo, voc\u00ea pode excluir uma reuni\u00e3o enviando uma solicita\u00e7\u00e3o DELETE para o endpoint da API. Para este endpoint, voc\u00ea precisa passar sua id de reuni\u00e3o conforme mostrado abaixo.<\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\n$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\u00a0\u00a0\n$db = new DB();\n$arr_token = $db-&gt;get_access_token();\n$accessToken = $arr_token-&gt;access_token;\n\u00a0\u00a0\n$response = $client-&gt;request('DELETE', '\/v2\/meetings\/{meeting_id}', [\n\u00a0\u00a0\u00a0\u00a0\"headers\" =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer $accessToken\"\n\u00a0\u00a0\u00a0\u00a0]\n]);\n\u00a0\nif (204 == $response-&gt;getStatusCode()) {\n\u00a0\u00a0\u00a0\u00a0echo \"Meeting is deleted.\";\n}<\/code><\/pre>\n<p>Espero que voc\u00ea saiba como criar uma reuni\u00e3o usando a API Zoom e PHP. Eu gostaria de ouvir seus pensamentos e sugest\u00f5es na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/p>\n<h4>Artigos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-usar-a-api-do-youtube-para-enviar-video-ao-canal-do-youtube\/\" title=\"Como usar a API do YouTube para carregar v\u00eddeos no canal do YouTube\">Como usar a API do YouTube para carregar v\u00eddeos no canal do YouTube<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-usar-o-guzzle-um-cliente-php-http-para-enviar-solicitacoes-http\/\" title=\"Como usar o Guzzle para enviar solicita\u00e7\u00f5es HTTP\">Como usar o Guzzle para enviar solicita\u00e7\u00f5es HTTP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/grave-dados-na-planilha-do-onedrive-usando-microsoft-graph-api-e-php\/\" title=\"Grave dados na planilha do OneDrive usando Microsoft Graph API e PHP\">Grave dados na planilha do OneDrive usando Microsoft Graph API e PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea est\u00e1 planejando criar uma reuni\u00e3o no Zoom usando a API do Zoom e PHP? Neste artigo, explicarei como interagir com a API Zoom e gerar<\/p>\n","protected":false},"author":1,"featured_media":20151,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[278],"tags":[848],"class_list":["post-28784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-9","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/comments?post=28784"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28784\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/20151"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=28784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=28784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=28784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}