# CRM对接

# 上报用户信息

七鱼 SDK 允许 App 的用户以匿名方式向客户咨询,但如果 App 希望客服知道咨询的用户的身份信息,可以通过 SDK 提供的 setUserInfo 接口告诉给客服。 该接口包含两个功能:

  1. 关联用户账户。调用过该接口后,客服即可知道当前用户是谁,并可以调看该用户之前发生过的访问记录。通过该接口,SDK还会把 App 端相同用户 ID 的咨询记录整合在一起。如果调用 setUserInfo 接口前是匿名状态,那么匿名状态下的聊天记录也会被整合到新设置的这个用户下面。

注意,该接口调用的时机应该是在接入方 App 登录的时候,不应该在进入客服界面之前去调用该方法

  1. 提供用户的详细资料。通过设置参数 YSFUserInfo 的 data 字段, App 能把用户的详细信息告诉给客服,这些信息会显示在客服会话窗口的用户信息栏中。该字段具有很强的可扩展性,具体请见本节后面的描述。

为了区分不同的 App 用户,当 App 端用户注销后,需要先调用 Unicorn.logout()告诉 SDK,SDK 此时会关闭前一个用户的聊天记录,并重新分配一个新的聊天账号,以和之前的用户区分。

注意,该接口不允许直接从一个账号切换到另外一个账号。该方法是用于 SDK 登录用的,所以希望接入方在 App 登录的时候调用该方法。在 V4.10.0 版本,我们将此方法改为了 Http 请求,所以如果您需要在进入客服界面之前调用该方法,请等待该方法调用成功再去进入客服界面,也就是使用带有 callback 的 setUserInfo 方法

访客信息为一个 Json 数组,该数组中的 item 目前可包含以下字段:

  • key:数据项的名称,用于区别不同的数据。
  • index:用于排序,显示数据时数据项按index值升序排列;不设定index的数据项将排在后面;index相同或未设定的数据项将按照其在 JSON 中出现的顺序排列。
  • label:该项数据显示的名称。
  • value:该数据显示的值,类型不做限定,根据实际需要进行设定。
  • href:超链接地址。若指定该值,则该项数据将显示为超链接样式,点击后跳转到其值所指定的 URL 地址。
  • hidden:是否隐藏该item。目前仅对mobile和email有效。
  • isCustomField:是否属于自定义字段。如果是,则尝试匹配自定义字段名称并更新值,目前只支持 文本、数字、时间(13位数字时间戳)、单选、多选(用 ### 分割选中值,其中###前后都有空格)。

现在,以下4个key由七鱼使用,他们的排序和标签名是固定的,不能指定index和label。

  • real_name:用户姓名。
  • mobile_phone:用户手机号,可以隐藏。
  • email:用户的邮箱账号,可以隐藏。
  • avatar:用户的头像,可以在客服端显示。访客端的用户头像不会使用该字段。

设置访客信息的示例如下:

YSFUserInfo userInfo = new YSFUserInfo();
// App 的用户 ID
userInfo.userId = "uid";
// 当且仅当开发者在管理后台开启了 authToken 校验功能时,该字段才有效
userInfo.authToken = "auth-token-from-user-server";
// CRM 扩展字段
userInfo.data="[
    {"key":"real_name", "value":"土豪"},
    {"key":"mobile_phone", "hidden":true, "value":"13800000000"},
    {"key":"email", "value":"13800000000@163.com"},
    {"key":"avatar", "value": "https://qiyukf.com/def_avatar.png"},
    {"index":0, "key":"account", "label":"账号", "value":"zhangsan" , "href":"http://example.domain/user/zhangsan"},
    {"index":1, "key":"sex", "label":"性别", "value":"先生"},
    {"index":5, "key":"reg_date", "label":"注册日期", "value":"2015-11-16"},
    {"index":6, "key":"last_login", "label":"上次登录时间", "value":"2015-12-22 15:38:54"}
]";
Unicorn.setUserInfo(userInfo);

注意: 如果一定要在进入客服之前调用 setUserInfo 方法,那么需要使用带有 callback 的 setUserInfo 接口,并在 onSuccess 中进入客服界面,例如:

YSFUserInfo userInfo = new YSFUserInfo();
// App 的用户 ID
userInfo.userId = "uid";
// 当且仅当开发者在管理后台开启了 authToken 校验功能时,该字段才有效
userInfo.authToken = "auth-token-from-user-server";
// CRM 扩展字段
userInfo.data="[
    {"key":"real_name", "value":"土豪"},
    {"key":"mobile_phone", "hidden":true, "value":"13800000000"},
    {"key":"email", "value":"13800000000@163.com"},
    {"key":"avatar", "value": "https://qiyukf.com/def_avatar.png"},
    {"index":0, "key":"account", "label":"账号", "value":"zhangsan" , "href":"http://example.domain/user/zhangsan"},
    {"index":1, "key":"sex", "label":"性别", "value":"先生"},
    {"index":5, "key":"reg_date", "label":"注册日期", "value":"2015-11-16"},
    {"index":6, "key":"last_login", "label":"上次登录时间", "value":"2015-12-22 15:38:54"}
]";

Unicorn.setUserInfo(userInfo, new RequestCallback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Unicorn.openServiceActivity(this, "七鱼客服", null);
            }
            @Override
            public void onFailed(int errorCode) {
            
            }
            @Override
            public void onException(Throwable throwable) {
            
            }
        });

上述方法返回错误码说明:

errorCode 原因
310 登录IP或MAC被禁
315 内部帐户不允许在该地址登陆
403 用户被封禁
408 操作超时
414 参数错误
415 网络连接出现问题
701 设置 UserInfo id 为 null
702 没有退出上一个 user 就直接调用了 setUserInfo
703 使用融合 SDK 没有先登录云信
1001 appkey不存在
1002 deviceId错误
1003 其他错误
1004 authToken校验错误

# 注销用户

如前所述,当关联的用户从 App 注销后,也应当调用 SDK 的注销接口 Unicorn.logout()。这样,注销之后,客服再给前面用户发送消息,将进入留言,等到该用户下次再在同一台设备上登录后,能够再看到。如果 App 的用户注销后,不调用七鱼的 logout 接口,七鱼不知道用户已经变更,那么客服如果给前面一个用户发起会话,发送消息,当前设备将仍旧能够收到消息,造成混乱。

Unicorn.logout() 接口等效于 Unicorn.setUserInfo(null)

注意:目前不支持跨设备的消息漫游,在其他设备上通过 setUserInfo(YSFUserInfo) 设置相同的用户, 这个设备上不能收到留言。