{"id":29632,"date":"2021-06-19T17:46:00","date_gmt":"2021-06-19T14:46:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29632"},"modified":"2021-10-18T03:31:06","modified_gmt":"2021-10-18T00:31:06","slug":"jak-utworzyc-spotkanie-na-zoom-za-pomoca-zoom-api-i-php","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/jak-utworzyc-spotkanie-na-zoom-za-pomoca-zoom-api-i-php\/","title":{"rendered":"Jak utworzy\u0107 spotkanie na Zoom za pomoc\u0105 Zoom API i PHP"},"content":{"rendered":"<p>Ostatnio pracowa\u0142em nad projektem, w kt\u00f3rym potrzebowa\u0142em interakcji z Zoom API. W aplikacji klienta zaimplementowali\u015bmy wiele rzeczy przy u\u017cyciu Zoom API, takich jak Konta, Rozliczenia, Spotkania, Grupy, Raporty, Pokoje itp. Chocia\u017c zrobili\u015bmy wiele rzeczy przy u\u017cyciu Zoom API, w tym samouczku skupi\u0119 si\u0119 na tym, jak utw\u00f3rz spotkanie za pomoc\u0105 Zoom API i PHP.<\/p>\n<p>Jak wszyscy wiemy, <a href=\"https:\/\/zoom.us\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> to platforma, kt\u00f3ra s\u0142u\u017cy do telekonferencji, telepracy, edukacji na odleg\u0142o\u015b\u0107 itp. Jest popularna w\u015br\u00f3d os\u00f3b na konferencjach online, spotkaniach, webinariach i innych rzeczach.<\/p>\n<p>Ci, kt\u00f3rzy chc\u0105 utworzy\u0107 spotkanie za pomoc\u0105 Zoom API, musz\u0105 wybra\u0107 OAuth lub JWT do interakcji z ich interfejsami API. OAuth i JWT (token sieciowy JSON) zapewniaj\u0105 wysoki poziom bezpiecze\u0144stwa do interakcji z us\u0142ugami innych firm. W tym samouczku u\u017cyjemy procesu OAuth i za jego po\u015brednictwem b\u0119dziemy komunikowa\u0107 si\u0119 z Zoom API.<\/p>\n<p>Mo\u017cesz r\u00f3wnie\u017c sprawdzi\u0107 samouczek <a href=\"https:\/\/themewp.inform.click\/pl\/jak-tworzyc-spotkania-zoom-za-pomoca-php-i-jwt\/\" title=\"Integracja Zoom z JWT w PHP\">Integracja Zoom z JWT w PHP<\/a>.<\/p>\n<h3>Utw\u00f3rz aplikacj\u0119 OAuth w Zoom<\/h3>\n<p>Po uzyskaniu konta Zoom musisz utworzy\u0107 aplikacj\u0119 OAuth w Zoom, wykonuj\u0105c poni\u017csze czynno\u015bci.<\/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\">Zarejestruj swoj\u0105 aplikacj\u0119<\/a> na Zoom APP Marketplace.<\/li>\n<li>Po zarejestrowaniu aplikacji otrzymasz wygenerowane dane uwierzytelniaj\u0105ce. Tutaj musisz poda\u0107 adres URL przekierowania dla OAuth i URL bia\u0142ej listy.<\/li>\n<li>W nast\u0119pnym kroku wprowad\u017a podstawowe informacje o swojej aplikacji.<\/li>\n<li>Na karcie mo\u017cesz opcjonalnie w\u0142\u0105czy\u0107 dla swojej aplikacji kilka dodatkowych funkcji, takich jak subskrypcje wydarze\u0144 i subskrypcje czatu.<\/li>\n<li>Na karcie \u201eZakresy&quot; musisz doda\u0107 zakresy dotycz\u0105ce Twojej aplikacji. Na przyk\u0142ad mo\u017cesz doda\u0107 zakres spotka\u0144 Zoom.<\/li>\n<\/ul>\n<p>Je\u015bli jeste\u015b na localhost, u\u017cyj <a href=\"https:\/\/ngrok.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ngrok<\/a> i wygeneruj lokalny adres URL. W moim przypadku adresy URL ngrok dla przekierowania OAuth i URL bia\u0142ej listy s\u0105 pokazane poni\u017cej.<\/p>\n<p>Je\u015bli masz problem z tworzeniem aplikacji OAuth, zapoznaj si\u0119 z oficjaln\u0105 dokumentacj\u0105 Zoom dotycz\u0105c\u0105 <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/build\/oauth-app\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tworzenia aplikacji OAuth<\/a>.<\/p>\n<h3>Podstawowa konfiguracja i konfiguracja<\/h3>\n<p>Nie znalaz\u0142em \u017cadnej biblioteki PHP, kt\u00f3ra mog\u0142aby by\u0107 u\u017cyta do interakcji z Zoom API. Prowadz\u0105c troch\u0119 bada\u0144, jestem w stanie zarz\u0105dza\u0107 nim poprzez bibliotek\u0119 Guzzle i Zoom REST API. Zainstaluj bibliotek\u0119 Guzzle za pomoc\u0105 polecenia:<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>Interakcja z Zoom REST API wymaga wys\u0142ania tokena dost\u0119pu. Wygenerujemy go i zapiszemy w bazie danych. Token dost\u0119pu jest wa\u017cny przez kr\u00f3tki czas. W naszym kodzie zregenerujemy token dost\u0119pu w tle, aby u\u017cytkownik nie musia\u0142 ponownie wykonywa\u0107 procesu autoryzacji.<\/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>Poniewa\u017c b\u0119dziemy musieli pobra\u0107 warto\u015bci token\u00f3w z bazy danych, musimy napisa\u0107 dla nich kod. Utw\u00f3rz plik <code>class-db.php<\/code>i dodaj do niego poni\u017cszy kod.<\/p>\n<p><strong>klasa-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>Pami\u0119taj, aby zast\u0105pi\u0107 symbole zast\u0119pcze rzeczywistymi po\u015bwiadczeniami bazy danych. Nast\u0119pnie wygenerujmy token dost\u0119pu za po\u015brednictwem procesu OAuth.<\/p>\n<h3>Wygeneruj token dost\u0119pu<\/h3>\n<p>U\u017cytkownik mo\u017ce utworzy\u0107 token dost\u0119pu dla swojego konta przy u\u017cyciu po\u015bwiadcze\u0144 aplikacji i procesu OAuth. Utw\u00f3rz <code>config.php<\/code>plik, przechowuj po\u015bwiadczenia aplikacji i adres URL przekierowania w tym pliku PHP. Uwzgl\u0119dnij inne \u015brodowiska, takie jak klasa DB i biblioteka dostawcy, r\u00f3wnie\u017c w nast\u0119puj\u0105cy spos\u00f3b.<\/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>Zast\u0105p symbole zast\u0119pcze danymi logowania do aplikacji i ustaw ten sam adres URL przekierowania, kt\u00f3ry doda\u0142e\u015b w aplikacji Zoom OAuth. W moim przypadku adres URL przekierowania to <code>https:\/\/f2448150.ngrok.io\/zoom\/callback.php<\/code>. Oznacza to, \u017ce w <code>callback.php<\/code>pliku musimy napisa\u0107 kod, kt\u00f3ry wywo\u0142uje API Zoom, \u017c\u0105da\u0107 tokena dost\u0119pu i przechowywa\u0107 go w bazie danych.<\/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>Teraz wygenerujmy autoryzowany adres URL, pod kt\u00f3rym u\u017cytkownik mo\u017ce klikn\u0105\u0107 i zako\u0144czy\u0107 proces autoryzacji. Zamierzam utworzy\u0107 ten adres URL w <code>index.php<\/code>pliku.<\/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>Uruchom powy\u017cszy plik w przegl\u0105darce, kliknij link \u201eZaloguj si\u0119 z Zoomem&#8221; i zako\u0144cz proces autoryzacji. Po pomy\u015blnym uwierzytelnieniu powinien pojawi\u0107 si\u0119 komunikat o powodzeniu, a token dost\u0119pu zostanie zapisany w Twojej <code>token<\/code>tabeli. Je\u015bli to zadzia\u0142a, mo\u017cemy \u015bmia\u0142o stworzy\u0107 spotkanie z Zoom API.<\/p>\n<h3>Utw\u00f3rz spotkanie na Zoom za pomoc\u0105 Zoom API<\/h3>\n<p>Zoom zapewnia punkt ko\u0144cowy do tworzenia spotkania za po\u015brednictwem interfejsu API REST. Mo\u017cesz o tym przeczyta\u0107 w ich <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingcreate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji<\/a>. Wymaga wys\u0142ania \u017c\u0105dania POST do danego punktu ko\u0144cowego wraz z wymaganymi parametrami.<\/p>\n<p>Punkt ko\u0144cowy interfejsu API wymaga r\u00f3wnie\u017c przekazania tokena dost\u0119pu w nag\u0142\u00f3wku autoryzacji. Jak wspomnia\u0142em wcze\u015bniej, token dost\u0119powy ma kr\u00f3tki \u017cywot i zamierzamy go odtworzy\u0107 w tle bez ponownego proszenia o uwierzytelnienie.<\/p>\n<p>Utworzy\u0142em <code>create-meeting.php<\/code>plik do wysy\u0142ania \u017c\u0105dania POST do punktu ko\u0144cowego. Zajmowa\u0142em si\u0119 r\u00f3wnie\u017c warunkiem wyga\u015bni\u0119cia tokena i jego regeneracji po wyga\u015bni\u0119ciu.<\/p>\n<p><strong>tworzenie-spotkanie.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>Je\u015bli zauwa\u017cy\u0142e\u015b kod, poda\u0142em \u201e2021-03-20T20:30:00&#8243; jako \u201estart_time&#8221;. Oznacza to, \u017ce spotkanie b\u0119dzie mia\u0142o miejsce 20 marca 2021, 20:30. U\u017cytkownik powinien poda\u0107 format dla tego kodu w rrrr-MM-ddTHH:mm:ss.Dla klucza \u201etype&#8221; przekaza\u0142em warto\u015b\u0107 \u201e2&#8243;, kt\u00f3ra dotyczy zaplanowanego spotkania.U\u017cytkownik musi r\u00f3wnie\u017c ustawi\u0107 has\u0142o spotkania, kt\u00f3re ustawi\u0142em na \u201e123456&#8243;.<\/p>\n<p>\u015amia\u0142o i uruchom ten kod, a powiniene\u015b zobaczy\u0107, \u017ce spotkanie jest tworzone na Twoim koncie Zoom.<\/p>\n<h3>Lista spotka\u0144 Zoom<\/h3>\n<p>Napisali\u015bmy kod do tworzenia spotka\u0144 Zoom. U\u017cywaj\u0105c tego kodu, mo\u017cesz tworzy\u0107 tyle spotka\u0144, ile chcesz. Nast\u0119pnie mo\u017cesz chcie\u0107 wy\u015bwietli\u0107 w aplikacji list\u0119 wszystkich spotka\u0144.<\/p>\n<p>Zoom zapewnia API, przez kt\u00f3re mo\u017cemy pobra\u0107 wszystkie nasze spotkania Zoom. Utw\u00f3rz plik <code>list-meeting.php<\/code>i u\u017cyj poni\u017cszego kodu, kt\u00f3ry wydrukuje wszystkie spotkania.<\/p>\n<p><strong>lista-spotkanie.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>W powy\u017cszym kodzie 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>Po zako\u0144czeniu spotkania mo\u017cesz uzyska\u0107 list\u0119 uczestnik\u00f3w za pomoc\u0105 Zoom API. Zaleca si\u0119 wywo\u0142ywanie tego API tylko wtedy, gdy korzystasz z p\u0142atnego konta. Ten konkretny 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>&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>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 spotkanie<\/h3>\n<p>U\u017cytkownik mo\u017ce bawi\u0107 si\u0119 punktami ko\u0144cowymi Zoom API, takimi jak lista, aktualizacja, usuwanie spotkania. Wszystko, co musisz zrobi\u0107, to post\u0119powa\u0107 zgodnie z ich wytycznymi dotycz\u0105cymi korzystania z okre\u015blonych punkt\u00f3w ko\u0144cowych. Na przyk\u0142ad mo\u017cesz usun\u0105\u0107 spotkanie, wysy\u0142aj\u0105c \u017c\u0105danie DELETE do punktu ko\u0144cowego interfejsu API. Do tego punktu ko\u0144cowego musisz przekaza\u0107 sw\u00f3j identyfikator spotkania, jak pokazano poni\u017cej.<\/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>Mam nadziej\u0119, \u017ce wiesz, jak stworzy\u0107 spotkanie przy u\u017cyciu Zoom API i PHP. Chcia\u0142bym us\u0142ysze\u0107 wasze przemy\u015blenia i sugestie w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/jak-korzystac-z-interfejsu-api-youtube-do-przesylania-filmow-na-kanal-youtube\/\" title=\"Jak korzysta\u0107 z interfejsu API YouTube do przesy\u0142ania wideo na kana\u0142 YouTube?\">Jak korzysta\u0107 z interfejsu API YouTube do przesy\u0142ania wideo na kana\u0142 YouTube?<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/jak-korzystac-z-guzzle-klienta-php-http-do-wysylania-zadan-http\/\" title=\"Jak u\u017cywa\u0107 Guzzle do wysy\u0142ania \u017c\u0105da\u0144 HTTP\">Jak u\u017cywa\u0107 Guzzle do wysy\u0142ania \u017c\u0105da\u0144 HTTP<\/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<\/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 zorganizowa\u0107 spotkanie na Zoomie przy u\u017cyciu Zoom API i PHP? W tym artykule wyja\u015bni\u0119, jak wsp\u00f3\u0142dzia\u0142a\u0107 z Zoom API i generowa\u0107<\/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":[277],"tags":[847],"class_list":["post-29632","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\/29632","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=29632"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/20151"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=29632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=29632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=29632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}