{"id":29642,"date":"2021-06-19T17:37:00","date_gmt":"2021-06-19T14:37:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29642"},"modified":"2021-10-18T03:31:10","modified_gmt":"2021-10-18T00:31:10","slug":"jak-tworzyc-spotkania-zoom-za-pomoca-php-i-jwt","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/jak-tworzyc-spotkania-zoom-za-pomoca-php-i-jwt\/","title":{"rendered":"Jak tworzy\u0107 spotkania Zoom za pomoc\u0105 PHP i JWT"},"content":{"rendered":"<p>W przesz\u0142o\u015bci pisa\u0142em artyku\u0142 wyja\u015bniaj\u0105cy <a href=\"https:\/\/themewp.inform.click\/pl\/jak-utworzyc-spotkanie-na-zoom-za-pomoca-zoom-api-i-php\/\" title=\"tworzenie Zoom Meeting z PHP i OAuth\" >tworzenie Zoom Meeting z PHP i OAuth<\/a>. Jeden z naszych czytelnik\u00f3w zapyta\u0142 o stworzenie spotkania Zoom przy u\u017cyciu JWT (JSON Web Tokens) i PHP. <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/auth\/jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> API pozwala nam u\u017cywa\u0107 zar\u00f3wno OAuth, jak i JWT do obs\u0142ugi ich API. Zoom API wymaga tokena okaziciela wygenerowanego przez OAuth lub JWT.<\/p>\n<p><strong>Uwaga<\/strong>: token\u00f3w JWT mo\u017cna u\u017cywa\u0107 wy\u0142\u0105cznie w aplikacjach i procesach wewn\u0119trznych. Wszystkie aplikacje utworzone do u\u017cytku przez inne firmy musz\u0105 u\u017cywa\u0107 aplikacji typu OAuth.<\/p>\n<p>Je\u015bli chcesz zbudowa\u0107 aplikacj\u0119 Zoom do u\u017cytku wewn\u0119trznego, podej\u015bcie JWT jest \u0142atwiejsze w por\u00f3wnaniu z OAuth.<\/p>\n<h3>Pierwsze kroki<\/h3>\n<p>Aby rozpocz\u0105\u0107, przejd\u017a do pulpitu programisty Zoom i utw\u00f3rz <a href=\"https:\/\/marketplace.zoom.us\/develop\/create\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">now\u0105 aplikacj\u0119<\/a>. Wybierz <code>JWT<\/code>jako typ aplikacji i skopiuj klucz i klucz tajny Zoom API.<\/p>\n<p>Pojedynczy token JWT sk\u0142ada si\u0119 z trzech komponent\u00f3w: nag\u0142\u00f3wka, \u0142adunku i podpisu, z <code>.<\/code>kt\u00f3rych ka\u017cdy jest oddzielony. Na przyk\u0142ad:<code>aaaaa.bbbbb.ccccc<\/code><\/p>\n<p>Dost\u0119pnych jest kilka bibliotek, kt\u00f3re pomagaj\u0105 w generowaniu token\u00f3w JWT. Polecam korzystanie z biblioteki <a href=\"https:\/\/github.com\/firebase\/php-jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">firebase\/php-jwt<\/a>. Ta biblioteka zapewnia znacznie prostsze podej\u015bcie do tworzenia token\u00f3w JWT. Zainstaluj t\u0119 bibliotek\u0119 za pomoc\u0105 poni\u017cszego polecenia.<\/p>\n<pre><code>composer require firebase\/php-jwt<\/code><\/pre>\n<p>Nast\u0119pnie musimy wys\u0142a\u0107 \u017c\u0105danie POST do Zoom API, aby utworzy\u0107 spotkanie. W tym celu mo\u017cna u\u017cy\u0107 cURL. Ale osobi\u015bcie lubi\u0119 <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle,<\/a> kt\u00f3ry zapewnia znacznie czystszy kod ni\u017c cURL. Kolejn\u0105 zalet\u0105 korzystania z Guzzle jest to, \u017ce nie musisz mie\u0107 w\u0142\u0105czonego rozszerzenia cURL na serwerze.<\/p>\n<p>Uruchom poni\u017csze polecenie, aby zainstalowa\u0107 bibliotek\u0119 Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<h3>Tw\u00f3rz spotkania Zoom za pomoc\u0105 JWT i PHP<\/h3>\n<p>Zainstalowali\u015bmy dwa pakiety, aby osi\u0105gn\u0105\u0107 nasz cel. Teraz musimy do\u0142\u0105czy\u0107 jego \u015brodowisko do naszego pliku PHP. Ponadto w poprzednich krokach skopiowali\u015bmy klucze Zoom API. Zdefiniujmy te klucze jako sta\u0142e w 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>Nast\u0119pnie, aby wygenerowa\u0107 JWT za pomoc\u0105 <code>firebase\/php-jwt<\/code>pakietu, nasz kod b\u0119dzie wygl\u0105da\u0142 nast\u0119puj\u0105co.<\/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>Na koniec, aby utworzy\u0107 spotkanie Zoom, musi wys\u0142a\u0107 \u017c\u0105danie POST do punktu ko\u0144cowego <code>\/v2\/users\/me\/meetings<\/code>z JWT jako <strong>Bearer Token<\/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 spotka\u0144 Zoom<\/h3>\n<p>W swojej aplikacji mo\u017cesz chcie\u0107 wy\u015bwietli\u0107 list\u0119 wszystkich spotka\u0144 Zoom. Zoom udost\u0119pnia API, przez kt\u00f3re mo\u017cemy uzyska\u0107 list\u0119 wszystkich spotka\u0144 Zoom. Korzystaj\u0105c z poni\u017cszego kodu, mo\u017cesz wydrukowa\u0107 szczeg\u00f3\u0142y swoich spotka\u0144 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>Tutaj drukuj\u0119 temat i URL spotka\u0144. Mo\u017cesz r\u00f3wnie\u017c wydrukowa\u0107 inne informacje. Wydrukuj zmienn\u0105, <code>$data<\/code>aby uzyska\u0107 list\u0119 dost\u0119pnych informacji.<\/p>\n<h3>Uzyskaj poprzednich uczestnik\u00f3w spotkania<\/h3>\n<p>W przypadku poprzednich spotka\u0144 mo\u017cesz uzyska\u0107 list\u0119 uczestnik\u00f3w za pomoc\u0105 Zoom API. Je\u015bli korzystasz z p\u0142atnego konta, mo\u017cesz u\u017cy\u0107 tego konkretnego interfejsu API. Ten interfejs API wymaga posiadania p\u0142atnego konta. Je\u015bli spr\u00f3bujesz wywo\u0142a\u0107 ten interfejs API za pomoc\u0105 bezp\u0142atnego konta, otrzymasz b\u0142\u0105d.<\/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>Zast\u0105p symbol zast\u0119pczy MEETING_ID rzeczywistym identyfikatorem poprzedniego spotkania. W odpowiedzi otrzymasz nazwiska i e-maile uczestnik\u00f3w.<\/p>\n<h3>Usu\u0144 Zoom Meeting za pomoc\u0105 JWT i PHP<\/h3>\n<p>Dodaj\u0105c, aby utworzy\u0107 spotkanie, Zoom zapewnia r\u00f3wnie\u017c punkty ko\u0144cowe API, takie jak lista, aktualizacja, usuni\u0119cie spotkania. U\u017cytkownik musi post\u0119powa\u0107 zgodnie z dokumentacj\u0105 API, aby korzysta\u0107 z okre\u015blonego punktu ko\u0144cowego. Na przyk\u0142ad mo\u017cesz <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingdelete\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usun\u0105\u0107 spotkanie<\/a>, wysy\u0142aj\u0105c \u017c\u0105danie DELETE do punktu ko\u0144cowego Zoom API. Musisz przekaza\u0107 sw\u00f3j identyfikator spotkania do punktu ko\u0144cowego w nast\u0119puj\u0105cy spos\u00f3b.<\/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>Mam nadziej\u0119, \u017ce dowiedzia\u0142e\u015b si\u0119 o tworzeniu spotka\u0144 Zoom z PHP i JWT. Podziel si\u0119 swoimi przemy\u015bleniami i sugestiami w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/przewodnik-po-integracji-hcaptcha-z-php\/\" title=\"Przewodnik po integracji hCaptcha z PHP\">Przewodnik po integracji hCaptcha z PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/zapisuj-dane-do-arkusza-onedrive-za-pomoca-microsoft-graph-api-i-php\/\" title=\"Zapisuj dane do arkusza OneDrive za pomoc\u0105 Microsoft Graph API i PHP\">Zapisuj dane do arkusza OneDrive za pomoc\u0105 Microsoft Graph API i PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/zamiana-mowy-na-tekst-przy-uzyciu-transkrypcji-amazon-w-php\/\" title=\"Zamiana mowy na tekst przy u\u017cyciu transkrypcji Amazon w PHP\">Zamiana mowy na tekst przy u\u017cyciu transkrypcji Amazon w PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Chcesz tworzy\u0107 spotkania z zoomem za pomoc\u0105 JWT i PHP? JWT(JSON Web Tokens) jest alternatyw\u0105 dla OAuth do generowania tokenu dost\u0119pu. W tym<\/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":[277],"tags":[847],"class_list":["post-29642","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-8","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/comments?post=29642"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29642\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/20149"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=29642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=29642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=29642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}