上个月帮一个哥们公司解决了个实际问题。他做咨询的,内部有一套自己开发的CRM系统,但合同文档管理一直是独立的另一个地方。每次查客户资料要打开两个系统,业务员抱怨很久了。
他问我能不能把云盘直接嵌进CRM里。我研究了一圈,发现主流企业云盘基本都支持开放API,实现起来没想象的复杂。
需求分析:到底要集成什么
在动手之前先搞清楚要集成哪些功能。不是所有功能都需要API,有些直接在iframe里嵌入就行了。
他们主要需要三个能力——
1. 从CRM直接上传合同文档到云盘的客户目录
2. 在CRM里直接预览云盘里的文档(不用跳转)
3. 给客户发一个云盘链接,不用再手动上传
这三个需求的实现难度完全不同。上传和链接生成用API就行,预览比较麻烦,涉及各种文档格式的在线预览。
上传功能:一次表单提交搞定
云盘的API上传逻辑都差不多:先获取一个上传地址(预签名URL),然后直接PUT文件上去,最后再调一个确认接口告诉云盘”我传完了”。
async function uploadContract(file, customerId) {
// 第一步:获取上传地址
const { uploadUrl, fileId } = await cloudDiskAPI.getUploadUrl({
filename: file.name,
size: file.size,
path: `/contracts/${customerId}/`
});
// 第二步:直接上传到云存储(绕过后端,性能更好)
await fetch(uploadUrl, {
method: 'PUT',
body: file,
headers: { 'Content-Type': file.type }
});
// 第三步:确认上传完成
await cloudDiskAPI.confirmUpload(fileId);
return fileId;
}
有个坑:上传地址有时效,一般5分钟就过期。如果文件比较大或者网络上比较慢,传完可能地址已经失效了。解决方案是分片上传,每片独立签名,单片失败只重传那一片。
文档预览:比想象中复杂
预览是最麻烦的部分。PDF还好说,很多云盘自带PDF预览器。但Word、Excel这些格式就麻烦了。
最省事的方案是让云盘生成一个预览链接,直接在iframe里打开。大多数云盘开放平台都提供这个功能,生成一个带token的预览URL,有效期可以设置,过期了重新申请就行。
但这里有个权限问题:预览链接相当于临时访问权限,如果token泄露别人也能看。所以一般要设置较短的过期时间,并且绑定来源域名(Referer检查)。
如果云盘没有在线预览能力,就要自己转格式。比如把Word转成PDF再预览,这个要后端做,涉及LibreOffice或者类似工具的集成。
外链分享:调一个接口就完事
这个最简单。调用云盘的分享API,传入文件ID和过期时间,返回一个分享链接。
async function createShareLink(fileId, expiresInDays = 7) {
const share = await cloudDiskAPI.createShare({
fileId,
password: '', // 可以设密码
expiresAt: Date.now() + expiresInDays * 24 * 60 * 60 * 1000,
permissions: ['preview', 'download']
});
return share.url;
}
但这里有个容易被忽视的问题:外链的权限范围。如果业务员给客户发的是”可下载”的链接,客户就能把合同下载到本地,后续如果发现合同有问题想撤回就麻烦了。更好的做法是给”仅预览”的链接,禁止下载,真需要下载要走审批流程。
认证和权限:最重要的一环
集成API第一件事是把认证搞清楚。企业云盘一般支持OAuth2或者API Key两种方式。
API Key最简单,但安全性差一些,适合内部系统集成。OAuth2适合需要给第三方应用授权的场景,实现稍微复杂但更安全。
还有个要注意的是权限穿透:CRM里的用户和云盘里的用户是两套体系。怎么对应?如果公司规模不大,可以手动建一个映射表。员工在CRM的账号ID对应他在云盘的账号ID,这样上传的文件自动归属正确的人。
如果公司大了,这种手动映射就不可行了,需要走SSO(单点登录),CRM和云盘都用同一套账号体系。
集成效果
最后帮他们落地的时候,实际上线的主要就是上传合同、生成外链这两个功能。预览他们最后没用,因为业务反馈跳转一下也能接受,没必要为了省这一步引入额外复杂度。
整个集成大概花了一周多,主要时间在调试签名和权限逻辑上,API本身文档写得挺清楚的。如果一开始就选型的时候就确认好云盘的API能力够不够,能省不少功夫。