企业微信不只是一个登录入口

前面两篇写到竹润的产品咨询系统和 CRM 时,都绕不开企业微信。客户在官网提交咨询只是一个入口,后续更真实的沟通经常发生在企业微信里。如果系统只记录表单,不记录这些后续触点,客户管理就会断在最关键的地方。
所以我后来不再把企业微信集成看成“加一个登录按钮”。登录只是第一步,真正重要的是让企业微信里的身份、会话入口、外部联系人和 CRM 客户记录能对上。只有对上了,业务人员在企业微信里看到的客户,才不会和后台里的客户变成两套信息。
登录只是身份链路的开始
我做企业微信 OAuth 登录时,第一层要解决的是身份识别:用户是在企业微信 App 内打开,还是在普通浏览器里扫码登录;回调回来以后拿到的是 userid、openid,还是更细的用户票据;系统要用什么字段把企业微信身份和内部用户绑定。
这些判断看起来像认证细节,但会直接影响内部系统的可用性。
如果只是为了“能登录”,拿到一个 code 换用户信息就够了。但在 CRM 和后台管理系统里,我更关心登录后的归属关系:这个企业微信用户是不是已有系统用户,能不能通过手机号或企业微信 ID 关联,默认角色应该是什么,后续权限是不是仍然由系统里的组织结构控制。
我当时的做法是让企业微信负责确认“这个人是谁”,但不让企业微信直接决定“这个人在系统里能做什么”。权限仍然要回到部门、角色和系统用户上处理。这样集成不会把外部平台的身份体系直接侵入业务系统。
Token 和 Ticket 是运维边界
企业微信集成里很容易被忽略的一层,是 Access Token 和 JS-SDK Ticket。
我在实现时会把 Access Token 做缓存,并处理过期后的刷新。因为企业微信接口不是每次都能用一个固定密钥直接访问,很多能力都要先拿 token,再带 token 调用。token 过期、失效、刷新失败,都会变成真实业务里的不可用。
JS-SDK 也是类似问题。企业微信侧边栏、AgentConfig、页面内调用能力,都需要基于当前 URL、随机串、时间戳和 ticket 生成签名。这里如果把 URL、ticket 类型或缓存周期处理错,页面看起来是打开了,但关键能力会在企业微信环境里失败。
这些不是“写接口”的附属工作,而是企业微信集成的运维边界。对业务人员来说,他们只会感知到侧边栏能不能打开、客户信息能不能显示、登录是否稳定。对我来说,这背后是 token 缓存、ticket 刷新、签名计算和错误重试是否可靠。

侧边栏的价值是上下文
我最在意的不是企业微信侧边栏本身,而是它带来的上下文。
当业务人员在企业微信里和外部联系人沟通时,系统如果能从侧边栏拿到外部联系人的标识,再通过接口获取外部联系人信息,就可以尝试把这个触点和 CRM 里的客户记录关联起来。比如通过 unionid 找到已有客户,找不到时先建立一个基础客户记录,再让后续流程继续补全。
这个动作很小,但业务意义很大。
没有这一步,企业微信里的沟通只是聊天记录,CRM 里的客户只是后台数据。两边都存在,但没有关系。业务人员需要靠记忆把“这个聊天对象”和“后台哪个客户”对应起来,越到后期越容易混乱。
有了这一步,企业微信就不只是沟通工具,而是客户管理系统的一部分。业务人员在沟通场景里可以看到客户状态,系统也能知道这个客户在外部触点里继续发生了什么。
外部事件进入系统前必须可信
我后来抽过一个 Laravel 企业微信服务端接口包,里面处理过 OAuth、Access Token、回调消息的签名校验、AES 解密和 XML 解析。那个包现在已经比较旧了,我自己也标过需要重构,但它留下的经验很直接:外部事件进入系统前,必须先确认它可信。
企业微信回调不是普通表单提交。消息里会有签名、时间戳、随机串和加密内容。系统要用配置的 token 和 encoding key 校验签名,再解密内容,再确认接收方身份是否匹配。这里任何一步偷懒,都会让系统把不该信任的数据当成业务事实。
即使某个项目最终只用到登录、JS-SDK 或外部联系人查询,我也会把这些安全边界放在脑子里。因为一旦后续要接回调、消息、客户事件或更深的企业微信能力,系统不能临时再去补信任模型。
抽成包不是为了显得通用
我曾经把企业微信服务端能力抽成 Laravel 包,不是为了做一个“通用 SDK”的姿态,而是因为几个项目里反复出现同一类问题:配置发布、Facade 调用、Access Token 获取、OAuth 跳转、回调安全校验、异常处理。
这些能力如果每个项目都复制一遍,很容易出现细节不一致。有的项目 token 缓存时间不对,有的项目 state 校验不完整,有的项目错误处理不统一。抽成包至少能把这些共性边界放在一个地方。
但这个包后来也说明了另一件事:集成类代码会老化。企业微信 API、Laravel 版本、认证方式、实际项目的触点需求都会变化。一个旧包能留下经验,但不能永远代表最佳实现。对我来说,更重要的是从中形成判断:哪些能力适合抽象,哪些能力应该留在具体业务里,什么时候应该重构而不是继续堆兼容。
客户触点要回到业务系统
企业微信集成最后回到的不是技术问题,而是客户管理问题。
如果企业微信 OAuth 只解决登录,JS-SDK 只解决页面能力,侧边栏只解决展示,外部联系人只解决接口调用,那么这些功能还是散的。它们真正连起来,是因为它们都服务于同一个业务目标:让客户触点回到 CRM,成为可识别、可跟进、可管理的信息。
我现在看这类集成,会先问几个问题:
- 企业微信身份和系统用户的边界是否清楚?
- Token、Ticket、签名和过期刷新是否足够稳定?
- 侧边栏拿到的外部联系人能否关联到客户记录?
- 外部回调进入系统前是否完成签名校验和解密?
- 企业微信里的客户触点是否能进入后续跟进流程?
这些问题如果没有答案,企业微信集成很容易停留在“功能接上了”。真正有价值的集成,是让外部沟通场景进入客户管理系统,让业务人员少做人工对照,也让系统能更完整地理解客户关系。