Aviso:

Para brindarle información de soporte completa de manera más rápida, el contenido de esta página ha sido traducido al español mediante traducción automática. Para consultar la información de soporte más precisa, consulte la versión en inglés de este contenido.

Configurar el directorio de Functions

Ahora comenzaremos a codificar la aplicación Lead Manager configurando la Advanced I/O function.

El directorio de funciones functions/crmCRUD contiene:

  • El archivo principal de la función CRMCRUD.java
  • El archivo de configuración catalyst-config.json
  • Archivos de biblioteca Java en la carpeta lib
  • Archivos de dependencias .classpath y .project

Agregarás código en CRMCRUD.java.

Puedes usar cualquier IDE para configurar la función.

Nota: Revisa el código en esta sección para asegurarte de comprenderlo completamente. Discutiremos el código de la función y el cliente después de que configures el cliente.

Puedes copiar directamente el código a continuación y pegarlo en CRMCRUD.java ubicado en el directorio functions/crmCRUD y guardar el archivo.

CRMCRUD.java
copy
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.catalyst.advanced.CatalystAdvancedIOHandler;
import com.zc.auth.connectors.ZCConnection;
import com.zc.component.ZCUserDetail;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.component.users.ZCUser;
import com.zc.component.zcql.ZCQL;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
public class CRMCRUD implements CatalystAdvancedIOHandler {
	private static final Logger LOGGER = Logger.getLogger(CRMCRUD.class.getName());
	private String apiUrl = "https://www.zohoapis.com/crm/v2/Leads";
	private String GET = "GET";
	private String POST = "POST";
	private String PUT = "PUT";
	private String DELETE = "DELETE";
	private String CLIENT_ID = "{{YOUR_CLIENT_ID}}"; //Agrega tu Client ID
	private String CLIENT_SECRET = "{{YOUR_CLIENT_SECRET}}"; //Agrega tu Client Secret
	OkHttpClient client = new OkHttpClient();
	@Override
	@SuppressWarnings("unchecked")
	public void runner(HttpServletRequest request, HttpServletResponse response) throws Exception {
		try {
			LOGGER.info("STARTED!!!");
			String url = request.getRequestURI();
			String method = request.getMethod();
			String responseData = "";
			String recordID = "";
			Pattern p = Pattern.compile("([0-9]+)");
			MediaType mediaType = MediaType.parse("application/json");
			JSONParser jsonParser = new JSONParser();
			JSONObject data = new JSONObject();
			org.json.simple.JSONArray reqData = new org.json.simple.JSONArray();
			//Obtiene el Refresh Token llamando a la función getRefreshToken(), y lo inserta junto con el userID en la tabla Token
			if (Pattern.matches("/generateToken", url) && method.equals(GET)) {
				LOGGER.info("generateToken!!!");
				String code = request.getParameter("code");
				String domain = (request.getHeader("host").contains("localhost") ? ("http://" + request.getHeader("host")) : ("https://") + request.getHeader("host").split(":")[0]);
				LOGGER.info("Domain: "+domain);
				LOGGER.info("Code: "+code);
				ZCUserDetail details = ZCUser.getInstance().getCurrentUser();
				ZCObject object = ZCObject.getInstance();
				ZCRowObject row = ZCRowObject.getInstance();
				row.set("refresh_token", getRefreshToken(code, domain));
				row.set("userId", details.getUserId());
				ZCTable tab = object.getTable(1824000000686079L); //Reemplaza esto con el Table ID de tu tabla
				tab.insertRow(row);
				response.setStatus(200);
				response.sendRedirect(domain + "/app/index.html");
			//Obtiene los detalles del usuario llamando a la función getUserDetails()
			} else if (Pattern.matches("/getUserDetails", url) && method.equals(GET)) {
				ArrayList<ZCRowObject> user = getUserDetails();
	JSONObject resp = new JSONObject();
	if (user.isEmpty()) {
	resp.put("userId", null);
	response.setContentType("application/json");
	response.getWriter().write(resp.toJSONString());
	response.setStatus(200);
	} else {
	resp.put("userId", user.get(0).get("Token", "userId"));
	response.setContentType("application/json");
	response.getWriter().write(resp.toJSONString());
	response.setStatus(200);
	}
	//Ejecuta varias APIs para acceder, agregar o modificar leads en CRM
	//Obtiene todos los leads
	} else if (Pattern.matches("/crmData", url) && method.equals(GET)) {
	responseData = getResponse(GET, null);
	//Obtiene un lead en particular
	} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(GET)) {
	Matcher m = p.matcher(url);
	if (m.find()) {
	recordID = m.group(1);
	}
	apiUrl = apiUrl + "/" + recordID;
	responseData = getResponse(GET, null);
	//Agrega un nuevo lead
	} else if (Pattern.matches("/crmData", url) && method.equals(POST)) {
	ServletInputStream requestBody = request.getInputStream();
	JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8"));
	reqData.add(jsonObject);
	data.put("data", reqData);
	RequestBody body = RequestBody.create(mediaType, data.toString());
	responseData = getResponse(POST, body);
	//Elimina un lead
	} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(DELETE)) {
	Matcher m = p.matcher(url);
	if (m.find()) {
	recordID = m.group(1);
	}
	apiUrl = apiUrl + "/" + recordID;
	responseData = getResponse(DELETE, null);
	//Edita un lead
	} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(PUT)) {
	Matcher m = p.matcher(url);
	if (m.find()) {
	recordID = m.group(1);
	}
	apiUrl = apiUrl + "/" + recordID;
	ServletInputStream requestBody = request.getInputStream();
	JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8"));
	reqData.add(jsonObject);
	data.put("data", reqData);
	RequestBody body = RequestBody.create(mediaType, data.toJSONString());
	responseData = getResponse(PUT, body);
	} else {
	LOGGER.log(Level.SEVERE, "Error. Invalid Request"); //Las acciones se registran en logs. Puedes verificar los logs desde Catalyst
	response.setStatus(404);
	responseData = "Error. Invalid Request";
	response.getWriter().write(responseData);
	}
	response.setContentType("application/json");
	response.getWriter().write(responseData);
	response.setStatus(200);
	} catch (Exception e) {
	LOGGER.log(Level.SEVERE, "Exception in CRM Function ", e);
	response.setStatus(500);
	response.getWriter().write(e.toString());
	}
	}
	@SuppressWarnings("unchecked")
	//Obtiene un Access Token usando el Refresh Token
	public String getAccessToken(Long userId) throws Exception {
	JSONObject authJson = new JSONObject();
	JSONObject connectorJson = new JSONObject();
	String query = "SELECT refresh_token FROM Token where UserId=" + userId;
	if (rowList.isEmpty()) {
    throw new RuntimeException("No token found for userId: " + userId);
	}
	Object refreshTokenObj = rowList.get(0).get("Token", "refresh_token");
	if (refreshTokenObj == null) {
			throw new RuntimeException("Refresh token is null for userId: " + userId);
	}
authJson.put("refresh_token", refreshTokenObj.toString());
	ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
		authJson.put("client_id", CLIENT_ID);
		authJson.put("client_secret", CLIENT_SECRET);
		authJson.put("auth_url", "https://accounts.zoho.com/oauth/v2/token");
		authJson.put("refresh_url", "https://accounts.zoho.com/oauth/v2/token");
		authJson.put("refresh_token", rowList.get(0).get("Token", "refresh_token"));
		connectorJson.put(userId.toString(), authJson);
		return ZCConnection.getInstance(connectorJson).getConnector(userId.toString()).getAccessToken();
		}
		//Obtiene el Refresh Token pasando los detalles requeridos
		public String getRefreshToken(String code, String domain) throws Exception {
		HttpUrl.Builder urlBuilder = HttpUrl.parse("https://accounts.zoho.com/oauth/v2/token").newBuilder();
		urlBuilder.addQueryParameter("code", code);
		urlBuilder.addQueryParameter("client_id", CLIENT_ID);
		urlBuilder.addQueryParameter("client_secret", CLIENT_SECRET);
		urlBuilder.addQueryParameter("grant_type", "authorization_code");
		urlBuilder.addQueryParameter("redirect_uri", domain + "/server/crmcrud/generateToken");
		String URL = urlBuilder.build().toString();
		MediaType mediaType = MediaType.parse("text/plain");
		RequestBody body = RequestBody.create(mediaType, "");
		Request getResponse = new Request.Builder().url(URL).method(POST, body).build();
		JSONParser jsonParser = new JSONParser();
		JSONObject data = (JSONObject) jsonParser.parse(client.newCall(getResponse).execute().body().string());
		return data.get("refresh_token").toString();
		}
		//Pasa el Access Token obtenido para conseguir la autorización necesaria para realizar cada acción en el módulo de CRM
		public String getResponse(String METHOD, RequestBody body) throws Exception {
		Long userId = ZCUser.getInstance().getCurrentUser().getUserId();
		String accessToken = getAccessToken(userId);
		Request getResponse = new Request.Builder().url(apiUrl).method(METHOD, body)
		.addHeader("Authorization", "Zoho-oauthtoken " + accessToken).build();
		return client.newCall(getResponse).execute().body().string();
		}
		//Obtiene el registro de la tabla Token que contiene el Refresh Token, pasando el userID
		public ArrayList<ZCRowObject> getUserDetails() throws Exception {
			Long userId = ZCUser.getInstance().getCurrentUser().getUserId();
			String query = "SELECT * FROM Token where UserId=" + userId;
			ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
				return rowList;
				}
				}

View more

Nota: Después de copiar y pegar este código en tu archivo de función, asegúrate de reemplazar los siguientes valores en él:

El directorio de funciones ahora está configurado. Discutiremos el código de la función y el cliente después de que configures el cliente.

Última actualización 2026-03-20 21:51:56 +0530 IST