请输入
菜单

呼入-IVR 导航

您可以可以根据您的业务需求确认是否要开启此功能,使用IVR导航可以帮助您提高呼入来电的服务能力,比如

  1. 工作时间段控制:可以通过 IVR 导航控制工作时间段内分配来电到坐席、工作时间外引导进入留言信箱或播放语音提示后挂机;
  2. 配置业务导航:可以通过 IVR 导航引导用户依据不同按键选择对应的业务诉求,进而转接相应坐席或坐席组进行处理

 1. 创建IVR

 

菜单:管理-自助服务 - 语音流程

步骤:

1、点击新增按钮。

2、输入IVR名称和类型(通用或者满意度调查)。

3、点击确定按钮,即可新增一个空白IVR。

2. 编辑IVR

步骤:

1、选择需要编辑的IVR,点击编辑

2、设置 IVR 导航地区语言(系统自动选择对应 TTS 能力)和时区(时间判断依据相应时区判断)

3、点击新增节点,选择需要新增的IVR节点

节点类型包括

  • 放音
  • 按键
  • 时间判断
  • 转坐席组
  • 转坐席
  • 转留言信箱

4、点击保存按钮暂存IVR流程,点击发布按钮发布IVR流程。

3. 使用IVR流程

菜单:管理-语音渠道-我的号码

步骤:

1、选择需要配置IVR的DID号码,点击设置。

2、选择呼入至:IVR流程。

3、IVR流程选择已经发布的IVR。

4、点击确定按钮,即可完成配置。

5、用户拨打该号码接通后即会进入IVR流程。

4. 常用IVR方案案例

依据工作时间处理呼入来电

功能:

  • 周内早 8 晚8工作时间内正常转接坐席组,
  • 非工作时间引导用户进入留言信箱

依据用户所需业务分配坐席

功能:

  • 客户按键 1,转接 A 坐席组进行快递查询,
  • 客户按键 2,提示暂不支持退货服务,重新进入 IVR 菜单选择
  • 客户按键 0,转接人工坐席服务
  • 客户按键错误:播放提示客户重新选择按键
  • 客户三次按键错误:提示按键错误,请稍后再次来电,并挂机

 

IVR里调用API

新建鉴权方式

操作路径:管理-第三方对接-API概览与设置-新增

选择对应加签算法,填写好SecretValue,SecretValue将会作为密钥对实际http请求进行加签;

 

IVR配置调用API节点

操作路径:管理-IVR管理-新增(编辑)- 新增节点“调用API”

选择已配置的鉴权方式,填写好对应API Request信息;(记得填写适当的最大请求超时时间)

根据响应数据来分流到不同逻辑

转坐席组:记得先将测试人员账号添加到坐席组(操作路径: 管理-坐席组管理- 编辑成员)

线路路由关联IVR流程 

操作路径:管理 - 呼叫中心设置 - 路由管理 - (已有路由)编辑

呼入触发流程

从外部呼入到线路上已绑定的号码

附:服务端加签验证工具
 package com.nx.callcenter.service.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSONObject;
import com.nx.callcenter.enums.TenantApiAuthEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author huangqueqi
 */
@Slf4j
public class ApiAuthSignUtils {


    /**
     * 生成接口参数签名demo
     */
    public static void main(String[] args) {
        // header参数
        Map<String, String> headers = new HashMap<>(8);
        headers.put("secretKey", "77ed1dda");
        headers.put("action", "test");
        headers.put("timestamp", System.currentTimeMillis()/1000 + "");

        // accessKey对应的密码
        String accessSecret = "00163e067561";

        // 业务参数
        Map<String, Object> body = new HashMap<>();
        body.put("id", 10001);
        body.put("name", "牛小信");

        System.out.println(calcSign(headers, body, accessSecret,"HMAC-MD5"));
//        System.out.println(calcSign(headers, body, accessSecret,"HMAC-SHA256"));
//        System.out.println(calcSign(headers, body, accessSecret,"HMAC-SHA512"));
//        log.info("sign: {}", sign); // sign: 87c3560d3331ae23f1021e2025722354
    }

    /**
     * 计算sign签名
     *
     * @param headers      请求头中的公共参数
     * @param body         body中的json字符串
     * @param accessSecret 秘钥
     * @param algorithmType 加密方式
     * @return
     */
    public static String calcSign(Map<String, String> headers, Map<String, Object> body,
                                  String accessSecret, String algorithmType) {
        try{
            StringBuilder raw = new StringBuilder();

            // step1: 拼接header参数
            if(CollUtil.isNotEmpty(headers)) {
                // 使用TreeMap自动按ASCII码升序排序
                Map<String, String> sortedHeaders = new TreeMap<>(headers);
                for (Map.Entry<String, String> entry : sortedHeaders.entrySet()) {
                    raw.append(entry.getKey())
                            .append("=")
                            .append(entry.getValue())
                            .append("&");
                }
                if (raw.length() > 0) {
                    raw.deleteCharAt(raw.length() - 1); // 删除末尾多余的&
                }
                log.info("step1: {}", raw); // step1: action=test&secretKey=77ed1dda&timestamp=1743413535
            }

            // step2: 拼接body参数
            if(CollUtil.isNotEmpty(body)) {
                String bodyStr = JSONObject.toJSONString(body);
                if (raw.length() > 0) {
                    raw.append("&body=").append(bodyStr); // action=test&secretKey=77ed1dda&timestamp=1743413535&body={"name":"牛小信","id":10001}
                }else{
                    raw.append(bodyStr); // {"name":"牛小信","id":10001}
                }
                log.info("step2: {}", raw); // action=test&secretKey=77ed1dda&timestamp=1743413535&body={"name":"牛小信","id":10001}
            }

            // step3: 拼接accessSecret
            raw.append("&accessSecret=").append(accessSecret);
            log.info("step3: {}", raw); // test&secretKey=77ed1dda&timestamp=1743413535&body={"name":"牛小信","id":10001}&accessSecret=00163e067561

            // step4: MD5算法加密,结果转换成十六进制小写
            String sign = null;

            if(algorithmType.equals(TenantApiAuthEnum.ALGORITHM_MD5.getName())) {
                sign = DigestUtils.md5Hex(raw.toString());
            }else if(algorithmType.equals(TenantApiAuthEnum.ALGORITHM_SHA256.getName())) {
                sign = DigestUtils.sha256Hex(raw.toString());
            }else if(algorithmType.equals(TenantApiAuthEnum.ALGORITHM_SHA512.getName())) {
                sign = DigestUtils.sha512Hex(raw.toString());
            }
            log.info("step4: algorithmType={}, sign={}", algorithmType, sign); // step4: sign=fe78d3b72cef9247e7e14add91019397

            return sign;
        }catch (Exception e){
            log.error("ApiAuthSignUtils.calcSign error",e);
        }
        return null;
    }
}
 
 

上一个
AI 应用
下一个
自动满意度邀评
最近修改: 2025-06-10