Published at: 2025-10-30

Call Center Integration - Universal Connector


I. Initializing the Call Center in ShareCRM

Call Center plugin configuration path: Admin > Business Plugin Management > Call Center

  • After tenant initialization is complete, the following changes will occur:
    ① A new Role named “Call Center Agent” will be added under Admin > Role & Permission Management > Business Function Permissions > Role Permission Settings
    ② A new preset object “Call Log” will be created in CRM

II. Plugin Configuration

First, select the Service Provider as: [New Vendor Integration] and enter the vendor name.

picture coming soon:

To ensure proper system integration, complete the following steps:

Step 1: Parameter Configuration
Step 2: Callback Function Configuration
Step 3: Outbound Call Function Configuration
Step 4: Phone Bar Plugin Integration (This step can be skipped if phone bar integration is not required)

III. Function Configuration Guidelines

3.1 URL Specifications

Replace placeholder values in the URLs according to different scenarios:

POST Requests:
Without string:
https://www.fxiaoke.com/open/callcenter/common/handle/pushData/{fsEa}/{eventType}/{callType}

With string:
https://www.fxiaoke.com/open/callcenter/common/handle/pushData/string/{fsEa}/{eventType}/{callType}

GET Requests:
Without string:
https://www.fxiaoke.com/open/callcenter/common/handle/pushData/get/{fsEa}/{eventType}/{callType}

With string:
https://www.fxiaoke.com/open/callcenter/common/handle/pushData/get/string/{fsEa}/{eventType}/{callType}

3.1.1 URL Placeholder Specifications

  • {fsEa}: Enterprise ID (required)

  • {eventType}: Event type corresponding to the URL

  • {callType}: Call type (in: inbound, out: outbound; optional)

3.1.2 Difference Between URLs With and Without “string”

  • With string: Returns a string value, typically used for third-party system pop-up screens. In most cases, the URL without “string” is sufficient.

picture coming soon:

  • Without string: Returns a standard format response.

json // errorCode=0 indicates success // data.eventType represents the event type, and result contains the function execution return value { "errorCode": 0, "errorMessage": "Success", "data": { "eventType": "popThird", "result": "https://www.fxiaoke.com/open/cc/?code=2010&msg=Current%20user%20is%20not%20activated%20in%20ShareCRM.%20Please%20contact%20the%20system%20administrator%20to%20bind%20the%20account%20in%20ShareCRM%20CRM%20Admin%20>%20Plugins%20>%20Call%20Center%20Configuration." }, "traceMsg": "callcenter-provider Server: 10.124.68.61, env: fstest-gray, traceId: fs-eservice-gray/639c1d0239fcbd0001695d52" }

3.2 Callback Function Specifications

When a vendor requests a configured URL, the linked callback function will be triggered. The passed data parameters and eventType value will be transparently transmitted to the function. Custom business logic can be implemented based on the eventType value and received parameters.

IV. Function Configuration Tutorial

Callback and outbound call functions share the same configuration.

Return Type: Map
Bound Object: Call Log

picture coming soon:

Fixed Parameters Received by Functions

picture coming soon:

Callback Function Parameters:
- Type: String | Name: eventType | Description: Event type configured in the URL
- Type: Map | Name: externalDataMap | Description: Parameters passed from the interface request

The fields in externalDataMap depend on the parameters passed by the vendor’s request interface.

Outbound Call Function Parameters:
- Type: Map | Name: externalDataMap | Description: Parameters passed from the interface request

