Genesysで発信コールを行う
次のフロー図は、エージェントがFusionアプリケーションからアウトバウンド・コールを開始した後に実行される一連の操作を示しています:
次のフロー図は、エージェントがFusionアプリケーションからアウトバウンド・コールを開始した後に実行される一連の操作を示しています:
- エージェントが電話番号をクリックしてFusionアプリケーションからアウトバウンド・コールを開始すると、
onOutgoingEvent
イベントが起動されます。 - メディア・ツールバー・アプリケーションの
onOutgoingEvent
イベント・リスナーは、このイベントを受信し、アウトバウンド・コールを開始するようにマイクロサービスに通知します。 - マイクロサービスは、
PSDK
を使用してコールを行うためのリクエストを作成してコールを開始します。 - リクエストが成功すると、
EventRinging
イベントがGenesysから起動され、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。 RequestMakeCall
リクエストが成功すると、EventRinging
メッセージがGenesysからマイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。EventEstablished
メッセージがメディア・ツールバー・アプリケーションによって受信されると、newCommEvent
アクションによってFusionアプリケーションが通知されます。- Fusionアプリケーションは、
newCommEvent
アクションの受信時にダイヤル・パネルを表示します。
エージェントはFusionアプリケーションからアウトバウンド・コールを開始
エージェントは、電話番号をクリックしてFusionアプリケーションからアウトバウンド・コールを開始し、onOutgoingEvent
イベントを起動します。
ジェネシスにコールを開始するよう通知
メディア・ツールバー・アプリケーションのonOutgoingEvent
イベント・リスナーは、このイベントを受信し、アウトバウンド・コールを開始するようにマイクロサービスに通知します。 次の例に示すように、makeOutboundCall
ファンクションを更新して、コールを開始するようにマイクロサービスに通知できます:
public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "makeCall",
"toNumber": phoneNumber,
"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
を使用して、com.genesyslab.platform.voice.protocol.tserver.requests.party.RequestMakeCall
リクエスト・クラスを使用してコールを行うためのリクエストを作成します。 リクエストが成功すると、EventRinging
メッセージが受信され、顧客が応答すると、EventEstablished
メッセージがマイクロサービスによって受信されます。
マイクロサービスはEventRingingメッセージを受信
アウトバウンド・コールを開始するリクエストが成功すると、GenesysサーバーはEventRinging
メッセージで応答し、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播します。
メディア・ツールバー・アプリケーションからnewCommEventをコール
マイクロサービスからEventRinging
メッセージを受信したら、次の例に示すように、integrationEventsHandler.ts
ファイルの関数incomingCallHandler
を実行して、newCommEvent
アクションをコールできます:
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");
}
Fusionアプリケーションは、ダイヤル・パネルを表示
newCommEvent
アクションを受信すると、Fusionアプリケーションによってダイヤル通知が表示されます。
完全なコード
アウトバウンド・コールを開始するための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> {
const headers: Headers = (new Headers()) as Headers;
headers.set('Content-type', 'application/json');
const message: any = {
"type": "makeCall",
"toNumber": phoneNumber,
"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 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アプリケーションから担当者を開き、発信コールを開始する電話番号をクリックします。