Genesysでの着信コールの切断または拒否
メディア・ツールバー・アプリケーションは、マイクロサービスから公開された様々なイベントをリスニングします。
- メディア・ツールバー・アプリケーションから。
- Fusionアプリケーションから。
- Genesys用に構成されたソフト・フォンから。
シナリオ1および2: メディア・ツールバーおよびFusionアプリケーションからのコールの切断
次のフロー図は、エージェントがFusionまたはメディア・ツールバー・アプリケーションからコールを切断した後に実行される一連の操作を示しています:
- エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを切断できます。
-
エージェントがFusionアプリケーションの「拒否」ボタンをクリックすると、
onToolbarInteractionCommand
イベントがコマンドreject
で起動されます。エージェントがFusionアプリケーションの「コール終了」ボタンをクリックすると、
onToolbarInteractionCommand
イベントがコマンドwrapup
で起動されます。エージェントがメディア・ツールバー・アプリケーションからのコールを拒否すると、コールが拒否されたことがマイクロサービスに通知されます。
エージェントがメディア・ツールバー・アプリケーションからのコールを終了すると、コールが終了したことがマイクロサービスに通知されます。
-
- メディア・ツールバー・アプリケーションは、このイベントを受信し、イベントがコールを切断する場合、コールを切断するようにマイクロサービスに通知されます。
- マイクロサービスは、通知を受信したら、
com.genesyslab.platform.voice.protocol.tserver.requests.party.RequestReleaseCall
リクエストを使用してGenesysサーバーにコールの切断をリクエストする必要があります。 RequestReleaseCall
リクエストが成功すると、EventReleased
メッセージがGenesysからマイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。- メディア・ツールバー・アプリケーションは、webソケットを介して
EventReleased
メッセージを受信し、コールが拒否された場合はreject
、コールが終了した場合はwrapup
という理由のcloseCommEvent
アクションを起動します。 - Fusionアプリケーションでこのアクションが識別されると、理由が
reject
の場合はコール・ダイアログ・ボックスがUIから破棄され、理由がwrapup
の場合はラップ・アップ・ウィンドウがUIに表示されます。
エージェントは、アプリケーションFusionまたはメディア・ツールバー・アプリケーションからコールを切断
エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを切断できます。
- エージェントがFusionアプリケーションの「拒否」ボタンをクリックすると、
onToolbarInteractionCommand
イベントがコマンドreject
で起動されます。 - エージェントがFusionアプリケーションの「コール終了」ボタンをクリックすると、
onToolbarInteractionCommand
イベントがコマンドwrapup
で起動されます。 - エージェントがメディア・ツールバー・アプリケーションからのコールを拒否すると、コールが拒否されたことがマイクロサービスに通知されます。
- エージェントがメディア・ツールバー・アプリケーションからのコールを終了すると、コールが終了したことがマイクロサービスに通知されます。
マイクロサービスにコールの切断を通知
エージェントがメディア・ツールバー・アプリケーションまたはFusionアプリケーションからコールを切断する場合、エージェントがコールを切断したことをマイクロサービスに通知する必要があります。 そのためには、次の例に示すように、vendorHandler.ts
ファイルのrejectCall
関数を更新します:
public async rejectCall(): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "Reject",
"connectionId": VendorHandler.connectionId
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
public async hangupCall(): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "Reject",
"connectionId": VendorHandler.connectionId
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
マイクロサービスによるコール切断リクエストの作成
マイクロサービスは、PSDK
を使用して、コールを切断するリクエストを作成します。
マイクロサービスはEventReleasedメッセージを受信
コール切断のリクエストが成功すると、GenesysサーバーはwithEventReleased
メッセージで応答し、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。
メディア・ツールバー・アプリケーションからcloseCommEventをコール
webソケットを介してEventReleased
メッセージを受信すると、次の例に示すように、callHangupHandler
ファンクションがintegrationEventsHandler.ts
ファイルからコールされます:
public webSocketOnMessage(event: MessageEvent): void {
const jsonMessage = JSON.parse(event.data);
console.log(jsonMessage);
if (jsonMessage.eventName === "EventRegistered") {
// Genesys notifies that the agent is ready
this.integrationEventsHandler.makeAgentAvailable();
} else if (jsonMessage.eventName === "EventRinging") {
// Show incoming call notification
this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
VendorHandler.connectionId = jsonMessage.connectionId;
} else if (jsonMessage.eventName === "EventEstablished") {
// Genesys notifies that the call is accepted
this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
} else if (jsonMessage.eventName === "EventReleased") {
// Genesys notifies that the call is disconnected
this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
}
console.log("Message is received");
}
コールがFusionアプリケーションで切断されました
Fusionアプリケーションは、コールが拒否された場合に着信コール通知を削除します。コールが終了すると、WRAPUP
ウィンドウが表示されます。 メディア・ツールバーのアプリケーションUIが更新され、エージェントがコールに使用できることが示されます。
シナリオ3: ソフト・フォンからの通話の切断
エージェントがソフト・フォンからのコールを受け入れると、EventEstablished
イベントによって、コールが受け入れられたという通知が送信されます。 次の図に示すように、コールが受け入れられたシナリオを処理するためのロジックをEventEstablished
イベントに追加できます。 フロー図は、エージェントがソフト・フォンからの着信コールを受け入れると実行される一連の操作を示しています:
- エージェントがソフト・フォン・アプリケーションからコールを切断すると、Genesysサーバーにはコールの切断が通知され、切断が成功すると、Genesysサーバーは
EventReleased
メッセージをマイクロサービスに送信し、webソケットを介してこのメッセージをメディア・ツールバー・アプリケーションに伝播します。 - メディア・ツールバー・アプリケーションは、このイベントを受信し、
closeCommEvent
アクションを起動します。 - Fusionアプリケーションがアクションを識別すると、その理由が
reject
の場合はコール・ダイアログ・ボックスがUIから破棄され、コールが終了した場合はWRAPUP
ウィンドウが破棄されます。
マイクロサービスは、EventReleasedメッセージをメディア・ツールバー・アプリケーションに伝播
エージェントがソフト・フォン・アプリケーションからコールを切断すると、コールを切断するようにGenesysサーバーに通知され、コールが切断されると、GenesysサーバーはEventReleased
メッセージをマイクロサービスに送信し、このメッセージをwebソケットを介してメディア・ツールバー・アプリケーションに伝播します。
メディア・ツールバー・アプリケーションからcloseCommEventをコール
EventReleased
メッセージがwebソケットを介して受信されると、次の例に示すように、callHangupHandler
ファンクションがintegrationEventsHandler.ts
ファイルで起動されます:
public webSocketOnMessage(event: MessageEvent): void {
const jsonMessage = JSON.parse(event.data);
console.log(jsonMessage);
if (jsonMessage.eventName === "EventRegistered") {
// Genesys notifies that the agent is ready
this.integrationEventsHandler.makeAgentAvailable();
} else if (jsonMessage.eventName === "EventRinging") {
// Show incoming call notification
this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
VendorHandler.connectionId = jsonMessage.connectionId;
} else if (jsonMessage.eventName === "EventEstablished") {
// Genesys notifies that the call is accepted
this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
} else if (jsonMessage.eventName === "EventReleased") {
// Genesys notifies that the call is disconnected
this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
}
console.log("Message is received");
}
コールがFusionアプリケーションで切断されました
Fusionアプリケーションは、コールが拒否された場合に着信コール通知を削除します。コールが終了すると、WRAPUP
ウィンドウが表示されます。 メディア・ツールバーのアプリケーションUIが更新され、エージェントがコールに使用できることが示されます。
完全なコード
呼出しを切断するためのvendorHandler.ts
ファイルの完全なコードを次に示します。
import { ICtiVendorHandler } from './ICtiVendorHandler';
import { IntegrationEventsHandler } from '../integrationEventsHandler';
export class VendorHandler implements ICtiVendorHandler {
public static connectionId: string;
private static REST_ENDPOINT_URL: string = 'http://localhost:8087/genesys/events';
private static WS_ENDPOINT_URL: string = 'ws://localhost:8087/genesysWs';
private integrationEventsHandler: IntegrationEventsHandler;
constructor(integrationEventsHandler: IntegrationEventsHandler) {
this.integrationEventsHandler = integrationEventsHandler;
}
public async webSocketOnOpenHandler(): Promise<void> {
console.log("WebSocket opened");
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "initialize"
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
public webSocketErrorHandler(error: any): void {
console.log("WebSocket error", error);
}
public webSocketCloseHandler(event: Event): void {
console.log("WebSocket is closed", event);
}
public webSocketOnMessage(event: MessageEvent): void {
const jsonMessage = JSON.parse(event.data);
console.log(jsonMessage);
if (jsonMessage.eventName === "EventRegistered") {
// Genesys notifies that the agent is ready
this.integrationEventsHandler.makeAgentAvailable();
} else if (jsonMessage.eventName === "EventRinging") {
// Show incoming call notification
this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
VendorHandler.connectionId = jsonMessage.connectionId;
} else if (jsonMessage.eventName === "EventEstablished") {
// Genesys notifies that the call is accepted
this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
VendorHandler.connectionId = jsonMessage.connectionId;
} else if (jsonMessage.eventName === "EventReleased") {
// Genesys notifies that the call is disconnected
this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
}
console.log("Message is received");
}
public async makeAgentAvailable(): Promise<void> {
let webSocket: WebSocket = new WebSocket(`${VendorHandler.WS_ENDPOINT_URL}`);
webSocket.onopen = this.webSocketOnOpenHandler.bind(this);
webSocket.onmessage = this.webSocketOnMessage.bind(this);
webSocket.onclose = this.webSocketCloseHandler.bind(this);
webSocket.onerror = this.webSocketErrorHandler.bind(this);
}
public async makeAgentUnavailable(): Promise<void> {
// TODO: call the vendor specific api to make the agent available
}
public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
// TODO: call the vendor specific api to make the make an outbound call
}
public async acceptCall(): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "Accept",
"connectionId": VendorHandler.connectionId
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
public async rejectCall(): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "Reject",
"connectionId": VendorHandler.connectionId
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
public async hangupCall(): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "Reject",
"connectionId": VendorHandler.connectionId
};
const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
method: 'POST',
headers: headers,
body: JSON.stringify(message)
}) as Request;
await fetch(request);
}
}
進捗の確認
これらのステップが終了したら、OJETサーバーを使用してアプリケーションを起動し、Fusionアプリケーションにサインインします。 メディア・ツールバーを開き、「エージェント可用性」ボタンをクリックしてエージェントをコールに使用できるようにします。 次に、カスタマ・ケア番号へのコールを開始します。 着信コール通知は、メディア・ツールバー・アプリケーションおよびFusionアプリケーション・ウィンドウで受信します。 メディア・ツールバー・アプリケーションから、またはFusionアプリケーションから、またはSoftphoneアプリケーションからコールを受け入れることができます。 コールを受け入れると、メディア・ツールバーの状態がACCEPTED状態に変わり、エンゲージメントがFusionアプリケーションで開きます。 通話は、メディア・ツールバー・アプリケーションから、またはFusionアプリケーションから、またはソフト・フォンから切断できます。 コールを切断すると、メディア・ツールバーの状態がDISCONNECTED状態に変更されます。