json Outbound call function externalDataMap fields: { "callOutApiName": "AccountObj", // API name of the called object "callOutDataId": "629ddf6484d613000131686d", // Data ID of the called object "customerNum": "18390940098" // Phone number to call }

Outbound Call Function Template

```groovy 
/**
* @codeName Call Center Outbound Call Function Template
*/
// Retrieve values from externalDataMap: [callOutApiName, callOutDataId, customerNum]
Fx.log.info(“Request parameters received: “ + externalDataMap);
// Get the enterprise configuration and current user’s agent information
String methodName = “queryBindInfo”;
// Agent ID
Map args = [“seatId”: “2002”];
// Unified API call template
def ret = Fx.proxy.callAPI(“eservice.proxy”, [“x-fs-methodname”: methodName, “Content-Type”: “application/json;charset=UTF-8”], [“args”: args]);
HttpResult result = ret.data as HttpResult;
Map map = result.content as Map;
Fx.log.info(“Enterprise and agent binding info: “ + map);
Fx.log.info(“Outbound call request start”);
/**
* Implement outbound call logic based on vendor documentation, using the binding info above
*/
Fx.log.info(“Outbound call request end”);
// Return an empty result
Map resultMap = [:];
return resultMap;
```

Callback Function Template

```groovy 
/**
* @codeName Call Center Callback Function Template
*/
// eventType from the URL placeholder
Fx.log.info(“Event type received: “ + eventType);
Fx.log.info(“Request parameters received: “ + externalDataMap);
Map resultMap = [:];
/**
* Implement logic based on eventType. Use the unified API call template with different methodName and args.
*/
// (1) Query enterprise configuration and agent binding info
String methodName = “queryBindInfo”;
// seatId: If provided, query agent binding data by seatId; otherwise, query by current userId
Map args = [“seatId”: “2002”];
// Unified API call template
def ret = Fx.proxy.callAPI(“eservice.proxy”, [“x-fs-methodname”: methodName, “Content-Type”: “application/json;charset=UTF-8”], [“args”: args]);
HttpResult result = ret.data as HttpResult;
Map map = result.content as Map;
// (2) Return a pop-up URL for third-party systems
// String methodName = “getPopWindowUrl”;
// seatId: Agent ID | customerNum: Customer phone number
// Map args = [“seatId”: “2002”, “customerNum”: “18390940098”];
// ** Use the unified API call template and assemble the map result **
// resultMap = [“url”: (map.data as Map).url];
// To enable direct redirection, add the newCallCenterAction field:
// resultMap = [“url”: (map.data as Map).url, “newCallCenterAction”: “redirect”];
// Fx.log.info(“Pop-up URL: “ + resultMap);
// (3) Display pop-up in ShareCRM (agent console pop-up) - typically triggered during ringing
// String methodName = “popWorkbench”;
// seatId: Agent ID | customerNum: Customer phone number | callId: Call log ID | callType: in (inbound) or out (outbound)
// Map args = [“seatId”: “2002”, “customerNum”: “18390940098”, “callId”: “medias_3-1671505262.109912”, “callType”: “in”];
// (4) Hide the pop-up - typically triggered during hang-up (must be called after step 3)
// String methodName = “hangupHandle”;
// callId must match the callId from step 3
// isDealing: true (answered) or false (unanswered) - updates the agent console’s answer status icon
// Map args = [“callId”: “medias_3-1671505262.109912”, “isDealing”: true];
return resultMap;
```

V. Provided Function Interfaces

Query Enterprise and Agent Binding Information

```groovy 
// Method name
String methodName = “queryBindInfo”;
Map args = [“seatId”: “2002”]; // If seatId is provided, query by seatId; otherwise, query by current userId
def ret = Fx.proxy.callAPI(“eservice.proxy”, [“x-fs-methodname”: methodName, “Content-Type”: “application/json;charset=UTF-8”], [“args”: args]);
HttpResult result = ret.data as HttpResult;
Map map = result.content as Map;
Fx.log.info(“Enterprise and agent binding info: “ + map);
// Response format: tenantInfo and paramMappings are enterprise-level data; userInfo is user-level (returned if args are provided)
{
“errorCode”: 0,
“errorMessage”: “Success”,
“data”: {
“tenantInfo”: { // Enterprise binding configuration
“name”: “New Vendor Name”
},
“paramMappings”: [ // Parameter configuration
{
“name”: “account”,
“apiName”: “account”,
“value”: “N000000004037”
}
],
“userInfo”: { // Agent binding info
“seatId”: “2002”, // Third-party agent ID
“userId”: 1000 // User ID
}
}
}
```

Agent Console Pop-Up (Triggered During Ringing)

groovy String methodName = "popWorkbench"; // seatId: Agent ID | customerNum: Customer phone number | callId: Call log ID | callType: in or out Map args = ["seatId": "2002", "customerNum": "18390940098", "callId": "medias_3-1671505262.109912", "callType": "in"]; def ret = Fx.proxy.callAPI("eservice.proxy", ["x-fs-methodname": methodName, "Content-Type": "application/json;charset=UTF-8"], ["args": args]); HttpResult result = ret.data as HttpResult; Fx.log.info("Pop-up: " + result); return resultMap;

Hide Pop-Up and Update Answer Status (Must Be Called After “popWorkbench”)

groovy String methodName = "hangupHandle"; // callId: Must match the callId from popWorkbench // isDealing: true (answered) or false (unanswered) Map args = ["callId": "medias_3-1671505262.109912", "isDealing": true]; def ret = Fx.proxy.callAPI("eservice.proxy", ["x-fs-methodname": methodName, "Content-Type": "application/json;charset=UTF-8"], ["args": args]); HttpResult result = ret.data as HttpResult; Fx.log.info("Hide pop-up: " + result); return resultMap;

Upload Recording File (Triggered During Hang-Up)

groovy String methodName = "uploadRecordFile"; // fileUrl: Recording file download URL Map args = ["fileUrl": "https://api-sh.clink.cn/download_record_file?AccessKeyId=5df4fac362a47ab3600b19110a163bd9&AccessKeySecret=365pLLP37M8BrF73ew2x&Expires=43200&Timestamp=2023-02-14T09%3A55%3A28Z&mainUniqueId=medias_4-1676285723.113456&Signature=hTKxIz43fKZ965fh88O%2BRybpD%2Fw%3D"]; def ret = Fx.proxy.callAPI("eservice.proxy", ["x-fs-methodname": methodName, "Content-Type": "application/json;charset=UTF-8"], ["args": args]); HttpResult result = ret.data as HttpResult; Map map = result.content as Map; // fileUrl: Recording file URL after upload to ShareCRM Fx.log.info("File URL: " + (map.data as Map).fileUrl);

Third-Party System Pop-Up

groovy String methodName = "getPopWindowUrl"; // seatId: Agent ID | customerNum: Customer phone number Map args = ["seatId": "2002", "customerNum": "18390940098"]; def ret = Fx.proxy.callAPI("eservice.proxy", ["x-fs-methodname": methodName, "Content-Type": "application/json;charset=UTF-8"], ["args": args]); HttpResult result = ret.data as HttpResult; Map map = result.content as Map; Map resultMap = ["url": (map.data as Map).url]; Fx.log.info("Pop-up URL: " + resultMap); return resultMap;

Phone Bar Component Template

Navigate to: System Settings > Custom Development Platform > Custom Components > New

picture coming soon:

picture coming soon:

picture coming soon:

VI. Account Binding

Account binding links CRM and Call Center users, enabling shared capabilities. The binding process is as follows:

① Select a ShareCRM employee (must have the “Call Center Agent” Role)
② Enter the third-party agent ID

picture coming soon:

picture coming soon:

VII. Business Settings

Configure agent settings in ShareCRM Admin:

Pop-Up List Configuration: Displays a list of Accounts or Contacts when a phone number matches multiple records.
Custom Pop-Up Field Matching: Specify which fields to use for caller identification and set pop-up priority.
Quick Create Options: Configures quick-create entries for unrecognized inbound calls.
Agent Answer Priority: Returns specific parameters to the Call Center for voice navigation (without syncing CRM data).
Temporary Data Permissions: Grants agents temporary access to business data.

picture coming soon:

picture coming soon:

Outbound Call Settings:

picture coming soon:

VIII. One-Click Outbound Call

Enable agents to initiate calls directly from CRM by configuring the following:

For Preset Objects (Account, Leads, Contact):

  1. Add a custom button with the API name button_e_call_out__c to these objects.

  2. Configure the outbound call field in Outbound Settings.

![image](https://saas.bk-cdn01.com/t

Submit Feedback