{"id":29614,"date":"2021-06-19T17:38:00","date_gmt":"2021-06-19T14:38:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29614"},"modified":"2021-10-17T16:15:16","modified_gmt":"2021-10-17T13:15:16","slug":"como-crear-reuniones-de-zoom-con-php-y-jwt","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/como-crear-reuniones-de-zoom-con-php-y-jwt\/","title":{"rendered":"C\u00f3mo crear reuniones de Zoom con PHP y JWT"},"content":{"rendered":"<p>En el pasado, escrib\u00ed un art\u00edculo que explica c\u00f3mo <a href=\"https:\/\/themewp.inform.click\/es\/como-crear-una-reunion-en-zoom-usando-zoom-api-y-php\/\" title=\"crear una reuni\u00f3n de Zoom con PHP y OAuth\" >crear una reuni\u00f3n de Zoom con PHP y OAuth<\/a>. Uno de nuestros lectores pregunt\u00f3 sobre la creaci\u00f3n de una reuni\u00f3n de Zoom utilizando JWT (JSON Web Tokens) y PHP. <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/auth\/jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> API nos permite usar tanto OAuth como JWT para lidiar con sus API. La API de Zoom requiere el token de portador generado a trav\u00e9s de OAuth o JWT.<\/p>\n<p><strong>Nota<\/strong>: JWT solo se puede utilizar para aplicaciones y procesos internos. Todas las aplicaciones creadas para uso de terceros deben utilizar el tipo de aplicaci\u00f3n OAuth.<\/p>\n<p>Cuando desee crear una aplicaci\u00f3n Zoom para uso interno, el enfoque JWT es m\u00e1s f\u00e1cil en comparaci\u00f3n con OAuth.<\/p>\n<h3>Empezando<\/h3>\n<p>Para comenzar, vaya al Panel de control del desarrollador de Zoom y cree una <a href=\"https:\/\/marketplace.zoom.us\/develop\/create\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nueva aplicaci\u00f3n<\/a>. Elija <code>JWT<\/code>como tipo de aplicaci\u00f3n y copie la clave y el secreto de la API de Zoom.<\/p>\n<p>Un solo JWT consta de tres componentes: encabezado, carga \u00fatil y firma con una <code>.<\/code>separaci\u00f3n de cada uno. Por ejemplo:<code>aaaaa.bbbbb.ccccc<\/code><\/p>\n<p>Hay varias bibliotecas disponibles que ayudan a generar JWT. Recomendar\u00e9 usar la <a href=\"https:\/\/github.com\/firebase\/php-jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">biblioteca firebase \/ php-jwt<\/a>. Esta biblioteca proporciona un enfoque mucho m\u00e1s f\u00e1cil para crear JWT. Instale esta biblioteca usando el siguiente comando.<\/p>\n<pre><code>composer require firebase\/php-jwt<\/code><\/pre>\n<p>A continuaci\u00f3n, tenemos que enviar una solicitud POST a la API de Zoom para crear una reuni\u00f3n. Se puede usar cURL para este prop\u00f3sito. Pero, personalmente, me gusta un <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> que proporciona un c\u00f3digo mucho m\u00e1s limpio que cURL. Otro beneficio de usar Guzzle es que no necesita tener la extensi\u00f3n cURL habilitada en el servidor.<\/p>\n<p>Ejecute el siguiente comando para instalar la biblioteca Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<h3>Cree reuniones de Zoom con JWT y PHP<\/h3>\n<p>Hemos instalado dos paquetes para lograr nuestro objetivo. Ahora, necesitamos incluir su entorno en nuestro archivo PHP. Adem\u00e1s, hemos copiado las claves de la API de Zoom en los pasos anteriores. Definamos estas claves como constantes en 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 continuaci\u00f3n, para generar JWT usando el <code>firebase\/php-jwt<\/code>paquete nuestro c\u00f3digo ser\u00e1 el siguiente.<\/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>Finalmente, para crear una reuni\u00f3n de Zoom, debe enviar una solicitud POST al punto final <code>\/v2\/users\/me\/meetings<\/code>con JWT como un <strong>token de 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>Lista de reuniones de Zoom<\/h3>\n<p>En su aplicaci\u00f3n, es posible que desee enumerar todas las reuniones de Zoom. Zoom proporciona una API a trav\u00e9s de la cual podemos obtener una lista de todas las reuniones de Zoom. Con el c\u00f3digo a continuaci\u00f3n, puede imprimir los detalles de sus reuniones de 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>Aqu\u00ed, estoy imprimiendo un tema y una URL de reuniones. Tambi\u00e9n puede imprimir otra informaci\u00f3n. Imprima la variable <code>$data<\/code>para obtener una lista de la informaci\u00f3n disponible.<\/p>\n<h3>Obtenga participantes anteriores de la reuni\u00f3n<\/h3>\n<p>Para las reuniones pasadas, puede obtener una lista de participantes usando la API de Zoom. Si tiene una cuenta de pago, puede utilizar esta API espec\u00edfica. Esta API requiere tener una cuenta paga. Si intenta llamar a esta API con una cuenta gratuita, obtendr\u00e1 un error.<\/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>Reemplaza el marcador de posici\u00f3n MEETING_ID con el ID de la reuni\u00f3n anterior real. En la respuesta, obtendr\u00e1 los nombres y correos electr\u00f3nicos de los participantes.<\/p>\n<h3>Eliminar Zoom Meeting con JWT y PHP<\/h3>\n<p>Al agregar para crear una reuni\u00f3n, Zoom tambi\u00e9n proporciona puntos finales de API como listar, actualizar, eliminar una reuni\u00f3n. El usuario debe seguir la documentaci\u00f3n de su API para usar un punto final espec\u00edfico. Por ejemplo, puede <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingdelete\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">eliminar una reuni\u00f3n<\/a> enviando una solicitud DELETE al punto final de la API de Zoom. Debe pasar su ID de reuni\u00f3n al punto final de la siguiente manera.<\/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 haya conocido la creaci\u00f3n de reuniones de Zoom con PHP y JWT. Comparta sus pensamientos y sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/una-guia-sobre-la-integracion-de-hcaptcha-con-php\/\" title=\"Una gu\u00eda sobre la integraci\u00f3n de hCaptcha con PHP\">Una gu\u00eda sobre la integraci\u00f3n de hCaptcha con PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/escribir-datos-en-la-hoja-de-onedrive-usando-microsoft-graph-api-y-php\/\" title=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\">Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/conversion-de-voz-a-texto-con-amazon-transcribe-en-php\/\" title=\"Conversi\u00f3n de voz a texto con Amazon Transcribe en PHP\">Conversi\u00f3n de voz a texto con Amazon Transcribe en PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQuieres crear reuniones de zoom con JWT y PHP? JWT (JSON Web Tokens) es una alternativa a OAuth para generar el token de acceso. En esto<\/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":[271],"tags":[849],"class_list":["post-29614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=29614"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29614\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/20149"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=29614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=29614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=29614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}