Introduction:
Zoom Integration With Liferay to perform meeting operations and boost work efficiency. Embed Zoom on Liferay sites or online workspaces for a smooth experience. Enable team members to work together in real-time through quality video calls, no matter where they are.
Prerequisites:
- Liferay 7.4+
- A Google account
- Zoom application
- Eclipse IDE
Step 1: Build a Server-to-Server app
- Navigate to the Zoom marketplace by following the below link.
- https://marketplace.zoom.us/
- Note: Signing in to the Zoom marketplace is a must.
- Click the Develop dropdown menu on the right side of the screen, then choose the Build Server-to-Server App.
- Provide the app name and click on the Create button.
- Add basic information and developer contact information to the server-to-server app.
- Add scopes to perform operations using generated credentials.
- Activate the app.
- Get an authorization token.
- The getZoomAuthToken() method will generate an authorization token.
- Update ACCOUNT_ID, CLIENT_ID, and CLIENT_SECRET values according to the Zoom server to server app credential. Make sure the value of these fields is not null.
- Create a Zoom meeting.
- sendHTTPRequest(httpPost, headerMap) method will create a meeting.
- Add the below dependency to the build.gradle file.
compileOnly group: “com.google.code.gson”, name: “gson”, version: “2.10” |
- Add below package to zoomintegration-impl -> bnd.bnd file.
-privatepackage: com.google.gson.* |
- Add the private package com.google.gson.* in bnd.bnd file to convert response into the JSON format.
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
import com.liferay.portal.kernel.util.Validator;
import java.io.Serializable;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.Portlet;
import javax.portlet.ProcessAction;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import zoom.integration.constants.ZoomIntegrationPortletKeys;
@Component(immediate = true,
property = {"com.liferay.portlet.display-category=category.sample",
"com.liferay.portlet.header-portlet-css=/css/main.css",
"com.liferay.portlet.instanceable=true",
"javax.portlet.display-name=ZoomIntegration",
"javax.portlet.init-param.template-path=/",
"javax.portlet.init-param.view-template=/view.jsp",
"javax.portlet.name=" + ZoomIntegrationPortletKeys.ZOOMINTEGRATION,
"javax.portlet.resource-bundle=content.Language",
"javax.portlet.security-role-ref=power-user,user"},
service = Portlet.class)
public class ZoomIntegrationPortlet extends MVCPortlet {
@ProcessAction(name = "createMeeting")
public String createMeeting(
ActionRequest actionRequest, ActionResponse actionResponse) {
String responseBody = StringPool.BLANK;
if (Validator.isNotNull(getZoomAuthToken())) {
String authToken = getZoomAuthToken();
JSONObject requestBody = jSONFactory.createJSONObject();
requestBody.put("agenda", "My meeting");
requestBody.put("duration", 30);
requestBody.put("start_time", "2024-06-5T10:30:00Z");
requestBody.put("timezone", "Asia/Calcutta");
requestBody.put("topic", "My meeting");
Map headerMap = new HashMap<>();
headerMap.put("Authorization", "Bearer" + authToken);
headerMap.put("Content-Type", ContentType.APPLICATION_JSON.toString());
HttpPost httpPost =
new HttpPost("https://api.zoom.us/v2/users/me/meetings");
HttpEntity entity = new StringEntity(
requestBody.toString(), ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
responseBody = sendHTTPRequest(httpPost, headerMap);
}
return responseBody;
}
private String getZoomAuthToken() {
String authToken = StringPool.BLANK;
String ACCOUNT_ID = "1pTIXYY-QfW7yZiEvIs4RA";
String CLIENT_ID = "KWOPPQoQM6sh2ffTmH1bQ";
String CLIENT_SECRET = "7blyG2Crqq95peaN55E22WvvRyVD32Q5";
if (!(ACCOUNT_ID.isBlank() && CLIENT_ID.isBlank()
&& CLIENT_SECRET.isBlank())) {
String auth = CLIENT_ID + StringPool.COLON + CLIENT_SECRET;
String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
Map headerMap = new HashMap<>();
headerMap.put(
"Content-Type", ContentType.APPLICATION_FORM_URLENCODED.toString());
headerMap.put("Authorization", "Basic" + StringPool.SPACE + encodedAuth);
Map requestBodyMap = new HashMap<>();
requestBodyMap.put("grant_type", "account_credentials");
requestBodyMap.put("account_id", ACCOUNT_ID);
String requestBody =
requestBodyMap.toString()
.replace(StringPool.OPEN_CURLY_BRACE, StringPool.BLANK)
.replace(StringPool.CLOSE_CURLY_BRACE, StringPool.BLANK)
.replace(
StringPool.COMMA + StringPool.SPACE, StringPool.AMPERSAND);
HttpPost httpPost = new HttpPost("https://zoom.us/oauth/token");
HttpEntity entity = new StringEntity(
requestBody, ContentType.APPLICATION_FORM_URLENCODED);
httpPost.setEntity(entity);
String response = sendHTTPRequest(httpPost, headerMap);
Gson gson = new Gson();
JsonObject object = gson.fromJson(response, JsonObject.class);
authToken = object.get("access_token")
.toString()
.replaceAll(StringPool.QUOTE, StringPool.BLANK);
}
return authToken;
}
private String sendHTTPRequest(
HttpUriRequest httpUriRequest, Map headerMap) {
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
headerMap.forEach((key, value) -> {
httpUriRequest.setHeader(key, value);
});
HttpResponse response = client.execute(httpUriRequest);
return Validator.isNotNull(response.getEntity())
? EntityUtils.toString(response.getEntity())
: String.valueOf(response.getStatusLine().getStatusCode());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return StringPool.BLANK;
}
private static final Log log =
LogFactoryUtil.getLog(ZoomIntegrationPortlet.class);
@Reference
JSONFactory jSONFactory;
}
- Meeting will be generated in the Zoom account.
Conclusion:
Integrating Zoom with Liferay enhances productivity by enabling seamless video communication directly within the Liferay platform. This setup allows team members to collaborate effectively through high-quality video calls, regardless of location. By following the outlined steps, you can create a server-to-server app in Zoom, obtain an authorization token, and programmatically schedule Zoom meetings in Liferay, streamlining your workflow and boosting efficiency.