企业微信(WeCom)作为企业级通讯与协作平台,提供了丰富的开放 API,支持企业自建应用、第三方应用和代开发应用。本文以考勤系统移动端应用为案例,全面讲解企业微信应用开发的技术要点,涵盖 API 对接、OAuth 认证、JS-SDK 集成、系统架构设计、核心功能实现、容器化部署等全流程,帮助研发人员快速上手。
一、企业微信应用开发概述
1.1 平台定位
企业微信开放平台为开发者提供了一套完整的 API 体系,覆盖通讯录管理、消息推送、OAuth 认证、JS-SDK、效率工具(打卡、审批、汇报)等能力。开发者可以基于这些 API 构建企业内部应用,也可以开发面向多企业的第三方应用。
1.2 应用类型
| 类型 | 适用场景 | 特点 |
|---|---|---|
| 自建应用 | 企业内部使用 | 仅本企业可见,配置灵活,API 权限由管理员分配 |
| 第三方应用 | 面向多企业提供服务 | 需通过企业微信审核,支持多企业授权安装 |
| 代开发应用 | 服务商代企业开发 | 企业授权给服务商,服务商代为开发和运维 |
本文以自建应用为主,这是最常见的开发场景。
1.3 开发模式
企业微信应用开发主要有两种模式:
H5 应用模式:在企业微信中打开网页应用,通过 OAuth 获取用户身份,通过 JS-SDK 调用原生能力(定位、拍照、扫码等)。适合快速开发、频繁更新的场景。
小程序模式:在企业微信中运行小程序,体验更接近原生,支持离线能力。适合对性能要求较高的场景。
考勤系统两种模式均可,本文以 H5 应用模式为主线讲解,同时说明小程序模式的关键差异。
二、开发环境搭建
2.1 注册与创建应用
- 访问 企业微信管理后台,注册企业微信
- 进入「应用管理」→「自建」→「创建应用」
- 填写应用名称、logo、可见范围(哪些部门/员工可用)
- 创建完成后获取三个关键参数:
| 参数 | 说明 | 获取位置 |
|---|---|---|
corpid |
企业唯一标识 | 我的企业 → 企业信息 → 企业ID |
agentid |
应用唯一标识 | 应用管理 → 自建应用 → AgentId |
secret |
应用密钥 | 应用管理 → 自建应用 → Secret |
2.2 配置可信域名
在企业微信管理后台配置「网页授权及JS-SDK」域名:
1 | 应用管理 → 自建应用 → 开发者接口 → 网页授权及JS-SDK |
域名必须满足:
- 支持 HTTPS(生产环境)
- 已通过 ICP 备案(中国大陆服务器)
- 能访问到校验文件
WW_verify_xxxx.txt
2.3 本地开发环境
本地开发需要解决 HTTPS 和域名验证问题:
1 | # 使用 ngrok 或 frp 进行内网穿透 |
开发阶段可以在企业微信后台配置可信域名为内网穿透地址,但需要注意 token 安全。
2.4 技术选型
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端 | Vue 3 + TypeScript + Vant | 移动端 UI 组件库 |
| 后端 | Java 17 + Spring Boot 3.x | RESTful API |
| 数据库 | PostgreSQL 16 | 主数据库 |
| 缓存 | Redis 7 | access_token 缓存、考勤规则缓存 |
| 部署 | Docker + Kubernetes | 容器化部署 |
| CI/CD | GitHub Actions / Jenkins | 自动构建部署 |
三、核心 API 对接
3.1 access_token 管理
access_token 是企业微信 API 的全局票据,所有 API 调用都需要携带。
获取接口:
1 | GET https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=CORPID&corpsecret=SECRET |
响应:
1 | { |
关键策略:
- 有效期 7200 秒(2 小时),需提前刷新
- 同一应用的有效 access_token 唯一,重复获取会使旧 token 失效
- 必须服务端获取,不能在前端直接调用(会暴露 secret)
- 建议使用 Redis 缓存,设置过期时间为 7100 秒(留 100 秒余量)
Spring Boot 实现:
1 |
|
3.2 OAuth2 网页授权
用户在企业微信中打开 H5 应用时,需要通过 OAuth2 获取用户身份。
授权流程:
1 | 用户点击应用入口 |
构造授权链接:
1 | https://open.weixin.qq.com/connect/oauth2/authorize |
| 参数 | 说明 |
|---|---|
appid |
企业的 corpid |
redirect_uri |
回调地址,必须在可信域名下,需 URL 编码 |
scope |
snsapi_base(静默授权,仅获取 userid)或 snsapi_privateinfo(获取详细信息) |
agentid |
应用 agentid |
state |
防 CSRF,原样返回 |
后端处理回调:
1 |
|
3.3 通讯录管理
通过通讯录 API 可以同步企业组织架构和员工信息。
获取部门列表:
1 | GET https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=TOKEN&id=0 |
获取部门成员详情:
1 | GET https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=TOKEN&department_id=1&fetch_child=1 |
响应示例:
1 | { |
定时同步策略:
1 |
|
3.4 消息推送
消息推送是企业微信应用的重要能力,可用于考勤提醒、审批通知等场景。
发送应用消息:
1 | POST https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=TOKEN |
文本消息:
1 | { |
文本卡片消息(推荐,可跳转到应用页面):
1 | { |
模板卡片消息(支持交互按钮):
1 | { |
Spring Boot 封装:
1 |
|
考勤系统架构设计
整体架构
1 | ┌─────────────────────────────────────────────────────────┐ |
技术选型
| 层级 | 技术 | 选型理由 |
|---|---|---|
| 前端 | Vue 3 + Vant 4 | 移动端 H5 优先,企业微信内置浏览器兼容性好 |
| 后端 | Java 17 + SpringBoot 3 | 企业级稳定性,丰富生态 |
| 数据库 | PostgreSQL 16 | JSON 字段支持灵活考勤规则,窗口函数适合报表统计 |
| 缓存 | Redis 7 | access_token 缓存、分布式锁(防重复打卡) |
| 对象存储 | MinIO | 打卡照片存储,自建方案,数据不外泄 |
| 容器 | Docker + K8s | 标准化部署,弹性伸缩 |
| CI/CD | GitHub Actions | 自动构建、测试、部署 |
数据库设计
1 | -- 考勤规则表 |
前端方案:Vue 3 + Vant 4
项目结构:
1 | attendance-h5/ |
企业微信 JS-SDK 封装:
1 | // src/composables/useWecom.ts |
核心功能实现
1. 用户认证与授权
考勤系统需要识别当前操作用户。整个认证流程如下:
1 | 用户打开H5 -> 企业微信OAuth2 -> 获取code -> 后端换userid -> 生成JWT -> 前端存储 |
后端 OAuth2 回调处理(SpringBoot):
1 |
|
企业微信服务封装:
1 |
|
2. 打卡功能实现
打卡是考勤系统的核心。需要验证位置、WiFi、拍照等多重条件。
后端打卡接口:
1 |
|
前端打卡页面(Vue 3):
1 | <!-- src/views/ClockIn.vue --> |
3. 考勤规则引擎
规则引擎负责判断每天是否需要打卡、何时打卡、迟到/早退如何计算。
1 | /** |
4. 定时任务
1 | /** |
5. 消息通知
通过企业微信 API 推送考勤通知:
1 |
|
部署方案
Docker 容器化
Dockerfile(后端):
1 | FROM eclipse-temurin:17-jre-alpine |
Dockerfile(前端):
1 | FROM node:20-alpine AS builder |
K8s 部署
后端 Deployment:
1 | apiVersion: apps/v1 |
Nginx 反向代理配置
1 | # /etc/nginx/conf.d/attendance.conf |
企业微信后台配置
在管理后台需要完成以下配置:
- 应用主页 URL:
https://attendance.company.com - 可信域名:
attendance.company.com(需上传域名归属校验文件) - OAuth2 回调域名:
attendance.company.com - 应用可见范围:选择需要使用考勤的部门
- 通讯录同步:配置通讯录同步 API,或使用通讯录回调
CI/CD 流水线
1 | # .github/workflows/attendance-deploy.yml |
安全与运维
安全要点
1. access_token 安全管理:
- access_token 绝不能暴露给前端
- 后端集中管理,使用 Redis 缓存(key 设 TTL=7000s)
- 多实例部署时通过 Redis 分布式锁防止并发刷新
2. 敏感配置分离:
1 | # application-prod.yml(不提交到 Git) |
3. API 安全:
- 所有接口需 JWT 认证(OAuth2 回调除外)
- 防重放:接口签名 + 时间戳校验
- 限流:基于 Redis 的滑动窗口限流
4. 数据安全:
- 打卡照片存储在内网 MinIO,不对外暴露
- 数据库定期备份(pg_dump 每日全量 + WAL 归档)
- 用户手机号等敏感字段加密存储
监控告警
1 | # Prometheus 监控指标 |
告警规则示例:
- access_token 获取失败 -> 立即告警(影响全局)
- 打卡接口 5xx 错误率 > 1% -> 告警
- 企业微信 API 调用失败率 > 5% -> 告警
- 定时任务执行失败 -> 告警
避坑指南
1. access_token 并发刷新
问题:多实例同时刷新 access_token,导致旧 token 失效,其他实例请求报错。
方案:使用 Redis 分布式锁:
1 | public String getAccessToken() { |
2. OAuth2 code 只能用一次
企业微信 OAuth2 的 code 只能使用一次,且 5 分钟内有效。如果用户刷新页面导致重复使用 code,会报错 40029。
方案:前端在回调页拿到 code 后立即调用后端换取 token,然后清除 URL 中的 code 参数:
1 | // 获取 code 后立即清除 URL 参数 |
3. JS-SDK 签名 URL 必须精确匹配
iOS 和 Android 对 JS-SDK 签名 URL 的处理不同:
- Android:使用当前页面 URL
- iOS:使用入口页 URL(第一次进入应用的 URL)
方案:
1 | // iOS 下使用入口 URL 进行签名 |
4. 打卡防作弊
- GPS 定位精度约 10-50 米,存在漂移,建议半径设为 100-300 米
- WiFi MAC 地址可被伪造,需结合位置验证
- 照片打卡可加入水印(时间+位置+设备指纹)
- 异常行为检测:频繁补卡、非工作日打卡、异地打卡等
5. 企业微信 API 频率限制
| API | 限制 |
|---|---|
| 获取 access_token | 同一企业每 5 分钟最多 1000 次 |
| 发送消息 | 每应用每分钟最多 200 次 |
| 通讯录读取 | 每天最多 10000 次 |
| 获取打卡数据 | 每天最多 1000 次 |
高频率调用需做缓存和批量处理。
总结
企业微信应用开发的核心在于理解 OAuth2 认证流程和 API 对接模式。以考勤系统为例,完整的技术栈包括:
- 前端:Vue 3 + Vant 4 移动端 H5,通过 JS-SDK 调用企业微信原生能力
- 后端:SpringBoot 3 REST API,集中管理 access_token 和业务逻辑
- 数据库:PostgreSQL 存储考勤规则和打卡记录,日汇总表加速报表查询
- 部署:Docker + K8s 容器化,Nginx 反向代理 + HTTPS
- 安全:JWT 认证、Redis 分布式锁、敏感配置环境变量注入
关键避坑点:access_token 并发刷新、OAuth2 code 一次性使用、JS-SDK 签名 URL iOS/Android 差异、API 频率限制。
官方文档:https://developer.work.weixin.qq.com/document/
本文以考勤系统为例,但企业微信应用开发的核心模式(OAuth2 认证 -> API 对接 -> JS-SDK 集成 -> 消息推送 -> 容器化部署)适用于所有类型的企业微信应用开发。