最近做的企微二开,公司有 CRM、OA、工单多个业务系统,每个系统有自己的用户 ID。企微也有 uin、appid 这些标识。怎么把这些 ID 关联起来,让企微的员工在业务系统里能识别、业务系统的用户在企微里能找到,就是统一身份体系要解决的问题。这篇重点讲调哪些企微接口拿身份数据、怎么和业务系统 ID 映射。
底层用的是Eyun 平台开放的企微 API,统一 POST+JSON,鉴权用 App Token 加 appid,响应封套{code, data, detail, message, time},code 为 0 成功。
企微侧的身份标识
企微接口里有几个关键身份标识:
appid:企微实例 ID,每个企微账号一个uin:企微账号身份,员工和客户都有 uinconversationId:会话 ID,单聊是 uin,群聊是 roomId
业务系统侧有自己的用户 ID(如员工工号、客户编号)。统一身份体系就是建立企微标识和业务系统 ID 的映射关系。
拉员工列表:调通讯录接口
要建立映射,先从企微拉员工列表。调联系人模块:
import requests BASE = "https://api.eyun.com" HEADERS = {"Authorization": "Bearer eyk_xxxx", "Content-Type": "application/json"} def get_staff_list(appid): resp = requests.post( f"{BASE}/wx-api/api/contact/getUserList", headers=HEADERS, json={"appid": appid} ) return resp.json()["data"]["list"]返回每个员工的 uin、昵称、手机号、邮箱、部门。这些字段用来和业务系统匹配。
查员工详情:getUserProfileDetail
拉到列表后,逐个查详情拿更多字段(工号、职位、直属上级):
def get_staff_detail(appid, uin): resp = requests.post( f"{BASE}/wx-api/api/contact/getUserProfileDetail", headers=HEADERS, json={"appid": appid, "uin": uin} ) data = resp.json()["data"] return { "uin": uin, "name": data["nickName"], "mobile": data.get("mobile", ""), "email": data.get("email", ""), "position": data.get("position", ""), "department": data.get("department", ""), "direct_manager": data.get("managerUin", "") }手机号和邮箱是匹配业务系统的关键字段——大部分业务系统用手机号或邮箱做用户标识。
建立映射表:uin ↔ 业务ID
拉到员工数据后,和业务系统用户表匹配,建立映射:
identity_mapping 表: id uin 企微uin appid 企微实例ID biz_system 业务系统(crm/oa/ticket) biz_user_id 业务系统用户ID match_field 匹配字段(mobile/email) match_value 匹配值 created_at匹配逻辑:优先用工号匹配(最准),工号没有用手机号,手机号没有用邮箱。匹配成功的存映射表,匹配失败的标记待人工确认。
客户身份映射
客户也需要映射。客户在企微有 uin,在 CRM 有客户编号。客户加好友时通过 Webhook 回调拿到 uin,调接口查客户详情:
def get_customer_detail(appid, uin): resp = requests.post( f"{BASE}/wx-api/api/contact/getUserProfileDetail", headers=HEADERS, json={"appid": appid, "uin": uin} ) data = resp.json()["data"] return { "uin": uin, "name": data.get("nickName", ""), "mobile": data.get("mobile", ""), "corp_name": data.get("corpName", "") }用手机号在 CRM 查客户编号,建立 uin ↔ 客户编号的映射。客户在企微发消息,后端通过 uin 查映射表找到 CRM 客户编号,调 CRM 接口拿客户信息。
映射的使用:跨系统调用
有了映射表,跨系统调用就通了:
def get_customer_orders(appid, customer_uin): # 1. 查映射表,uin → CRM客户编号 mapping = identity_mapping.find(uin=customer_uin, biz_system="crm") if not mapping: return None # 2. 调CRM接口拿订单 return crm_api.get_orders(mapping.biz_user_id)企微侧只用 uin,业务系统侧只用业务 ID,中间靠映射表转换。两边互不耦合。
映射的同步:员工离职调岗
员工离职、调岗,映射要更新。定时同步企微员工列表,对比映射表:
企微有但映射表没有:新员工,建立映射
映射表有但企微没有:离职,标记失效
部门/职位变了:更新映射
同步每天跑一次,保证映射和企微一致。不同步,离职员工还能调业务接口,安全出事。
写在最后
统一身份体系这套东西,本质是用好企微的通讯录接口——getUserList 拉员工、getUserProfileDetail 查详情,用手机号/邮箱/工号和业务系统匹配,建立 uin ↔ 业务 ID 的映射表。映射建扎实,企微和业务系统的身份打通,跨系统调用不用再手动对 ID。