通讯录与联系方式
从成员目录查询可用联系方式,区分个人联系人、渠道实例和群聊通讯录,并交给对应消息能力发送。
“发给某位同事”首先是联系人解析。通讯录负责说明这个人可以通过哪些方式联系,渠道会话负责具体投递位置。
查询个人联系方式
- 使用工作区管理模块的
listWorkspaceMembers({})确定目标成员。 - 读取
listContactMethods的定义。当前方法接受整数userId和可选字符串medium。 - 用目标成员的真实
userId查询;只需要企业微信时,可将medium设为qiwei。 - 读取返回的
medium、identityType、identityValue,按其合同解析联系方式。零结果表示没有查到,多个结果需要明确选择。
medium 是联系方式分类或该合同返回的通道值,不能直接当作所有渠道方法的 channel。
identityValue 的含义由 identityType 决定,不能无条件当作 sessionKey、平台用户 ID 或渠道实例 ID。
通知员工
工作区管理模块提供两个入口,内容都采用 Content Parts 非空有序数组:
| 方法 | 收件人参数 | 选择规则 |
|---|---|---|
notifyEmployee | targetUserId:工作区员工的平台用户 ID | 系统选择一个启用的渠道绑定联系方式 |
sendContactMessage | id:联系方式记录 ID | 仅使用指定的联系方式 |
两个入口都接受必填的 content、category、urgency,以及可选 eventId:
{
"targetUserId": 42,
"content": [
{ "type": "text", "text": "有一条客户预约需要你处理。" }
],
"category": "workflow.reply",
"urgency": "high"
}示例用于 notifyEmployee,请把 targetUserId 换成成员目录返回的真实 ID。使用 sendContactMessage 时,
把收件人字段换为目录返回的联系方式 id。不要同时指定两者,也不要传入旧 message 字段或对象形态的 content。
category 是非空业务类别;urgency 为 low、normal、high、critical 之一,两者独立于内容。
每项内容由自己的 type 指明 text、image、audio、video 或 file,不需要外层 msg_type。
当前类别和紧急程度会传递给渠道适配器,不改变默认选路,也不保证渠道已支持加急提醒。
工作流调用模块时不需要填写 workspaceId、channel 或 sessionKey。模块注入工作区上下文,
由员工联系方式 owner 核对操作者权限和目标成员状态,再通过 Channel Gateway 投递。
直接使用 owner HTTP 接口时仍必须提供工作区上下文:员工可以属于多个工作区,不能只靠用户 ID 推断。
默认通知按已有联系方式的 priority 从小到大选择,同优先级按记录 ID 从小到大,只使用一个启用的渠道绑定。
没有可用方式、会话无效或发送失败时显式返回结果,不自动换渠道重发。本人可向自己发送;向其他员工发送要求工作区管理权限。
响应包含实际 contactMethodId、targetUserId、channel、sessionKey、delivered、category 和 urgency。
以 CModel 的 errorCode 和回执 delivered 判断结果;HTTP 200 或记录了待办不能当作消息已送达。
eventId 只用于消息关联,本接口没有通知队列或幂等重试承诺。
企业微信等渠道仍需先建立真实个人会话并绑定员工。新增通讯录条目不会自动创建外部会话。
群聊通讯录
群聊是独立联系目标,不能把群内某个成员当作整个群聊的身份。
listGroupChatContacts({})查询工作区已绑定群聊。- 有明确目标时,使用返回的
contactId;sendGroupChatMessage的对应参数名为id,准确类型以方法定义为准。 - 没有绑定记录时,先在目标渠道查询实际群聊候选,再通过公开绑定流程建立群聊通讯录;不要猜测群 ID。
- 个人通知选择私聊。发送到群聊会让群成员看到内容,应在业务上明确指定。
群聊发送与个人外部会话发送的 content 参数不一定采用相同结构,不能复制另一方法的参数形状。
生命周期
成员离职、外部账号解绑、机器人停用或群聊绑定变化后,旧联系方式可能不再可用。 业务配置保存稳定引用,发送前让能力所有者核验有效性;不要维护一套永久有效的联系人快照,也不要在发送失败后自动扩大收件范围。