{"id":28797,"date":"2021-06-19T16:48:00","date_gmt":"2021-06-19T13:48:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28797"},"modified":"2021-10-18T03:58:32","modified_gmt":"2021-10-18T00:58:32","slug":"como-criar-reunioes-de-zoom-com-php-e-jwt","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/como-criar-reunioes-de-zoom-com-php-e-jwt\/","title":{"rendered":"Como criar reuni\u00f5es de zoom com PHP e JWT"},"content":{"rendered":"<p>No passado, escrevi um artigo que explica a <a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-criar-uma-reuniao-com-zoom-usando-api-zoom-e-php\/\" title=\"cria\u00e7\u00e3o de um Zoom Meeting com PHP e OAuth\" >cria\u00e7\u00e3o de um Zoom Meeting com PHP e OAuth<\/a>. Um de nossos leitores perguntou sobre a cria\u00e7\u00e3o de uma reuni\u00e3o Zoom usando JWT (JSON Web Tokens) e PHP. <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/auth\/jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A<\/a> API <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/auth\/jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> nos permite usar OAuth ou JWT para lidar com suas APIs. A API Zoom requer o Bearer Token gerado por OAuth ou JWT.<\/p>\n<p><strong>Observa\u00e7\u00e3o<\/strong>: o JWT s\u00f3 pode ser usado para aplicativos e processos internos. Todos os aplicativos criados para uso de terceiros devem usar o tipo de aplicativo OAuth.<\/p>\n<p>Quando voc\u00ea deseja construir um aplicativo Zoom para uso interno, a abordagem JWT \u00e9 mais f\u00e1cil em compara\u00e7\u00e3o com o OAuth.<\/p>\n<h3>Come\u00e7ando<\/h3>\n<p>Para come\u00e7ar, v\u00e1 para o Painel de controle do desenvolvedor do Zoom e crie um <a href=\"https:\/\/marketplace.zoom.us\/develop\/create\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">novo aplicativo<\/a>. Escolha <code>JWT<\/code>como o tipo de aplicativo e copie a chave e o segredo da API Zoom.<\/p>\n<p>Um \u00fanico JWT consiste em tr\u00eas componentes: Cabe\u00e7alho, Carga \u00fatil e Assinatura com uma <code>.<\/code>separa\u00e7\u00e3o de cada um. Por exemplo:<code>aaaaa.bbbbb.ccccc<\/code><\/p>\n<p>V\u00e1rias bibliotecas est\u00e3o dispon\u00edveis que ajudam a gerar JWT. Recomendarei o uso da biblioteca <a href=\"https:\/\/github.com\/firebase\/php-jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">firebase \/ php-jwt<\/a>. Esta biblioteca fornece uma abordagem muito mais f\u00e1cil para criar JWT. Instale esta biblioteca usando o comando abaixo.<\/p>\n<pre><code>composer require firebase\/php-jwt<\/code><\/pre>\n<p>Em seguida, temos que enviar uma solicita\u00e7\u00e3o POST para a API Zoom para criar uma reuni\u00e3o. Pode-se usar o cURL para essa finalidade. Mas, eu pessoalmente gosto de um <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> que fornece um c\u00f3digo muito mais limpo do que o cURL. Outro benef\u00edcio de usar o Guzzle \u00e9 que voc\u00ea n\u00e3o precisa ter a extens\u00e3o cURL habilitada no servidor.<\/p>\n<p>Execute o comando abaixo para instalar a biblioteca Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<h3>Crie reuni\u00f5es do Zoom com JWT e PHP<\/h3>\n<p>Instalamos dois pacotes para atingir nosso objetivo. Agora, precisamos incluir seu ambiente em nosso arquivo PHP. Al\u00e9m disso, copiamos as chaves da API do Zoom nas etapas anteriores. Vamos definir essas chaves como constantes em PHP.<\/p>\n<pre><code>&lt;?php\nrequire_once 'vendor\/autoload.php';\n\u00a0\nuse FirebaseJWTJWT;\nuse GuzzleHttpClient;\n\u00a0\ndefine('ZOOM_API_KEY', 'API_KEY_HERE');\ndefine('ZOOM_SECRET_KEY', 'API_SECRET_HERE');<\/code><\/pre>\n<p>A seguir, para gerar JWT usando o <code>firebase\/php-jwt<\/code>pacote nosso c\u00f3digo ser\u00e1 o seguinte.<\/p>\n<pre><code>function getZoomAccessToken() {\n\u00a0\u00a0\u00a0\u00a0$key = ZOOM_SECRET_KEY;\n\u00a0\u00a0\u00a0\u00a0$payload = array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iss\" =&gt; ZOOM_API_KEY,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'exp' =&gt; time() + 3600,\n\u00a0\u00a0\u00a0\u00a0);\n\u00a0\u00a0\u00a0\u00a0return JWT::encode($payload, $key);\u00a0\u00a0\u00a0 \n}<\/code><\/pre>\n<p>Por fim, para criar uma reuni\u00e3o Zoom, \u00e9 necess\u00e1rio enviar uma solicita\u00e7\u00e3o POST ao terminal <code>\/v2\/users\/me\/meetings<\/code>com JWT como um <strong>token do portador<\/strong>.<\/p>\n<pre><code>function createZoomMeeting() {\n\u00a0\u00a0\u00a0\u00a0$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/api.zoom.us',\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/v2\/users\/me\/meetings', [\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; \"Bearer \". getZoomAccessToken()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"topic\" =&gt; \"Let's Learn WordPress\",\n\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\"start_time\" =&gt; \"2021-01-30T20:30:00\",\n\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\"password\" =&gt; \"123456\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$data = json_decode($response-&gt;getBody());\n\u00a0\u00a0\u00a0\u00a0echo \"Join URL: \". $data-&gt;join_url;\n\u00a0\u00a0\u00a0\u00a0echo \"&lt;br&gt;\";\n\u00a0\u00a0\u00a0\u00a0echo \"Meeting Password: \". $data-&gt;password;\n}\n\u00a0\ncreateZoomMeeting();<\/code><\/pre>\n<h3>Listar reuni\u00f5es de zoom<\/h3>\n<p>Em seu aplicativo, voc\u00ea pode desejar listar todas as reuni\u00f5es do Zoom. O Zoom fornece uma API por meio da qual podemos obter uma lista de todas as reuni\u00f5es do Zoom. Usando o c\u00f3digo abaixo, voc\u00ea pode imprimir os detalhes de suas reuni\u00f5es do Zoom.<\/p>\n<pre><code>$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\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 \". getZoomAccessToken()\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>Aqui, 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>Para as reuni\u00f5es anteriores, voc\u00ea pode obter uma lista de participantes usando a API Zoom. Se voc\u00ea estiver em uma conta paga, poder\u00e1 usar esta API espec\u00edfica. Esta API requer uma conta paga. Se voc\u00ea tentar chamar essa API com uma conta gratuita, receber\u00e1 um erro.<\/p>\n<pre><code>$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/api.zoom.us']);\n\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 \". getZoomAccessToken()\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 reuni\u00e3o do Zoom com JWT e PHP<\/h3>\n<p>Al\u00e9m de criar uma reuni\u00e3o, o Zoom tamb\u00e9m fornece terminais de API como listar, atualizar e excluir uma reuni\u00e3o. O usu\u00e1rio deve seguir a documenta\u00e7\u00e3o da API para usar um endpoint espec\u00edfico. Como exemplo, voc\u00ea pode <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingdelete\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">excluir uma reuni\u00e3o<\/a> enviando uma solicita\u00e7\u00e3o DELETE para o endpoint da API Zoom. Voc\u00ea precisa passar sua ID de reuni\u00e3o para o terminal da seguinte maneira.<\/p>\n<pre><code>function deleteZoomMeeting($meeting_id) {\n\u00a0\u00a0\u00a0\u00a0$client = new Client([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/api.zoom.us',\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request(\"DELETE\", \"\/v2\/meetings\/$meeting_id\", [\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; \"Bearer \". getZoomAccessToken()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0if (204 == $response-&gt;getStatusCode()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Meeting deleted.\";\n\u00a0\u00a0\u00a0\u00a0}\n}\n\u00a0\ndeleteZoomMeeting('MEETING_ID_HERE');<\/code><\/pre>\n<p>Espero que voc\u00ea saiba como criar reuni\u00f5es Zoom com PHP e JWT. Por favor, compartilhe 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\/um-guia-de-integracao-do-hcaptcha-com-php\/\" title=\"Um guia de integra\u00e7\u00e3o do hCaptcha com PHP\">Um guia de integra\u00e7\u00e3o do hCaptcha com PHP<\/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<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/speech-to-text-usando-amazon-transcribe-em-php\/\" title=\"Speech-To-Text usando Amazon Transcribe em PHP\">Speech-To-Text usando Amazon Transcribe em 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 deseja criar reuni\u00f5es de zoom com JWT e PHP? JWT (JSON Web Tokens) \u00e9 uma alternativa ao OAuth para gerar o token de acesso. Nisso<\/p>\n","protected":false},"author":1,"featured_media":20149,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[278],"tags":[848],"class_list":["post-28797","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\/28797","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=28797"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28797\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/20149"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=28797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=28797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=28797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}