Event Functionの設定
ここでは、Zoho Cliqチャンネルに自動的にメッセージを送信するEvent Function Cliq_Notifierを設定します。このメッセージには、支払いが正常に完了した新規顧客の請求書詳細が含まれます。このFunctionは、Catalyst Signalsによってトリガーされた際に実行されます。
Functionsディレクトリ、functions/Cliq_Notifierには以下が含まれています:
- CliqNotifier.javaメインFunctionファイル
- catalyst-config.json設定ファイル
- libフォルダ内のJavaライブラリファイル
- .classpathおよび.project依存関係ファイル
CliqNotifier.javaファイルにコードを追加します。
以下のコードをそのままコピーし、functions/Cliq_NotifierディレクトリにあるCliqNotifier.javaに貼り付けて、ファイルを保存してください。
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Arrays;
import java.io.IOException;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
import com.catalyst.Context;
import com.catalyst.event.EVENT_STATUS;
import com.catalyst.event.EventRequest;
import com.catalyst.event.CatalystEventHandler;
import com.zc.auth.connectors.ZCConnection;
import okhttp3.OkHttpClient;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class CliqNotifier implements CatalystEventHandler {
private static final Logger LOGGER = Logger.getLogger(CliqNotifier.class.getName());
private static final String ZBOOKSDOMAIN = "{{YOUR_ZBOOKS_DOMAIN}}"; //リージョンに基づいたZoho Booksドメインを入力してください
private static final String ZBOOKSORG = "{{YOUR_ZBOOKS_ORGANIZATION_ID}}"; //Zoho BooksのOrganization IDを入力してください
private static final String ZCLIQDOMAIN = "{{YOUR_ZCLIQ_DOMAIN}}"; //リージョンに基づいたZoho Cliqドメインを入力してください
private static final String ZCLIQ_CHANNEL_UNIQUE_NAME = "{{YOUR_CHANNEL_UNIQUE_NAME}}"; //更新を投稿するチャンネルのユニーク名を入力してください
private static final String ZCLIQ_BOT_UNIQUE_NAME = "{{YOUR_BOT_UNIQUE_NAME}}"; //メッセージを投稿するボットのユニーク名を入力してください
private static final String ZACCOUNTSDOMAIN = "{{YOUR_ZACCOUNTS_DOMAIN}}"; //リージョンに基づいたZoho Accountsドメインを入力してください
@Override
public EVENT_STATUS handleEvent(EventRequest event, Context context) throws Exception {
try {
JSONArray data = extractInvoiceData(event);
JSONArray rows = transformInvoiceData(data);
JSONObject requestBody = prepareCliqRequest(rows);
String accessToken = getAccessToken();
sendToCliq(requestBody, accessToken);
LOGGER.log(Level.INFO, "Message pushed to channel successfully");
return EVENT_STATUS.SUCCESS;
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "An unexpected error occurred: ", e);
return EVENT_STATUS.FAILURE;
}
}
private JSONArray extractInvoiceData(EventRequest event) throws JSONException {
JSONObject payload = (JSONObject) event.getRawData();
JSONArray data = payload.getJSONArray("data");
JSONArray rows = new JSONArray();
for (int i = 0; i < data.length(); i++) {
JSONArray invoices = data.getJSONArray(i);
for (int j = 0; j < invoices.length(); j++) {
rows.put(invoices.getJSONObject(j));
}
}
return rows;
}
private JSONArray transformInvoiceData(JSONArray rows) throws JSONException {
for (int i = 0; i < rows.length(); i++) {
JSONObject row = rows.getJSONObject(i);
String invoiceId = row.optString("Invoice Id");
row.put("Link", "https://" + ZBOOKSDOMAIN + "/app/" + ZBOOKSORG + "#/invoices/" + invoiceId);
row.remove("Invoice Id");
}
return rows;
}
private JSONObject prepareCliqRequest(JSONArray rows) throws JSONException {
JSONArray headers = new JSONArray(Arrays.asList(
"Customer",
"Invoice Number",
"Amount",
"Paid On",
"Link"
));
JSONObject tableData = new JSONObject()
.put("headers", headers)
.put("rows", rows);
JSONObject slide = new JSONObject()
.put("type", "table")
.put("data", tableData);
return new JSONObject()
.put("text", "Here are the invoices marked as Paid in the last hour:")
.put("slides", new JSONArray().put(slide));
}
@SuppressWarnings("unchecked")
private String getAccessToken() throws Exception {
org.json.simple.JSONObject authConfig = new org.json.simple.JSONObject();
org.json.simple.JSONObject connectorConfig = new org.json.simple.JSONObject();
authConfig.put("client_id", "{{YOUR_CLIENT_ID}}"); //Client IDを入力してください
authConfig.put("client_secret", "{{YOUR_CLIENT_SECRET}}"); //Client Secretを入力してください
authConfig.put("auth_url", "https://" + ZACCOUNTSDOMAIN + "/oauth/v2/auth");
authConfig.put("refresh_url", "https://" + ZACCOUNTSDOMAIN + "/oauth/v2/token");
authConfig.put("refresh_token", "{{YOUR_REFRESH_TOKEN}}"); //Refresh Tokenを入力してください
connectorConfig.put("CliqConnector", authConfig);
return ZCConnection.getInstance(connectorConfig).getConnector("CliqConnector").getAccessToken();
}
private void sendToCliq(JSONObject payload, String accessToken) throws IOException {
String cliqUrl = "https://" + ZCLIQDOMAIN + "/api/v2/channelsbyname/" + ZCLIQ_CHANNEL_UNIQUE_NAME + "/message?bot_unique_name=" + ZCLIQ_BOT_UNIQUE_NAME;
Request request = new Request.Builder()
.url(cliqUrl)
.addHeader("Authorization", "Zoho-oauthtoken " + accessToken)
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(MediaType.parse("application/json"), payload.toString()))
.build();
try (Response response = new OkHttpClient().newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected response from Cliq API: " + response.body().string());
}
}
}
}
-
Zoho Booksドメイン(27行目):リージョンに基づいたZoho Books Organizationのドメインを入力してください。例:books.zoho.com、books.zoho.eu、books.zoho.in
-
Zoho Books Organization ID(28行目):Zoho Booksアカウントの一意のOrganization IDを入力してください。
-
Zoho Cliqドメイン(30行目):リージョンに基づいたZoho Cliq Organizationのドメインを指定してください。例:cliq.zoho.com、cliq.zoho.eu
-
Zoho Cliqチャンネルのユニーク名(31行目):支払い済み請求書の更新を投稿するZoho Cliqチャンネルのユニーク名を入力してください。
-
Zoho Cliqボットのユニーク名(32行目):上記チャンネルに追加されたZoho Cliqボットのユニーク名を入力してください。
-
Zoho Accountsドメイン(34行目):Catalyst、Zoho Books、Zoho Cliqへのログインに使用するZoho Accountsドメインを指定してください。例:accounts.zoho.com、accounts.zoho.in
-
Client ID(109行目):ステップ4のクライアント登録時に取得したClient IDを貼り付けてください。
-
Client Secret(110行目):ステップ4で生成された対応するClient Secretを貼り付けてください。
-
Refresh Token(113行目):ステップ5でAPIクライアントツールを使用して生成したRefresh Tokenを入力してください。
Event Functionの設定が完了しました。
最終更新日 2026-03-05 11:43:24 +0530 IST