完整的企业微信微盘API Java实现,支持创建目录、文件管理、权限设置等功能。
| 文件 | 说明 |
|---|---|
WeworkWediskAPI.java |
基础版本,实现核心的创建目录功能 |
WeworkWediskAdvanced.java |
高级版本,包含完整的文件管理功能 |
pom_wework.xml |
Maven依赖配置 |
- 登录企业微信管理后台
- 进入应用管理 → 自建应用 → 创建应用
- 获取以下信息:
- 企业ID(CorpID): 在"我的企业"页面查看
- 应用Secret: 在应用详情页面查看
在应用的API权限中,启用以下权限:
- ✅ 微盘管理权限
- ✅ 通讯录读取权限
# 将 pom_wework.xml 重命名为 pom.xml
mv pom_wework.xml pom.xml
# 安装依赖
mvn clean install在代码中替换以下配置:
String corpId = "your_corp_id"; // 替换为您的企业ID
String corpSecret = "your_corp_secret"; // 替换为应用Secret
String userId = "ZhangSan"; // 替换为实际用户ID# 运行基础版本
mvn exec:java -Dexec.mainClass="WeworkWediskAPI"
# 运行高级版本
mvn exec:java -Dexec.mainClass="WeworkWediskAdvanced"WeworkWediskAPI api = new WeworkWediskAPI(corpId, corpSecret);
String token = api.getAccessToken();String spaceId = api.createSpace(userId, "项目文档空间");String folderId = api.createFolder(userId, spaceId, spaceId, "技术文档");String lastFolderId = api.createMultiLevelFolder(
userId,
spaceId,
spaceId,
"项目管理/2026年/Q1季度/银行交易系统"
);Map<String, List<String>> structure = new LinkedHashMap<>();
structure.put("技术文档", Arrays.asList("前端开发", "后端开发", "数据库设计"));
structure.put("项目管理", Arrays.asList("需求文档", "设计文档", "测试报告"));
Map<String, String> folderIdMap = api.createFolderStructure(
userId, spaceId, spaceId, structure
);api.renameFile(userId, fileId, "新文件名");api.moveFile(userId, fileId, targetFatherId);api.deleteFile(userId, fileId);JsonObject fileInfo = api.getFileInfo(userId, fileId);
String fileName = fileInfo.get("file_name").getAsString();
int fileType = fileInfo.get("file_type").getAsInt();List<JsonObject> files = api.listFiles(userId, spaceId, fatherId);
for (JsonObject file : files) {
System.out.println(file.get("file_name").getAsString());
}// authType: 1=可查看, 2=可编辑, 3=可管理
api.addSpacePermission(spaceId, userId, 2);api.addFilePermission(fileId, userId, 2);- 接口:
GET /cgi-bin/gettoken - 参数:
corpid,corpsecret - 返回:
access_token,expires_in
- 接口:
POST /cgi-bin/wedrive/space_create - 参数:
{ "userid": "ZhangSan", "space_name": "空间名称" } - 返回:
spaceid
- 接口:
POST /cgi-bin/wedrive/file_create - 参数:
{ "userid": "ZhangSan", "spaceid": "space_id", "fatherid": "father_id", "file_type": 1, "file_name": "文件夹名称" } - file_type:
1=文件夹,2=文件 - 返回:
fileid
- 接口:
POST /cgi-bin/wedrive/file_rename - 参数:
{ "userid": "ZhangSan", "fileid": "file_id", "new_name": "新名称" }
- 接口:
POST /cgi-bin/wedrive/file_list - 参数:
{ "userid": "ZhangSan", "spaceid": "space_id", "fatherid": "father_id", "start": 0, "limit": 100 }
public class Example1 {
public static void main(String[] args) throws IOException {
WeworkWediskAPI api = new WeworkWediskAPI(corpId, corpSecret);
api.getAccessToken();
// 创建空间
String spaceId = api.createSpace("ZhangSan", "项目文档");
// 创建根目录
String projectId = api.createFolder("ZhangSan", spaceId, spaceId, "银行项目");
// 创建子目录
api.createFolder("ZhangSan", spaceId, projectId, "需求文档");
api.createFolder("ZhangSan", spaceId, projectId, "设计文档");
api.createFolder("ZhangSan", spaceId, projectId, "开发文档");
api.createFolder("ZhangSan", spaceId, projectId, "测试报告");
}
}public class Example2 {
public static void main(String[] args) throws IOException {
WeworkWediskAdvanced api = new WeworkWediskAdvanced(corpId, corpSecret);
api.getAccessToken();
String spaceId = api.createSpace("ZhangSan", "会议记录");
// 按年份组织
String year2026 = api.createFolder("ZhangSan", spaceId, spaceId, "2026年");
// 按季度组织
String q1 = api.createFolder("ZhangSan", spaceId, year2026, "Q1");
String q2 = api.createFolder("ZhangSan", spaceId, year2026, "Q2");
// 按月份组织
api.createFolder("ZhangSan", spaceId, q1, "01月");
api.createFolder("ZhangSan", spaceId, q1, "02月");
api.createFolder("ZhangSan", spaceId, q1, "03月");
}
}public class Example3 {
public static void main(String[] args) throws IOException {
WeworkWediskAdvanced api = new WeworkWediskAdvanced(corpId, corpSecret);
api.getAccessToken();
String spaceId = api.createSpace("ZhangSan", "技术部文档");
// 定义目录结构
Map<String, List<String>> structure = new LinkedHashMap<>();
structure.put("前端团队", Arrays.asList("React项目", "Vue项目", "小程序"));
structure.put("后端团队", Arrays.asList("Java服务", "Python服务", "Go服务"));
structure.put("运维团队", Arrays.asList("部署文档", "监控配置", "备份策略"));
structure.put("测试团队", Arrays.asList("测试用例", "自动化脚本", "性能测试"));
// 批量创建
api.createFolderStructure("ZhangSan", spaceId, spaceId, structure);
// 为团队成员设置权限
api.addSpacePermission(spaceId, "LiSi", 2); // 编辑权限
api.addSpacePermission(spaceId, "WangWu", 1); // 查看权限
}
}| errcode | 说明 | 解决方案 |
|---|---|---|
| 0 | 成功 | - |
| 40001 | 不合法的secret参数 | 检查corpSecret是否正确 |
| 40014 | 不合法的access_token | 重新获取access_token |
| 42001 | access_token已过期 | access_token有效期7200秒,需重新获取 |
| 44001 | 空的请求参数 | 检查必填参数是否传递 |
| 60011 | userid不存在 | 检查用户ID是否在企业通讯录中 |
| 93000 | 未找到空间 | 检查spaceId是否正确 |
| 93001 | 未找到文件 | 检查fileId是否正确 |
| 93002 | 空间已满 | 联系管理员扩容 |
| 93003 | 无权限 | 检查用户是否有对应操作权限 |
access_token有效期为 7200秒(2小时)- 建议实现token缓存机制,避免频繁请求
- 可以在token过期前提前刷新
// Token缓存示例
private long tokenExpireTime = 0;
public String getAccessToken() throws IOException {
if (System.currentTimeMillis() < tokenExpireTime) {
return this.accessToken; // 使用缓存的token
}
// 重新获取token
// ...
tokenExpireTime = System.currentTimeMillis() + 7000 * 1000; // 提前200秒刷新
return this.accessToken;
}- 企业微信API有调用频率限制
- 建议添加重试机制
- 批量操作时添加适当延迟
userid必须是企业通讯录中存在的成员- 在企业微信管理后台的"通讯录"中查看
spaceid: 创建空间后返回,用于后续所有操作fileid: 每个文件/文件夹的唯一标识- 在根目录创建文件时,
fatherid=spaceid
file_type=1: 文件夹file_type=2: 文件(需要通过上传接口上传)
// 使用线程池批量创建
ExecutorService executor = Executors.newFixedThreadPool(5);
for (String folderName : folderNames) {
executor.submit(() -> {
try {
api.createFolder(userId, spaceId, parentId, folderName);
} catch (IOException e) {
e.printStackTrace();
}
});
}
executor.shutdown();public String createFolderWithRetry(String userId, String spaceId,
String fatherId, String folderName) {
int maxRetries = 3;
for (int i = 0; i < maxRetries; i++) {
try {
return createFolder(userId, spaceId, fatherId, folderName);
} catch (IOException e) {
if (i == maxRetries - 1) throw e;
Thread.sleep(1000 * (i + 1)); // 指数退避
}
}
return null;
}// 使用HttpClient连接池(需要添加依赖)
CloseableHttpClient httpClient = HttpClients.custom()
.setMaxConnTotal(100)
.setMaxConnPerRoute(20)
.build();遇到问题可以:
- 查看企业微信官方文档
- 在企业微信开发者社区提问
- 联系企业微信技术支持
MIT License