{"id":29763,"date":"2021-06-19T17:02:00","date_gmt":"2021-06-19T14:02:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29763"},"modified":"2021-10-17T04:13:36","modified_gmt":"2021-10-17T01:13:36","slug":"hur-man-skapar-zoommoten-med-php-och-jwt","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/sv\/hur-man-skapar-zoommoten-med-php-och-jwt\/","title":{"rendered":"Hur man skapar zoomm\u00f6ten med PHP och JWT"},"content":{"rendered":"<p>Tidigare har jag skrivit en artikel som f\u00f6rklarar att <a href=\"https:\/\/themewp.inform.click\/sv\/hur-man-skapar-ett-mote-med-zoom-med-hjalp-av-zoom-api-och-php\/\" title=\"skapa ett Zoom-m\u00f6te med PHP och OAuth\" >skapa ett Zoom-m\u00f6te med PHP och OAuth<\/a>. En av v\u00e5ra l\u00e4sare fr\u00e5gade om att skapa ett Zoom-m\u00f6te med JWT (JSON Web Tokens) och PHP. <a href=\"https:\/\/marketplace.zoom.us\/docs\/guides\/auth\/jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zoom<\/a> API till\u00e5ter oss att anv\u00e4nda b\u00e5de OAuth eller JWT f\u00f6r att hantera deras API: er. Zoom API kr\u00e4ver Bearer-token som genereras antingen via OAuth eller JWT.<\/p>\n<p><strong>Obs!<\/strong> JWT f\u00e5r endast anv\u00e4ndas f\u00f6r interna applikationer och processer. Alla appar som skapats f\u00f6r tredjepartsanv\u00e4ndning m\u00e5ste anv\u00e4nda apptypen OAuth.<\/p>\n<p>N\u00e4r du vill bygga en Zoom-app f\u00f6r internt bruk \u00e4r JWT-metoden enklare \u00e4n OAuth.<\/p>\n<h3>Komma ig\u00e5ng<\/h3>\n<p>F\u00f6r att komma ig\u00e5ng, g\u00e5 till Zoom Developer Dashboard och skapa en <a href=\"https:\/\/marketplace.zoom.us\/develop\/create\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ny app<\/a>. V\u00e4lj <code>JWT<\/code>som apptyp och kopiera Zoom API-nyckel och hemlighet.<\/p>\n<p>En enda JWT best\u00e5r av tre komponenter: sidhuvud, nyttolast och signatur med <code>.<\/code>separata vardera. Till exempel:<code>aaaaa.bbbbb.ccccc<\/code><\/p>\n<p>Flera bibliotek finns tillg\u00e4ngliga som hj\u00e4lper till att generera JWT. Jag kommer att rekommendera att anv\u00e4nda <a href=\"https:\/\/github.com\/firebase\/php-jwt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">firebase \/ php-jwt-<\/a> biblioteket. Detta bibliotek ger en mycket enklare metod f\u00f6r att skapa JWT. Installera detta bibliotek med kommandot nedan.<\/p>\n<pre><code>composer require firebase\/php-jwt<\/code><\/pre>\n<p>D\u00e4refter m\u00e5ste vi skicka en POST-beg\u00e4ran till Zoom API f\u00f6r att skapa ett m\u00f6te. Man kan anv\u00e4nda cURL f\u00f6r detta \u00e4ndam\u00e5l. Men jag gillar personligen en <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a> som ger mycket renare kod \u00e4n cURL. En annan f\u00f6rdel med att anv\u00e4nda Guzzle \u00e4r att du inte beh\u00f6ver ha cURL-till\u00e4gg aktiverat p\u00e5 servern.<\/p>\n<p>K\u00f6r kommandot nedan f\u00f6r att installera Guzzle-biblioteket.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<h3>Skapa zoomm\u00f6ten med JWT och PHP<\/h3>\n<p>Vi har installerat tv\u00e5 paket f\u00f6r att uppn\u00e5 v\u00e5rt m\u00e5l. Nu m\u00e5ste vi inkludera dess milj\u00f6 i v\u00e5r PHP-fil. Vi har ocks\u00e5 kopierat Zoom API-nycklar i f\u00f6reg\u00e5ende steg. L\u00e5t oss definiera dessa nycklar som konstanter i 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>N\u00e4sta, f\u00f6r att generera JWT med <code>firebase\/php-jwt<\/code>paketet kommer v\u00e5r kod att vara som f\u00f6ljer.<\/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>Slutligen, f\u00f6r att skapa ett Zoom-m\u00f6te m\u00e5ste den skicka POST-beg\u00e4ran till slutpunkten <code>\/v2\/users\/me\/meetings<\/code>med JWT som <strong>b\u00e4rartoken<\/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 zoomm\u00f6ten<\/h3>\n<p>I din ans\u00f6kan kanske du vill lista alla Zoom-m\u00f6ten. Zoom tillhandah\u00e5ller ett API genom vilket vi kan f\u00e5 en lista \u00f6ver alla Zoom-m\u00f6ten. Med koden nedan kan du skriva ut information om dina Zoom-m\u00f6ten.<\/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>H\u00e4r skriver jag ut ett \u00e4mne och en URL f\u00f6r m\u00f6ten. Du kan ocks\u00e5 skriva ut annan information. Skriv ut variabeln f\u00f6r <code>$data<\/code>att f\u00e5 en lista med tillg\u00e4nglig information.<\/p>\n<h3>F\u00e5 deltagare i tidigare m\u00f6ten<\/h3>\n<p>F\u00f6r de senaste m\u00f6tena kan du f\u00e5 en lista \u00f6ver deltagare med hj\u00e4lp av Zoom API. Om du har ett betalt konto kan du anv\u00e4nda detta specifika API. Detta API kr\u00e4ver ett betalt konto. Om du f\u00f6rs\u00f6ker ringa detta API med ett gratis konto f\u00e5r du ett fel.<\/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>Byt ut platsh\u00e5llaren MEETING_ID med det faktiska ID-numret f\u00f6r tidigare m\u00f6te. I svaret f\u00e5r du deltagarnas namn och e-postmeddelanden.<\/p>\n<h3>Ta bort zoomm\u00f6te med JWT och PHP<\/h3>\n<p>Genom att l\u00e4gga till f\u00f6r att skapa ett m\u00f6te tillhandah\u00e5ller Zoom ocks\u00e5 API-slutpunkter som lista, uppdatera, radera ett m\u00f6te. Anv\u00e4ndaren m\u00e5ste f\u00f6lja sin API-dokumentation f\u00f6r att anv\u00e4nda en specifik slutpunkt. Som ett exempel kan du <a href=\"https:\/\/marketplace.zoom.us\/docs\/api-reference\/zoom-api\/meetings\/meetingdelete\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">radera ett m\u00f6te<\/a> genom att skicka en DELETE-beg\u00e4ran till Zoom API-slutpunkten. Du m\u00e5ste skicka ditt m\u00f6tes-ID till slutpunkten enligt f\u00f6ljande.<\/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>Jag hoppas att du fick veta om att skapa Zoom-m\u00f6ten med PHP och JWT. Dela dina tankar och f\u00f6rslag i kommentarsektionen nedan.<\/p>\n<h4>relaterade artiklar<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/sv\/en-guide-om-hcaptcha-integration-med-php\/\" title=\"En guide om hCaptcha-integration med PHP\">En guide om hCaptcha-integration med PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/sv\/skriv-data-till-onedrive-ark-med-microsoft-graph-api-och-php\/\" title=\"Skriv data till OneDrive-ark med Microsoft Graph API och PHP\">Skriv data till OneDrive-ark med Microsoft Graph API och PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/sv\/tal-till-text-med-amazon-transcribe-i-php\/\" title=\"Tal till text med Amazon Transcribe i PHP\">Tal till text med Amazon Transcribe i PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vill du skapa zoomm\u00f6ten med JWT och PHP? JWT (JSON Web Tokens) \u00e4r en alternativ till OAuth f\u00f6r att generera \u00e5tkomsttoken. I denna<\/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":[279],"tags":[850],"class_list":["post-29763","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-10","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/posts\/29763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/comments?post=29763"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/posts\/29763\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/media\/20149"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/media?parent=29763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/categories?post=29763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/sv\/wp-json\/wp\/v2\/tags?post=29763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}