OpenClaw 与 OnlyOffice 的集成主要涉及两个开源系统的对接,以下是详细的集成方法和步骤:

核心集成原理
OpenClaw 和 OnlyOffice 通过以下方式集成:
- 文档协同编辑:在 OpenClaw 中直接打开 OnlyOffice 编辑器
- 文件存储同步:文档修改后保存回 OpenClaw 存储系统
- 权限控制:基于 OpenClaw 的权限系统控制文档访问
前置条件准备
环境要求
# 网络要求:
- OpenClaw 可访问 OnlyOffice Document Server
- OnlyOffice 可回调 OpenClaw API
OnlyOffice Document Server 部署
# Docker 部署示例 docker run -i -t -d -p 8080:80 \ -e JWT_ENABLED=true \ -e JWT_SECRET=your_secret_key \ onlyoffice/documentserver
集成配置步骤
OpenClaw 端配置
修改配置文件 config/onlyoffice.php(如无则创建):
<?php
return [
'onlyoffice' => [
'enabled' => true,
'document_server_url' => env('ONLYOFFICE_DS_URL', 'http://onlyoffice:8080'),
'secret_key' => env('ONLYOFFICE_SECRET', 'your_secret_key'),
'callback_url' => env('APP_URL') . '/api/onlyoffice/callback',
// 文档类型映射
'file_types' => [
'docx' => 'text',
'xlsx' => 'spreadsheet',
'pptx' => 'presentation'
],
// 编辑器配置
'editor_config' => [
'lang' => 'zh-CN',
'mode' => 'edit' // edit/view
]
]
];
创建 OnlyOffice 服务类
// app/Services/OnlyOfficeService.php
namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class OnlyOfficeService
{
protected $config;
public function __construct()
{
$this->config = config('onlyoffice');
}
/**
* 生成编辑配置
*/
public function generateConfig($document, $user)
{
$key = $this->generateDocumentKey($document);
$callbackUrl = $this->config['callback_url'];
return [
"document" => [
"fileType" => pathinfo($document->name, PATHINFO_EXTENSION),
"key" => $key,
"title" => $document->name,
"url" => $this->getDocumentUrl($document),
"permissions" => [
"edit" => $this->canEdit($document, $user),
"download" => true,
"print" => true
]
],
"documentType" => $this->getDocumentType($document),
"editorConfig" => [
"callbackUrl" => $callbackUrl . '?key=' . $key,
"user" => [
"id" => $user->id,
"name" => $user->name
],
"lang" => "zh-CN",
"mode" => $this->canEdit($document, $user) ? "edit" : "view"
],
"token" => $this->generateJwtToken($key)
];
}
/**
* 验证回调签名
*/
public function verifyCallback($data, $signature)
{
$payload = json_encode($data);
$hash = hash_hmac('sha256', $payload, $this->config['secret_key']);
return hash_equals($hash, $signature);
}
// ... 其他辅助方法
}
添加路由和控制器
// routes/api.php
Route::prefix('onlyoffice')->group(function () {
Route::post('/config/{documentId}', 'OnlyOfficeController@getConfig');
Route::post('/callback', 'OnlyOfficeController@callback');
Route::get('/download/{documentId}', 'OnlyOfficeController@download');
});
// app/Http/Controllers/OnlyOfficeController.php
class OnlyOfficeController extends Controller
{
public function getConfig($documentId)
{
$document = Document::findOrFail($documentId);
$user = auth()->user();
$config = app(OnlyOfficeService::class)
->generateConfig($document, $user);
return response()->json($config);
}
public function callback(Request $request)
{
$data = $request->json()->all();
$signature = $request->header('X-OnlyOffice-Signature');
// 验证签名
if (!app(OnlyOfficeService::class)->verifyCallback($data, $signature)) {
return response()->json(['error' => 'Invalid signature'], 403);
}
// 处理文档保存
if (in_array($data['status'], [2, 3, 6])) { // 2-编辑中, 3-保存, 6-强制保存
$this->saveDocument($data);
}
return response()->json(['error' => 0]);
}
}
前端集成
<!-- resources/views/documents/show.blade.php -->
<div id="onlyoffice-editor"></div>
<script>
async function openOnlyOfficeEditor(documentId) {
const response = await fetch(`/api/onlyoffice/config/${documentId}`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${authToken}`,
'Content-Type': 'application/json'
}
});
const config = await response.json();
// 加载 OnlyOffice API
const script = document.createElement('script');
script.src = `${config.documentServerUrl}/web-apps/apps/api/documents/api.js`;
script.onload = () => {
new DocsAPI.DocEditor("onlyoffice-editor", config);
};
document.head.appendChild(script);
}
</script>
高级配置选项
JWT 安全配置
// .env 文件添加 ONLYOFFICE_DS_URL=http://your-onlyoffice-server:8080 ONLYOFFICE_SECRET=your-strong-secret-key ONLYOFFICE_JWT_ENABLED=true ONLYOFFICE_JWT_HEADER=Authorization
存储适配器配置
// 支持多种存储后端
'storage' => [
'driver' => 'local', // local, s3, minio, webdav
'path' => storage_path('app/documents'),
'url_prefix' => '/storage/documents'
]
自定义编辑器界面
const editorConfig = {
editorConfig: {
"customization": {
"forcesave": true,
"compactToolbar": false,
"reviewDisplay": "markup",
"toolbarNoTabs": false,
"zoom": 100
},
"embedded": {
"saveUrl": "/api/documents/save",
"embedUrl": "/api/documents/embed",
"fullscreenUrl": "/api/documents/fullscreen"
}
}
};
测试与调试
测试脚本
// tests/Feature/OnlyOfficeIntegrationTest.php
public function test_onlyoffice_integration()
{
$document = Document::factory()->create();
$user = User::factory()->create();
$response = $this->actingAs($user)
->postJson("/api/onlyoffice/config/{$document->id}");
$response->assertStatus(200)
->assertJsonStructure([
'document',
'documentType',
'editorConfig'
]);
}
调试工具
# 检查 OnlyOffice 服务状态 curl http://onlyoffice-server:8080/healthcheck # 查看日志 docker logs onlyoffice-documentserver tail -f /var/log/onlyoffice/documentserver/*.log
常见问题解决
网络连接问题
- 确保防火墙开放相应端口
- 检查跨域配置(CORS)
- 验证 SSL/TLS 证书(如使用 HTTPS)
文档保存失败
- 检查存储权限
- 验证回调 URL 可达性
- 确认 JWT 配置一致性
性能优化建议
- 启用文档缓存
- 配置负载均衡(多 OnlyOffice 实例)
- 使用 CDN 加速静态资源
扩展开发
插件机制
// 自定义文档处理器
interface DocumentProcessorInterface {
public function beforeOpen(Document $document);
public function afterSave(Document $document, $content);
}
Webhook 集成
// 支持第三方通知
Event::listen('document.updated', function ($document) {
// 发送 Webhook 通知
WebhookService::send('document_updated', $document);
});
注意事项
- 版本兼容性:确保 OpenClaw 和 OnlyOffice 版本兼容
- 安全配置:生产环境必须启用 JWT 和 HTTPS
- 备份策略:定期备份文档和配置
- 监控告警:设置服务监控和异常告警
这种集成方案实现了文档的在线预览、编辑和协同功能,可以根据具体需求进行扩展和定制。
标签: OpenClaw系统 已部署
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。