【企业微信】同企业微信 数据对接 问题汇总


5/22/2019 企业微信

背景:部门的核心产品(下文中 部门的产品 均用核心产品代替) 为 to B的 平台性产品,需要和 企业微信进行 组织架构 和 人员信息的对接,数据源 以企业微信数据为准。 对接标准:接入场景 为 企业内部开发(😰 平台性的产品为啥子 不选择 第三方应用开发,建议过boss,boss 意见 先选择简单的方案进行实现...) 涉及项目:企业微信、核心产品、对接服务、对接公司OA

对接方案

  1. 第一次全量数据对比同步(对于存量公司(在 企业微信 或 核心产品 已存在 数据的公司),需要全量对比双方数据,变更 核心产品数据,同时保存 相应关系)
  2. 第一次对接完成后,企业微信 若发生信息变更,核心产品 同步变更对应数据(无需再次进行全量对比,降低性能消耗),瞬时同步

花式趟雷集锦

父子科室依赖问题

问题:第一次对接,企业微信组织架构存在 父子科室 依赖关系,先增加 父科室,然后增加 子科室,否则存在依赖问题

解决方案:对接数据之前,需要将 从企业微信获取的 科室信息进行广度优先遍历排序,默认顺序可能存在问题

        private void sort(List<Department> departments, List<Department> sortDepartments, List<Long> parentDepartmentIds) {
            List<Department> childs = departments.stream().filter(department -> parentDepartmentIds.contains(department.getParentid())).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(childs)) {
                return;
            }
            sortDepartments.addAll(childs);
            List<Long> childIds = childs.stream().map(Department::getId).collect(Collectors.toList());
            sort(departments, sortDepartments, childIds);
        }
1
2
3
4
5
6
7
8
9

熔断机制导致同步异常

对应一个公司,第一次同步仅 执行一次操作,但实际效果 执行了 两次,导致 同步数据出现问题 (本地环境完全ok,但测试环境 存在问题)

   经分析发现,是因为阿里云熔断机制导致的这个问题(测试环境和生成环境使用 阿里云服务器),阿里云 熔断机制默认 60s,60s后 请求终端,但是 公司配置的策略 超时后 默认重试一次,所以导致 存在两个 同步线程同时存在,
   对接进行的数据修改 是批量进行,就可能存在 A 线程 分析数据,哪些数据 进行 add、update、delete,但是 尚未 真正落库,B 线程 进入,查询到的 核心产品的数据 还是 A 线程查询的数据集(批量操作 是 为了降低性能消耗 已经减少 数据库连接数)

解决方案:第一次同步开始后,记录 已经进行了第一次同步,持久化到数据库,同步之前进行判断,若已经进行了第一次同步,禁止再次进行第一次同步

秘钥长度问题限制

问题:默认JDK中的加密库对密钥长度限制在128位以下,所以无法使用128位以上的密钥,企业微信 同步 秘钥超过默认超度,数据解密异常:java.security.InvalidKeyException: Illegal key size

解决方案:JDK 官网下载 加解密扩展包,具体谷歌一堆解决方案

企业微信通讯录文件导入 导致的依赖问题

前提:进行顺序同步,用到企业微信的 回调配置,需要在企业微信 设置 对应的 通讯录同步事件接收服务器 问题:瞬时同步阶段,在企业微信 进行 通讯录文件导入(企业微信此功能 可以批量 新增、修改 用户以及部门信息),但是 企业微信 通过事件接收服务器 向第三方服务器 发送的事件包含:create_user、update_user、delete_user、create_party、update_party、delete_party,此事件操作数据均为单个,即 单个 新增、修改、删除 用户 or 部门。 但是 向 第三方服务器发送事件的顺序不定,列:新增两个用户,分别属于A部门、B部门,并且 B 部门属于A 部门,企业微信 同步过来的顺序 可能是:新增用户、新增B 科室、新增A科室, 就会存在 依赖问题。 解决方案:

  • 变更的数据 依赖条件在 核心产品数据不存在(企业微信 还没有同步过来),这时候 先 将数据 持久化到 对接服务,若 依赖条件均满足,则 同步到 核心产品服务,同时 查询 依赖 此条件的 其他 暂存到 对接服务未持久化 到 核心产品的数据,再次进行同步(缺点:每次接收到 企业微信 的变更事件处理完成后,都需要查询 依赖其的数据,并进行再次同步,最差的结果:同步顺序 为 叶子节点--> 根节点,可能最后一次同步 根节点数据是 需要 同步所有的叶子节点数据)
  • 变更数据依赖条件不存在,访问 企业微信 api 查询依赖数据,若存在依赖链,递归新增其依赖数据,直到满足 所有依赖条件,持久化变更数据

企业微信通讯录事件接收服务器仅允许设置一个

问题:有客户 已经 将自己的 OA 系统和企业微信进行了数据对接,配置好了事件接收服务器,故而没办法 进一步配置核心产品作为 事件接收服务器 解决方案:😂暂无,已联系企业微信,企业微信回复 已建立需求 进行解决该问题,后续跟进。


popo先生的博客