CRM 对接
上报用户信息
本节说明如何将访客身份和 CRM 扩展信息上报给七鱼客服系统。
上报用户信息
方法描述
七鱼 SDK 允许 App 的用户以匿名方式向客户咨询;如果 App 希望客服识别当前用户,可以通过 Unicorn.setUserInfo() 上报访客信息。
注意:
- 在调用该方法前,一定要调用Unicorn.initSdk()方法。
- setUserInfo是一个异步方法,如需在打开客服界面前上报用户信息,请参考在回调中打开客服界面。
- 用户信息为可选项,七鱼对相关字段内容不做强制要求,使用方需依法依规处理客户数据。
- 关联用户账户。调用过该接口后,客服即可知道当前用户是谁,并可以调看该用户之前发生过的访问记录。通过该接口,SDK还会把 App 端相同用户 ID 的咨询记录整合在一起。如果调用 setUserInfo 接口前是匿名状态,那么匿名状态下的聊天记录也会被整合到新设置的这个用户下面。
- 提供用户的详细资料。通过设置
YSFUserInfo的 data 字段,App 能把用户的详细信息告诉给客服,这些信息会显示在客服会话窗口的用户信息栏中。该字段具有很强的可扩展性,具体请见本节后面的描述。
方法说明
public static boolean setUserInfo(YSFUserInfo userInfo)YSFUserInfo
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | String | 是 | 用户在企业产品中的标识,便于后续客服系统中查看该用户在产品中的相关信息 。若要指定用户信息,不显示默认的(guestxxx用户姓名),就必须传userId |
| authToken | String | 否 | 用户认证,参考服务端校验 token |
| data | String | 否 | 用户在企业中的其他详细信息,JSON数据格式 |
data字段
data访客信息为一个 Json 数组,该数组中的 item 目前可包含以下字段
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 数据项的名称,用于区别不同的数据。其中real_name、mobile_phone、email为保留字段,分别对应客服工作台用户信息中的“姓名”、“手机”、“邮箱”这三项数据。保留关键字对应的数据项中,index、label属性将无效,其显示顺序及名称由网易七鱼系统指定 |
| value | Object | 是 | 该数据显示的值,类型不做限定,根据实际需要进行设定 |
| label | String | 否 | 该项数据显示的名称,key 如果是以上保留字段的时候 label 不生效,其他场景建议填写 label 字段 |
| index | int | 否 | 用于排序,显示数据时数据项按index值升序排列;不设定index的数据项将排在后面;index相同或未设定的数据项将按照其在 JSON 中出现的顺序排列 |
| href | String | 否 | 超链接地址。若指定该值,则该项数据将显示为超链接样式,点击后跳转到其值所指定的 URL 地址 |
| hidden | boolean | 否 | 仅对mobile_phone、email两个保留字段有效,表示是否隐藏对应的数据项,true为隐藏,false为不隐藏。若不指定,默认为false不隐藏 |
| isCustomField | boolean | 否 | 是否属于自定义字段。如果是,则尝试匹配自定义字段名称并更新值,目前只支持 文本、数字、时间(13位数字时间戳)、单选、多选(用 ### 分割选中值,其中###前后都有空格) |
代码示例
设置访客信息的示例如下:
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"},
{"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);上报用户信息回调
建议在进入客服界面前调用上报用户信息的方法,并在callback的成功接口中打开客服界面
调用setUserInfo的重载方法
方法说明
public static boolean setUserInfo(YSFUserInfo userInfo,RequestCallback<Void> callback)RequestCallback
异步接口可通过 RequestCallback 和 RequestCallbackWrapper 两种方式设置回调函数。
| 异步接口回调函数 | 说明 |
|---|---|
| RequestCallback | 需要实现三个接口: 成功onSuccess, 失败 onFailed, 异常 onException |
| RequestCallbackWrapper | 需要实现 onResult。封装了成功、失败和异常三个接口,在参数上进行区分 |
代码示例
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) {
// 成功回调里面打开客服界面,crm信息已经上报成功
Unicorn.openServiceActivity(this, "七鱼客服", null);
}
@Override
public void onFailed(int errorCode) {
// 可以根据下表的错误码,查看错误发生原因,客户可以根据自己的情况自行处理。如:
// if(errorCode == 701) {
// Toast.makeText(this, "UserInfo id 为 null", Toast.LENGTH_SHORT).show();
// }
// 失败回调里也可以打开客服界面,只不过会随机生一个匿名的用户,以Geust开头
Unicorn.openServiceActivity(this, "七鱼客服", null);
}
@Override
public void onException(Throwable throwable) {
// 异常回调里也可以打开客服界面,只不过会随机生一个匿名的匿名的用户,以Geust开头
Unicorn.openServiceActivity(this, "七鱼客服", null);
}
});注销用户
本节说明用户退出登录或账号失效时如何清理 SDK 账号状态,避免不同用户会话混淆。
注销用户
为了区分不同的 App 用户,当 App 端用户注销后,需要调用 Unicorn.logout() 告诉 SDK。SDK 此时会关闭前一个用户的聊天记录,并重新分配一个新的聊天账号,以和之前的用户区分。注销之后,客服再给前面用户发送消息将进入留言,等到该用户下次在同一台设备上登录后才能看到。如果 App 用户注销后不调用该接口,七鱼无法感知用户已经变更,当前设备仍可能收到前一个用户的消息,造成混乱。
注意,该接口不允许直接从一个账号切换到另外一个账号,否则会报错702。
方法说明
public static void logout()注销用户信息回调
如需注销成功的回调,则可以使用logout的重载方法
方法说明
public static void logout(RequestCallback<Void> callback)RequestCallback
异步接口可通过 RequestCallback 和 RequestCallbackWrapper 两种方式设置回调函数。
| 异步接口回调函数 | 说明 |
|---|---|
| RequestCallback | 需要实现三个接口: 成功onSuccess, 失败 onFailed, 异常 onException |
| RequestCallbackWrapper | 需要实现 onResult。封装了成功、失败和异常三个接口,在参数上进行区分 |
代码示例
Unicorn.logout(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
// 登出成功
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
});切换与更新用户
本节说明用户信息更新和账号切换流程,帮助开发者正确处理登录态变化。
切换用户
若当前已调用 Unicorn.setUserInfo() 上报了用户信息,假设传入的用户 ID 为 userIdA;如需切换至账号 userIdB,应先注销当前账号,再上报新用户信息。
Unicorn.logout() 是异步操作。切换账号时应使用带回调的重载方法,并在注销成功回调中调用 Unicorn.setUserInfo();请勿连续调用两个方法或依赖固定延时,否则旧账号可能尚未清理完成,并返回错误码 702。
从 Android SDK 11.10.0 开始,可通过 Unicorn 获取当前已上报的用户 ID:
/**
* 获取当前通过 setUserInfo() 上报的用户 ID。
*
* @return 当前用户 ID;SDK 未初始化或未上报用户时返回 null
*/
@Nullable
public static String getUserId()注销成功回调触发前,getUserId() 仍可能返回原用户 ID,应以注销回调结果作为账号切换的依据。
代码示例
final YSFUserInfo newUserInfo = new YSFUserInfo();
newUserInfo.userId = "userIdB";
newUserInfo.data = "[]";
if (!Unicorn.isInit()) {
return;
}
String currentUserId = Unicorn.getUserId();
if (TextUtils.isEmpty(currentUserId)
|| TextUtils.equals(currentUserId, newUserInfo.userId)) {
// 匿名用户直接上报;userId 不变时更新用户信息
Unicorn.setUserInfo(newUserInfo);
} else {
Unicorn.logout(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
// 注销完成后再上报新用户,避免返回错误码 702
Unicorn.setUserInfo(newUserInfo);
}
@Override
public void onFailed(int code) {
// 注销失败,保留当前账号并根据错误码处理
}
@Override
public void onException(Throwable exception) {
// 注销异常,保留当前账号并处理异常
}
});
}更新用户信息
如已经上报过用户信息,想要更新用户信息,则需要保证YSFUserInfo.userId不变,只需修改YSFUserInfo.data数据,则可以更新成功。
错误码与日志
本节说明 CRM 对接相关错误码、日志提示和排查方向。
常见错误码及日志
上述方法返回错误码说明:
| 错误码 | 错误描述 |
|---|---|
| 310 | 登录IP或MAC被禁 |
| 315 | 内部帐户不允许在该地址登陆 |
| 403 | 用户被封禁 |
| 408 | 操作超时,一般是网络出现了问题,如网络波动 |
| 414 | 参数错误 |
| 415 | 网络连接出现问题 |
| 701 | 设置 UserInfo id 为 null |
| 702 | 没有退出上一个 user 就直接调用了 setUserInfo |
| 703 | 使用融合 SDK 没有先登录云信 |
| 1000 | 网络错误或者网络波动 |
| 1001 | appkey不存在 |
| 1002 | deviceId错误 |
| 1003 | 其他错误 |
| 1004 | authToken校验错误 |
当上报用户信息成功后,在会话界面看不到客户信息,并且在AndroidStudio的Logcat出现以下错误日志,则表示data字段不符合要求:
| 错误日志 | 错误描述 |
|---|---|
| CRM data is not a valid JSON array | data数据不是json数组或不符合json格式要求 |
| CRM data structure invalid: missing key or value | data数据中每个对象必须包含key和value字段,如果不是保留关键字,则必须包含label字段 |
常见问题
本节汇总开发者接入和使用过程中常见问题,并给出对应处理建议。
常见问题
Q: 调用setUserInfo()设置的用户信息无法生效
A: 请先检查自己的接入代码,是否在设置用户信息后立即打开了聊天窗口,这种情况下用户信息很可能设置失败。设置用户信息是一个异步的过程;如果需要保证用户信息设置成功,则应该在成功回调中打开聊天窗口或进行后续操作。
Q: 如果注销用户调用报错408或其他错误
A: 首先请升级SDK到9.11.1及以上版本,如果还有问题,则408报错就是网络问题导致的超时。
这篇文档有帮助吗?